diff options
Diffstat (limited to 'parse.go')
-rw-r--r-- | parse.go | 34 |
1 files changed, 20 insertions, 14 deletions
@@ -24,7 +24,11 @@ func (t *tokens) consumeToken() (token, bool) { } func (t *tokens) unreadToken() { - t.index-- + t.unreadTokens(1) +} + +func (t *tokens) unreadTokens(n int) { + t.index -= n } func (t *tokens) current() token { @@ -396,32 +400,34 @@ func parseMutStmt(toks *tokens) (*mutStmt, error) { } 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 nameTok.kind != identifier { + toks.unreadToken() + return nil, nil + } - if err := toks.mustMatch(equals); err != nil { + ok, err := toks.match(equals) + if err != nil { return nil, err } + if !ok { + toks.unreadTokens(2) + return nil, nil + } expr, err := parseExpression(toks) if err != nil { return nil, err } - return &assignStmt{name: nameTok.value, value: expr, ln: line}, nil + return &assignStmt{ + name: nameTok.value, + value: expr, + ln: nameTok.line, + }, nil } func parseExpression(toks *tokens) (exprExpr, error) { |