From f08878aceddb07057f8d423b05918433d63c5cdc Mon Sep 17 00:00:00 2001 From: Emiel Bruijntjes Date: Thu, 16 Dec 2021 11:39:22 +0100 Subject: [PATCH] simplified handling of syntax errors, the old code made assumptions about how lemon was internally implemented, that were no longer true for later versions of Lemon --- src/parser.lemon | 13 +------------ src/tokenprocessor.h | 19 ++----------------- 2 files changed, 3 insertions(+), 29 deletions(-) diff --git a/src/parser.lemon b/src/parser.lemon index 0d2fb17..ae65c45 100644 --- a/src/parser.lemon +++ b/src/parser.lemon @@ -50,18 +50,7 @@ %syntax_error { - // Build up a vector of expected tokens - // Mostly based on the following SO post, but we instead put it in a std::vector - // https://stackoverflow.com/questions/11705737/expected-token-using-lemon-parser-generator/13010096#13010096 - std::vector expectedTokens; - - // we loop over all known tokens, if we exceed our defined tokens we exit - // our last defined token is TOKEN_STRING, so we halt when we go past it - for (int i = 0; i <= TOKEN_STRING; ++i) { - int a = yy_find_shift_action(yypParser, (YYCODETYPE)i); - if (a < YYNSTATE + YYNRULE) expectedTokens.emplace_back(yyTokenName[i]); - } - parent->syntaxError(expectedTokens); + parent->syntaxError(); } %stack_overflow diff --git a/src/tokenprocessor.h b/src/tokenprocessor.h index 8ac6931..7b56355 100644 --- a/src/tokenprocessor.h +++ b/src/tokenprocessor.h @@ -88,25 +88,10 @@ class TokenProcessor /** * This will get called by lemon in case of a syntax error */ - void syntaxError(const std::vector &expectedTokens) + void syntaxError() { + // remember that we're in syntax error state _error.append("Syntax error"); - - // If we have any expected tokens append them to the error - if (expectedTokens.empty() == false) - { - _error.append(", expected one of the following tokens ["); - - for (auto iter = expectedTokens.begin(); iter != expectedTokens.end(); ++iter) - { - _error.append(*iter); - - // for every token that is not our last token (end iter - 1) we append a space for readability - if (iter != expectedTokens.end() - 1) _error.push_back(' '); - } - - _error.push_back(']'); - } } /**