From 0fdd51049dbf40475065eb7c10fc1f8a27a81122 Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Sat, 4 May 2024 19:10:02 +0200 Subject: [PATCH] parser.go: simplified the parser of the function parameters --- parser.go | 75 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/parser.go b/parser.go index f23a009..0fa42aa 100644 --- a/parser.go +++ b/parser.go @@ -58,6 +58,57 @@ func (self *parser) parseFuncCall(scanner *scanner, allowVarRef bool, tk *Token) 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) { // Example: "add = func(x,y) {x+y} var body *ast @@ -66,20 +117,14 @@ func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) { 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", prev) - break - } - } else { + tk = scanner.Next() + if tk.IsSymbol(SymIdentifier) { + param := newTerm(tk, nil) + args = append(args, param) + tk = scanner.Next() + } else if itemExpected { + prev := scanner.Previous() + err = prev.ErrorExpectedGot("function-param") break } lastSym = scanner.Previous().Sym @@ -91,7 +136,7 @@ func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) { } if err == nil { tk = scanner.Next() - if tk.Sym == SymOpenBrace { + if tk.IsSymbol(SymOpenBrace) { body, err = self.parseGeneral(scanner, true, true, SymClosedBrace) } else { err = tk.ErrorExpectedGot("{")