From f58ec3ac3208d6b960de6f69461167a8199e8a5a Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Sun, 31 Mar 2024 06:38:46 +0200 Subject: [PATCH] parser: now checks whether the assign operator '=' is preceded by a variable --- parser.go | 8 ++++++++ parser_test.go | 3 +++ 2 files changed, 11 insertions(+) diff --git a/parser.go b/parser.go index ed266a3..ec7b127 100644 --- a/parser.go +++ b/parser.go @@ -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 } diff --git a/parser_test.go b/parser_test.go index 33888b2..5a9a982 100644 --- a/parser_test.go +++ b/parser_test.go @@ -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