parser.go: simplified the parser of the function parameters
This commit is contained in:
parent
f9ed5776cd
commit
0fdd51049d
71
parser.go
71
parser.go
@ -58,6 +58,57 @@ func (self *parser) parseFuncCall(scanner *scanner, allowVarRef bool, tk *Token)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) {
|
||||||
|
// // Example: "add = func(x,y) {x+y}
|
||||||
|
// var body *ast
|
||||||
|
// args := make([]*term, 0)
|
||||||
|
// lastSym := SymUnknown
|
||||||
|
// itemExpected := false
|
||||||
|
// tk := scanner.Previous()
|
||||||
|
// for lastSym != SymClosedRound && lastSym != SymEos {
|
||||||
|
// var subTree *ast
|
||||||
|
// if subTree, err = self.parseItem(scanner, true, SymComma, SymClosedRound); err == nil {
|
||||||
|
// if subTree.root != nil {
|
||||||
|
// if subTree.root.symbol() == SymIdentifier {
|
||||||
|
// args = append(args, subTree.root)
|
||||||
|
// } else {
|
||||||
|
// err = tk.ErrorExpectedGotString("param-name", subTree.root.String())
|
||||||
|
// }
|
||||||
|
// } else if itemExpected {
|
||||||
|
// prev := scanner.Previous()
|
||||||
|
// err = prev.ErrorExpectedGot("function-param")
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// lastSym = scanner.Previous().Sym
|
||||||
|
// itemExpected = lastSym == SymComma
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if err == nil && lastSym != SymClosedRound {
|
||||||
|
// err = tk.ErrorExpectedGot(")")
|
||||||
|
// }
|
||||||
|
// if err == nil {
|
||||||
|
// tk = scanner.Next()
|
||||||
|
// if tk.Sym == SymOpenBrace {
|
||||||
|
// body, err = self.parseGeneral(scanner, true, true, SymClosedBrace)
|
||||||
|
// } else {
|
||||||
|
// err = tk.ErrorExpectedGot("{")
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if err == nil {
|
||||||
|
// // TODO Check arguments
|
||||||
|
// if scanner.Previous().Sym != SymClosedBrace {
|
||||||
|
// err = scanner.Previous().ErrorExpectedGot("}")
|
||||||
|
// } else {
|
||||||
|
// tk = scanner.makeValueToken(SymExpression, "", body)
|
||||||
|
// tree = newFuncDefTerm(tk, args)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) {
|
func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) {
|
||||||
// Example: "add = func(x,y) {x+y}
|
// Example: "add = func(x,y) {x+y}
|
||||||
var body *ast
|
var body *ast
|
||||||
@ -66,20 +117,14 @@ func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) {
|
|||||||
itemExpected := false
|
itemExpected := false
|
||||||
tk := scanner.Previous()
|
tk := scanner.Previous()
|
||||||
for lastSym != SymClosedRound && lastSym != SymEos {
|
for lastSym != SymClosedRound && lastSym != SymEos {
|
||||||
var subTree *ast
|
tk = scanner.Next()
|
||||||
if subTree, err = self.parseItem(scanner, true, SymComma, SymClosedRound); err == nil {
|
if tk.IsSymbol(SymIdentifier) {
|
||||||
if subTree.root != nil {
|
param := newTerm(tk, nil)
|
||||||
if subTree.root.symbol() == SymIdentifier {
|
args = append(args, param)
|
||||||
args = append(args, subTree.root)
|
tk = scanner.Next()
|
||||||
} else {
|
|
||||||
err = tk.ErrorExpectedGotString("param-name", subTree.root.String())
|
|
||||||
}
|
|
||||||
} else if itemExpected {
|
} else if itemExpected {
|
||||||
prev := scanner.Previous()
|
prev := scanner.Previous()
|
||||||
err = prev.ErrorExpectedGot("function-param", prev)
|
err = prev.ErrorExpectedGot("function-param")
|
||||||
break
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
lastSym = scanner.Previous().Sym
|
lastSym = scanner.Previous().Sym
|
||||||
@ -91,7 +136,7 @@ func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) {
|
|||||||
}
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
tk = scanner.Next()
|
tk = scanner.Next()
|
||||||
if tk.Sym == SymOpenBrace {
|
if tk.IsSymbol(SymOpenBrace) {
|
||||||
body, err = self.parseGeneral(scanner, true, true, SymClosedBrace)
|
body, err = self.parseGeneral(scanner, true, true, SymClosedBrace)
|
||||||
} else {
|
} else {
|
||||||
err = tk.ErrorExpectedGot("{")
|
err = tk.ErrorExpectedGot("{")
|
||||||
|
Loading…
Reference in New Issue
Block a user