diff options
Diffstat (limited to 'parse.go')
-rw-r--r-- | parse.go | 37 |
1 files changed, 37 insertions, 0 deletions
@@ -326,6 +326,14 @@ func parseDeclaration(toks *tokens) (declStmt, error) { return mutable, nil } + assignment, err := parseAssignStmt(toks) + if err != nil { + return nil, err + } + if assignment != nil { + return assignment, nil + } + return nil, nil } @@ -387,6 +395,35 @@ func parseMutStmt(toks *tokens) (*mutStmt, error) { return &mutStmt{name: nameTok.value, initial: expr, ln: line}, nil } +func parseAssignStmt(toks *tokens) (*assignStmt, error) { + ok, err := toks.match(assign) + if err != nil { + return nil, err + } + if !ok { + toks.unreadToken() + return nil, nil + } + + line := toks.current().line + + nameTok, ok := toks.consumeToken() + if !ok { + return nil, unexpectedEOF + } + + if err := toks.mustMatch(equals); err != nil { + return nil, err + } + + expr, err := parseExpression(toks) + if err != nil { + return nil, err + } + + return &assignStmt{name: nameTok.value, value: expr, ln: line}, nil +} + func parseExpression(toks *tokens) (exprExpr, error) { return parseEquality(toks) } |