Syntax error reporting in calc

This commit is contained in:
Robin Jadoul 2017-01-28 15:55:57 +01:00
parent c26510bdef
commit a93d4427e2
3 changed files with 10 additions and 18 deletions

View File

@ -1,20 +1,5 @@
parser: LALR(1) parser: LALR(1)
terminals: lexesis: calcLexer.lxs
"NUM"
"COMMA"
"FN"
"LPAREN"
"RPAREN"
"SEMICOLON"
"ARROW"
"IDENT"
"PLUS"
"MINUS"
"TIMES"
"DIVIDE"
"EXPONENT"
"ASSIGN"
precedence: precedence:
right "EXPONENT" right "EXPONENT"
left "TIMES" "DIVIDE" left "TIMES" "DIVIDE"
@ -29,10 +14,11 @@ grammar:
<toplevel> ::= <toplevel_expr> "SEMICOLON" [toplevel] <toplevel> ::= <toplevel_expr> "SEMICOLON" [toplevel]
| <functiondef> "SEMICOLON" [toplevel] | <functiondef> "SEMICOLON" [toplevel]
| <assign> "SEMICOLON" [toplevel] | <assign> "SEMICOLON" [toplevel]
| <error> "SEMICOLON" [toplevel] | <toplevel_error> "SEMICOLON" [toplevel]
; ;
<toplevel_expr> ::= <expr> [toplevel]; <toplevel_expr> ::= <expr> [toplevel];
<toplevel_error> ::= <error> [toplevel];
<expr> ::= <expr> "PLUS" <expr> [binop] <expr> ::= <expr> "PLUS" <expr> [binop]
| <expr> "MINUS" <expr> [binop] | <expr> "MINUS" <expr> [binop]

View File

@ -24,10 +24,15 @@ Parser::Token Parser::lex() {
} }
catch (CalcLexer::NoMatch) { catch (CalcLexer::NoMatch) {
std::cerr << "Syntax error: unrecognized token" << std::endl; std::cerr << "Syntax error: unrecognized token" << std::endl;
m_lex.skip(1);
} }
} }
} }
Parser::Value Parser::error(Token, const std::vector<calcParser_Symbol>&) {
return nullptr;
}
Parser::Value Parser::reduce_toplevel(std::deque<Token> subparts) { Parser::Value Parser::reduce_toplevel(std::deque<Token> subparts) {
if (subparts.empty()) return nullptr; if (subparts.empty()) return nullptr;
if (subparts[0].symbol == calcParser_Symbol::V_expr) { if (subparts[0].symbol == calcParser_Symbol::V_expr) {

View File

@ -19,6 +19,7 @@ class Parser : public calcParser<std::unique_ptr<AST>> {
protected: protected:
using Value = std::unique_ptr<AST>; using Value = std::unique_ptr<AST>;
Token lex() override; Token lex() override;
Value error(Token current, const std::vector<calcParser_Symbol>& expected) override;
Value reduce_arguments(std::deque<Token> subparts) override; Value reduce_arguments(std::deque<Token> subparts) override;
Value reduce_assign(std::deque<Token> subparts) override; Value reduce_assign(std::deque<Token> subparts) override;
Value reduce_binop(std::deque<Token> subparts) override; Value reduce_binop(std::deque<Token> subparts) override;