added symbol '..' and '...'; improved some error reports in parser.go

This commit is contained in:
Celestino Amoroso 2024-05-04 18:47:00 +02:00
parent 2c5f02cc69
commit a2c0a24494
4 changed files with 36 additions and 15 deletions

View File

@ -72,11 +72,11 @@ func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) {
if subTree.root.symbol() == SymIdentifier { if subTree.root.symbol() == SymIdentifier {
args = append(args, subTree.root) args = append(args, subTree.root)
} else { } else {
err = tk.Errorf("exptected identifier, got %q", subTree.root) err = tk.ErrorExpectedGotString("param-name", subTree.root.String())
} }
} else if itemExpected { } else if itemExpected {
prev := scanner.Previous() prev := scanner.Previous()
err = prev.Errorf("expected function parameter, got %q", prev) err = prev.ErrorExpectedGot("function-param", prev)
break break
} }
} else { } else {
@ -87,18 +87,20 @@ func (self *parser) parseFuncDef(scanner *scanner) (tree *term, err error) {
} }
if err == nil && lastSym != SymClosedRound { if err == nil && lastSym != SymClosedRound {
err = tk.Errorf("unterminated function parameters list") err = tk.ErrorExpectedGot(")")
} }
if err == nil { if err == nil {
tk = scanner.Next() tk = scanner.Next()
if tk.Sym == SymOpenBrace { if tk.Sym == SymOpenBrace {
body, err = self.parseGeneral(scanner, true, true, SymClosedBrace) body, err = self.parseGeneral(scanner, true, true, SymClosedBrace)
} else {
err = tk.ErrorExpectedGot("{")
} }
} }
if err == nil { if err == nil {
// TODO Check arguments // TODO Check arguments
if scanner.Previous().Sym != SymClosedBrace { if scanner.Previous().Sym != SymClosedBrace {
err = scanner.Previous().Errorf("not properly terminated function body") err = scanner.Previous().ErrorExpectedGot("}")
} else { } else {
tk = scanner.makeValueToken(SymExpression, "", body) tk = scanner.makeValueToken(SymExpression, "", body)
tree = newFuncDefTerm(tk, args) tree = newFuncDefTerm(tk, args)
@ -118,7 +120,7 @@ func (self *parser) parseList(scanner *scanner, allowVarRef bool) (subtree *term
args = append(args, subTree.root) args = append(args, subTree.root)
} else if itemExpected { } else if itemExpected {
prev := scanner.Previous() prev := scanner.Previous()
err = prev.Errorf("expected list item, got %q", prev) err = prev.ErrorExpectedGot("list-item")
break break
} }
} else { } else {
@ -130,7 +132,7 @@ func (self *parser) parseList(scanner *scanner, allowVarRef bool) (subtree *term
if err == nil { if err == nil {
// TODO Check arguments // TODO Check arguments
if lastSym != SymClosedSquare { if lastSym != SymClosedSquare {
err = scanner.Previous().Errorf("unterminate items list") err = scanner.Previous().ErrorExpectedGot("]")
} else { } else {
subtree = newListTerm(args) subtree = newListTerm(args)
} }
@ -150,7 +152,7 @@ func (self *parser) parseIterDef(scanner *scanner, allowVarRef bool) (subtree *t
args = append(args, subTree.root) args = append(args, subTree.root)
} else if itemExpected { } else if itemExpected {
prev := scanner.Previous() prev := scanner.Previous()
err = prev.Errorf("expected iterator argument, got %q", prev) err = prev.ErrorExpectedGot("iterator-param")
break break
} }
} else { } else {
@ -162,7 +164,7 @@ func (self *parser) parseIterDef(scanner *scanner, allowVarRef bool) (subtree *t
if err == nil { if err == nil {
// TODO Check arguments // TODO Check arguments
if lastSym != SymClosedRound { if lastSym != SymClosedRound {
err = scanner.Previous().Errorf("unterminate iterator param list") err = scanner.Previous().ErrorExpectedGot(")")
} else { } else {
subtree = newIteratorTerm(tk, args) subtree = newIteratorTerm(tk, args)
} }
@ -182,12 +184,13 @@ func (self *parser) parseDictKey(scanner *scanner, allowVarRef bool) (key any, e
if tk.Sym == SymInteger || tk.Sym == SymString { if tk.Sym == SymInteger || tk.Sym == SymString {
tkSep := scanner.Next() tkSep := scanner.Next()
if tkSep.Sym != SymColon { if tkSep.Sym != SymColon {
err = tkSep.Errorf("expected \":\", got %q", tkSep) err = tkSep.ErrorExpectedGot(":")
} else { } else {
key = tk.Value key = tk.Value
} }
} else { } else {
err = tk.Errorf("expected dictionary key or closed brace, got %q", tk) // err = tk.Errorf("expected dictionary key or closed brace, got %q", tk)
err = tk.ErrorExpectedGot("dictionary-key or }")
} }
return return
} }
@ -205,7 +208,7 @@ func (self *parser) parseDictionary(scanner *scanner, allowVarRef bool) (subtree
tk := scanner.Previous() tk := scanner.Previous()
lastSym = tk.Sym lastSym = tk.Sym
if itemExpected { if itemExpected {
err = tk.Errorf("expected dictionary key, got %q", tk) err = tk.ErrorExpectedGot("dictionary-key")
} }
break break
} }
@ -214,7 +217,7 @@ func (self *parser) parseDictionary(scanner *scanner, allowVarRef bool) (subtree
args[key] = subTree.root args[key] = subTree.root
} else if key != nil { } else if key != nil {
prev := scanner.Previous() prev := scanner.Previous()
err = prev.Errorf("expected dictionary value, got %q", prev) err = prev.ErrorExpectedGot("dictionary-value")
break break
} }
} else { } else {
@ -226,7 +229,7 @@ func (self *parser) parseDictionary(scanner *scanner, allowVarRef bool) (subtree
if err == nil { if err == nil {
// TODO Check arguments // TODO Check arguments
if lastSym != SymClosedBrace { if lastSym != SymClosedBrace {
err = scanner.Previous().Errorf("unterminated dictionary") err = scanner.Previous().ErrorExpectedGot("}")
} else { } else {
subtree = newDictTerm(args) subtree = newDictTerm(args)
} }
@ -260,7 +263,7 @@ func (self *parser) parseSelectorCase(scanner *scanner, allowVarRef bool, defaul
return return
} }
} else { } else {
err = tk.Errorf("selector-case expected, got %q", tk.source) err = tk.ErrorExpectedGot("{")
} }
if err == nil { if err == nil {

View File

@ -160,6 +160,12 @@ func (self *scanner) fetchNextToken() (tk *Token) {
//} else if next == '/' { //} else if next == '/' {
if next, _ := self.peek(); next == '/' { if next, _ := self.peek(); next == '/' {
tk = self.moveOn(SymDotSlash, ch, next) tk = self.moveOn(SymDotSlash, ch, next)
} else if next == '.' {
if next1, _ := self.peek(); next1 == '.' {
tk = self.moveOn(SymTripleDot, ch, next, next1)
} else {
tk = self.moveOn(SymDoubleDot, ch, next)
}
} else { } else {
tk = self.makeToken(SymDot, ch) tk = self.makeToken(SymDot, ch)
} }

View File

@ -65,6 +65,8 @@ const (
SymDollarRound // 54: '$(' SymDollarRound // 54: '$('
SymOpenClosedRound // 55: '()' SymOpenClosedRound // 55: '()'
SymDoubleDollar // 56: '$$' SymDoubleDollar // 56: '$$'
SymDoubleDot // 57: '..'
SymTripleDot // 58: '...'
SymChangeSign SymChangeSign
SymUnchangeSign SymUnchangeSign
SymIdentifier SymIdentifier

View File

@ -46,7 +46,7 @@ func NewValueToken(row, col int, sym Symbol, source string, value any) *Token {
func NewErrorToken(row, col int, err error) *Token { func NewErrorToken(row, col int, err error) *Token {
if err == io.EOF { if err == io.EOF {
return NewToken(row, col, SymEos, "") return NewToken(row, col, SymEos, "<EOF>")
} }
return NewValueToken(row, col, SymError, fmt.Sprintf("[%d:%d]", row, col), err) return NewValueToken(row, col, SymError, fmt.Sprintf("[%d:%d]", row, col), err)
} }
@ -81,3 +81,13 @@ func (self *Token) Errors(msg string) (err error) {
err = fmt.Errorf("[%d:%d] %v", self.row, self.col, msg) err = fmt.Errorf("[%d:%d] %v", self.row, self.col, msg)
return return
} }
func (self *Token) ErrorExpectedGot(symbol string) (err error) {
err = fmt.Errorf("[%d:%d] expected %q, got %q", self.row, self.col, symbol, self)
return
}
func (self *Token) ErrorExpectedGotString(symbol, got string) (err error) {
err = fmt.Errorf("[%d:%d] expected %q, got %q", self.row, self.col, symbol, got)
return
}