about summary refs log tree commit diff
path: root/pkg/lang/compiler/compiler.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/lang/compiler/compiler.go')
-rw-r--r--pkg/lang/compiler/compiler.go24
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 {