diff options
Diffstat (limited to 'pkg/lang/compiler/compiler.go')
| -rw-r--r-- | pkg/lang/compiler/compiler.go | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/pkg/lang/compiler/compiler.go b/pkg/lang/compiler/compiler.go index 728dec1..ad37ded 100644 --- a/pkg/lang/compiler/compiler.go +++ b/pkg/lang/compiler/compiler.go @@ -3,6 +3,7 @@ package compiler import ( "fmt" "jinx/pkg/lang/ast" + "jinx/pkg/lang/compiler/scope" "jinx/pkg/lang/vm/code" ) @@ -11,14 +12,14 @@ type Compiler struct { funcs []*code.Builder - scopes ScopeChain + scopes scope.ScopeChain } func New(ast ast.Program) *Compiler { return &Compiler{ ast: ast, funcs: make([]*code.Builder, 0), - scopes: NewScopeChain(), + scopes: scope.NewScopeChain(), } } @@ -114,7 +115,7 @@ func (comp *Compiler) compileFnDeclStmt(t *code.Builder, fnDeclStmt ast.StmtFnDe symbol := comp.scopes.GetFunction(symbolID) - marker = symbol.data.marker + marker = symbol.Data().Marker() } else { return fmt.Errorf("function %s already declared", fnDeclStmt.Name.Value) } @@ -382,8 +383,8 @@ func (comp *Compiler) compileForInStmt(t *code.Builder, forInStmt ast.StmtForIn) func (comp *Compiler) compileReturnStmt(t *code.Builder, returnStmt ast.StmtReturn) error { // Check that we are in fact in a function functionScope := comp.scopes.CurrentFunction() - if functionScope.data.(ScopeFunction).IsRootScope() { - return fmt.Errorf("can't return when not inside a function" + functionScope.data.(ScopeFunction).unit.String()) + if functionScope.IsRootScope() { + return fmt.Errorf("can't return when not inside a function") } if returnStmt.Value.IsEmpty() { @@ -491,8 +492,8 @@ func (comp *Compiler) compileAssignExpr(t *code.Builder, expr ast.ExprBinary) er return fmt.Errorf("variable %s not declared", name) } - if symbolId.symbolKind != SymbolKindVariable { - return fmt.Errorf("can't assign to a %v", symbolId.symbolKind) + if symbolId.SymbolKind() != scope.SymbolKindVariable { + return fmt.Errorf("can't assign to a %v", symbolId.SymbolKind()) } symbol := comp.scopes.GetVariable(symbolId) @@ -502,7 +503,7 @@ func (comp *Compiler) compileAssignExpr(t *code.Builder, expr ast.ExprBinary) er } t.AppendOp(code.OpSetLocal) - t.AppendInt(int64(symbol.data.localIndex)) + t.AppendInt(int64(symbol.Data().LocalIndex())) return nil } @@ -587,24 +588,24 @@ func (comp *Compiler) compileIdentExpr(t *code.Builder, expr ast.ExprIdent) erro } // TODO: Add other ways how the symbol should be fetched. (local, env, global, etc.) - switch symbolId.symbolKind { - case SymbolKindVariable: + switch symbolId.SymbolKind() { + case scope.SymbolKindVariable: symbol := comp.scopes.GetVariable(symbolId) t.AppendOp(code.OpGetLocal) - t.AppendInt(int64(symbol.data.localIndex)) - case SymbolKindFunction: + t.AppendInt(int64(symbol.Data().LocalIndex())) + case scope.SymbolKindFunction: symbol := comp.scopes.GetFunction(symbolId) t.AppendOp(code.OpPushFunction) - t.AppendMarkerReference(symbol.data.marker) + t.AppendMarkerReference(symbol.Data().Marker()) - if symbol.data.args != 0 { + if symbol.Data().Args() != 0 { t.AppendOp(code.OpSetArgCount) - t.AppendInt(int64(symbol.data.args)) + t.AppendInt(int64(symbol.Data().Args())) } default: - panic(fmt.Errorf("unknown symbol kind: %v", symbolId.symbolKind)) + panic(fmt.Errorf("unknown symbol kind: %v", symbolId.SymbolKind())) } return nil |
