Variable references belonging to the parent scope added ('@')
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user