parser: now checks whether the assign operator '=' is preceded by a variable
This commit is contained in:
parent
28e3b2f741
commit
f58ec3ac32
@ -76,6 +76,7 @@ func (self *parser) parseList(scanner *scanner) (tree *term, err error) {
|
||||
func (self *parser) parse(scanner *scanner, termSymbols ...Symbol) (tree *ast, err error) {
|
||||
tree = NewAst()
|
||||
firstToken := true
|
||||
lastSym := SymUnknown
|
||||
for tk := scanner.Next(); err == nil && tk != nil && !tk.IsTerm(termSymbols); tk = scanner.Next() {
|
||||
if tk.Sym == SymComment {
|
||||
continue
|
||||
@ -112,9 +113,16 @@ func (self *parser) parse(scanner *scanner, termSymbols ...Symbol) (tree *ast, e
|
||||
if listTerm, err = self.parseList(scanner); err == nil {
|
||||
err = tree.addTerm(listTerm)
|
||||
}
|
||||
case SymEqual:
|
||||
if lastSym == SymIdentifier {
|
||||
err = tree.addToken(tk)
|
||||
} else {
|
||||
err = fmt.Errorf(`assign operator (%q) must be preceded by a variable`, tk.source)
|
||||
}
|
||||
default:
|
||||
err = tree.addToken(tk)
|
||||
}
|
||||
lastSym = tk.Sym
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -128,6 +128,9 @@ func TestParser(t *testing.T) {
|
||||
/* 101 */ {`false or (x==2)`, nil, errors.New(`undefined variable "x"`)},
|
||||
/* 102 */ {`a=5; a`, int64(5), nil},
|
||||
/* 103 */ {`a=5; b=2; add(a, b*3)`, int64(11), nil},
|
||||
/* 104 */ {`2=5`, nil, errors.New(`assign operator ("=") must be preceded by a variable`)},
|
||||
/* 105 */ {`2+a=5`, nil, errors.New(`left operand of "=" must be a variable`)},
|
||||
/* 106 */ {`2+(a=5)`, int64(7), nil},
|
||||
}
|
||||
succeeded := 0
|
||||
failed := 0
|
||||
|
Loading…
Reference in New Issue
Block a user