diff options
Diffstat (limited to 'pkg/lang/compiler/compiler.go')
| -rw-r--r-- | pkg/lang/compiler/compiler.go | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/pkg/lang/compiler/compiler.go b/pkg/lang/compiler/compiler.go index 0356411..b1fd961 100644 --- a/pkg/lang/compiler/compiler.go +++ b/pkg/lang/compiler/compiler.go @@ -197,7 +197,7 @@ func (comp *Compiler) compileExpr(t *code.Builder, expr ast.Expr) error { case ast.ExprKindFnLit: panic("not implemented") case ast.ExprKindArrayLit: - panic("not implemented") + return comp.compileArrayLitExpr(t, expr.Value.(ast.ExprArrayLit)) case ast.ExprKindIdent: return comp.compileIdentExpr(t, expr.Value.(ast.ExprIdent)) case ast.ExprKindIntLit: @@ -341,6 +341,28 @@ func (comp *Compiler) compileGroupExpr(t *code.Builder, expr ast.ExprGroup) erro return comp.compileExpr(t, expr.Value) } +func (comp *Compiler) compileArrayLitExpr(t *code.Builder, expr ast.ExprArrayLit) error { + t.AppendOp(code.OpPushArray) + arrayLocal := comp.scopes.DeclareTemporary() + + for _, value := range expr.Values { + t.AppendOp(code.OpGetLocal) + t.AppendInt(int64(arrayLocal)) + + t.AppendOp(code.OpGetMember) + t.AppendString("push") + + if err := comp.compileExpr(t, value); err != nil { + return err + } + + t.AppendOp(code.OpCall) + t.AppendInt(1) + } + + return nil +} + func (comp *Compiler) compileIdentExpr(t *code.Builder, expr ast.ExprIdent) error { symbol, ok := comp.scopes.Lookup(expr.Value.Value) if !ok { |
