diff options
Diffstat (limited to 'parse.go')
-rw-r--r-- | parse.go | 28 |
1 files changed, 27 insertions, 1 deletions
@@ -801,6 +801,14 @@ func parsePrimary(toks *tokens) (primaryExpr, error) { return call, nil } + variable, err := parseVariable(toks) + if err != nil { + return nil, err + } + if variable != nil { + return variable, nil + } + return nil, expectedPrimary{got: toks.current()} } @@ -923,9 +931,14 @@ func parseCall(toks *tokens) (*callExpr, error) { return nil, nil } - if err := toks.mustMatch(lparen); err != nil { + ok, err := toks.match(lparen) + if err != nil { return nil, err } + if !ok { + toks.unreadTokens(2) + return nil, nil + } args, err := parseArg(toks) if err != nil { @@ -970,3 +983,16 @@ func parseArg(toks *tokens) (*argument, error) { return &argument{value: arg, next: next}, nil } + +func parseVariable(toks *tokens) (*varExpr, error) { + nameTok, ok := toks.consumeToken() + if !ok { + return nil, unexpectedEOF + } + if nameTok.kind != identifier { + toks.unreadToken() + return nil, nil + } + + return &varExpr{name: nameTok.value, ln: nameTok.line}, nil +} |