Variable references belonging to the parent scope added ('@')

This commit is contained in:
2024-04-04 12:54:26 +02:00
parent 8c3254a8f2
commit d073d11ad3
8 changed files with 94 additions and 36 deletions
+20 -14
View File
@@ -22,7 +22,7 @@ func NewParser(ctx exprContext) (p *parser) {
return p
}
func (self *parser) parseFuncCall(scanner *scanner, tk *Token) (tree *term, err error) {
func (self *parser) parseFuncCall(scanner *scanner, allowVarRef bool, tk *Token) (tree *term, err error) {
// name, _ := tk.Value.(string)
// funcObj := self.ctx.GetFuncInfo(name)
// if funcObj == nil {
@@ -38,7 +38,7 @@ func (self *parser) parseFuncCall(scanner *scanner, tk *Token) (tree *term, err
lastSym := SymUnknown
for lastSym != SymClosedRound && lastSym != SymEos {
var subTree *ast
if subTree, err = self.parseItem(scanner, SymComma, SymClosedRound); err == nil {
if subTree, err = self.parseItem(scanner, allowVarRef, SymComma, SymClosedRound); err == nil {
if subTree.root != nil {
args = append(args, subTree.root)
}
@@ -79,13 +79,13 @@ func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) {
if err == nil {
tk = scanner.Next()
if tk.Sym == SymOpenBrace {
body, err = self.parseGeneral(scanner, true, SymClosedBrace)
body, err = self.parseGeneral(scanner, true, true, SymClosedBrace)
}
}
if err == nil {
// TODO Check arguments
if scanner.Previous().Sym != SymClosedBrace {
err = scanner.Previous().Errorf("unterminate function body")
err = scanner.Previous().Errorf("not properly terminated function body")
} else {
tk = scanner.makeValueToken(SymExpression, "", body)
tree = newFuncDefTerm(tk, args)
@@ -94,12 +94,12 @@ func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) {
return
}
func (self *parser) parseList(scanner *scanner) (tree *term, err error) {
func (self *parser) parseList(scanner *scanner, allowVarRef bool) (tree *term, err error) {
args := make([]*term, 0)
lastSym := SymUnknown
for lastSym != SymClosedSquare && lastSym != SymEos {
var subTree *ast
if subTree, err = self.parseItem(scanner, SymComma, SymClosedSquare); err == nil {
if subTree, err = self.parseItem(scanner, allowVarRef, SymComma, SymClosedSquare); err == nil {
if subTree.root != nil {
args = append(args, subTree.root)
}
@@ -120,14 +120,14 @@ func (self *parser) parseList(scanner *scanner) (tree *term, err error) {
}
func (self *parser) parse(scanner *scanner, termSymbols ...Symbol) (tree *ast, err error) {
return self.parseGeneral(scanner, true, termSymbols...)
return self.parseGeneral(scanner, true, false, termSymbols...)
}
func (self *parser) parseItem(scanner *scanner, termSymbols ...Symbol) (tree *ast, err error) {
return self.parseGeneral(scanner, false, termSymbols...)
func (self *parser) parseItem(scanner *scanner, allowVarRef bool, termSymbols ...Symbol) (tree *ast, err error) {
return self.parseGeneral(scanner, false, allowVarRef, termSymbols...)
}
func (self *parser) parseGeneral(scanner *scanner, allowForset bool, termSymbols ...Symbol) (tree *ast, err error) {
func (self *parser) parseGeneral(scanner *scanner, allowForest bool, allowVarRef bool, termSymbols ...Symbol) (tree *ast, err error) {
tree = NewAst()
firstToken := true
lastSym := SymUnknown
@@ -137,7 +137,7 @@ func (self *parser) parseGeneral(scanner *scanner, allowForset bool, termSymbols
}
if tk.Sym == SymSemiColon {
if allowForset {
if allowForest {
tree.ToForest()
continue
} else {
@@ -159,18 +159,18 @@ func (self *parser) parseGeneral(scanner *scanner, allowForset bool, termSymbols
switch tk.Sym {
case SymOpenRound:
var subTree *ast
if subTree, err = self.parse(scanner, SymClosedRound); err == nil {
if subTree, err = self.parseGeneral(scanner, false, allowVarRef, SymClosedRound); err == nil {
subTree.root.priority = priValue
tree.addTerm(subTree.root)
}
case SymFuncCall:
var funcCallTerm *term
if funcCallTerm, err = self.parseFuncCall(scanner, tk); err == nil {
if funcCallTerm, err = self.parseFuncCall(scanner, allowVarRef, tk); err == nil {
err = tree.addTerm(funcCallTerm)
}
case SymOpenSquare:
var listTerm *term
if listTerm, err = self.parseList(scanner); err == nil {
if listTerm, err = self.parseList(scanner, allowVarRef); err == nil {
err = tree.addTerm(listTerm)
}
case SymEqual:
@@ -182,6 +182,12 @@ func (self *parser) parseGeneral(scanner *scanner, allowForset bool, termSymbols
if funcDefTerm, err = self.parseFuncDef(scanner); err == nil {
err = tree.addTerm(funcDefTerm)
}
case SymIdentifier:
if tk.source[0] == '@' && !allowVarRef {
err = tk.Errorf("variable references are not allowed in top level expressions: %q", tk.source)
} else {
err = tree.addToken(tk)
}
default:
err = tree.addToken(tk)
}