aboutsummaryrefslogtreecommitdiff
path: root/generate.go
diff options
context:
space:
mode:
Diffstat (limited to 'generate.go')
-rw-r--r--generate.go26
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 {