diff options
Diffstat (limited to 'generate.go')
-rw-r--r-- | generate.go | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/generate.go b/generate.go index 511ce05..187ec8f 100644 --- a/generate.go +++ b/generate.go @@ -80,7 +80,7 @@ func generateToplevel(toplevel expression, w io.Writer) error { } func generateFunction(function *functionExpr, w io.Writer) error { - if isDeclared(function.name, true) { + if ok, _ := isDeclared(function.name, true); ok { return errAlreadyDeclared{name: function.name, line: function.line()} } @@ -126,6 +126,8 @@ func generateStatement(stmt statementExpr, w io.Writer) error { return generateConstStmt(s, false, w) case *mutStmt: return generateMutStmt(s, false, w) + case *assignStmt: + return generateAssignStmt(s, w) } return nil @@ -143,7 +145,7 @@ func generateReturnStmt(stmt *returnStmt, w io.Writer) error { } func generateConstStmt(stmt *constStmt, toplevel bool, w io.Writer) error { - if isDeclared(stmt.name, toplevel) { + if ok, _ := isDeclared(stmt.name, toplevel); ok { return errAlreadyDeclared{name: stmt.name, line: stmt.line()} } @@ -159,7 +161,7 @@ func generateConstStmt(stmt *constStmt, toplevel bool, w io.Writer) error { } func generateMutStmt(stmt *mutStmt, toplevel bool, w io.Writer) error { - if isDeclared(stmt.name, toplevel) { + if ok, _ := isDeclared(stmt.name, toplevel); ok { return errAlreadyDeclared{name: stmt.name, line: stmt.line()} } @@ -175,6 +177,24 @@ func generateMutStmt(stmt *mutStmt, toplevel bool, w io.Writer) error { return nil } +func generateAssignStmt(stmt *assignStmt, w io.Writer) error { + ok, mutable := isDeclared(stmt.name, false) + if !ok { + return errUndeclared{name: stmt.name, line: stmt.line()} + } + if !mutable { + return errImmutable{name: stmt.name, line: stmt.line()} + } + + value, err := stmt.value.generate(w) + if err != nil { + return err + } + + fmt.Fprintf(w, "storew %s, %%%s\n", value, stmt.name) + return nil +} + func (e *equalityExpr) generate(w io.Writer) (string, error) { lhs, err := e.lhs.generate(w) if err != nil { |