aboutsummaryrefslogtreecommitdiff
path: root/parse.go
diff options
context:
space:
mode:
Diffstat (limited to 'parse.go')
-rw-r--r--parse.go34
1 files changed, 20 insertions, 14 deletions
diff --git a/parse.go b/parse.go
index a9c7b9d..7b4469e 100644
--- a/parse.go
+++ b/parse.go
@@ -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) {