added symbol '..' and '...'; improved some error reports in parser.go
This commit is contained in:
		
							parent
							
								
									2c5f02cc69
								
							
						
					
					
						commit
						a2c0a24494
					
				
							
								
								
									
										31
									
								
								parser.go
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								parser.go
									
									
									
									
									
								
							| @ -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 { | ||||||
|  | |||||||
| @ -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) | ||||||
| 			} | 			} | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								token.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								token.go
									
									
									
									
									
								
							| @ -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 | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user