From 4bb2bc3f61feb703947d4919396ccc6cdc9f61b5 Mon Sep 17 00:00:00 2001 From: Robert Anisko Date: Thu, 7 Feb 2002 11:35:40 +0000 Subject: [PATCH] * data/bison.c++ (yy::b4_name::error_): New method, replaces yyerror in C++ parsers. (yy::b4_name::parse): Build verbose error messages, and use error_. --- ChangeLog | 6 ++++++ data/bison.c++ | 54 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 30f36ac1..15424ae5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2002-02-07 Robert Anisko + + * data/bison.c++ (yy::b4_name::error_): New method, replaces yyerror in + C++ parsers. + (yy::b4_name::parse): Build verbose error messages, and use error_. + 2002-02-06 Robert Anisko * data/bison.c++: Fix m4 quoting in comments. diff --git a/data/bison.c++ b/data/bison.c++ index e5c283db..2d2e2ed9 100644 --- a/data/bison.c++ +++ b/data/bison.c++ @@ -80,11 +80,13 @@ namespace yy private: + virtual void error_ (); + /* Call to lexical analyser. */ - virtual - void - lex () - { + virtual + void + lex () + { looka = yylex (&value, &location); } @@ -124,11 +126,14 @@ namespace yy int len; int debug_; int state; - + /* Lookahead. */ int looka; int ilooka; - + + /* Message. */ + std::string message; + /* @$ and $$. */ SemanticType value; LocationType location; @@ -169,6 +174,9 @@ b4_tokendef int yy::b4_name::parse () { + int nerrs = 0; + int errstatus = 0; + /* Initialize stack. */ state_stack = StateStack (0); semantic_stack = SemanticStack (1); @@ -333,7 +341,39 @@ yy::b4_name::parse () /* Report and recover from errors. This is very incomplete. */ yyerrlab: - std::cerr << "Parse error." << std::endl; // FIXME: Need something like yyerror? + /* If not already recovering from an error, report this error. */ + if (!errstatus) + { + ++nerrs; + + // FIXME: Should be #if YYERROR_VERBOSE from here... + n = pact_[[state]]; + if (n > b4_flag && n < b4_last) + { + message = "parse error, unexpected "; + message += name_[[ilooka]]; + { + int count = 0; + for (int x = (n < 0 ? -n : 0); x < b4_ntokens + b4_nnts; ++x) + if (check_[[x + n]] == x) + ++count; + if (count < 5) + { + count = 0; + for (int x = (n < 0 ? -n : 0); x < b4_ntokens + b4_nnts; ++x) + if (check_[[x + n]] == x) + { + message += (!count++) ? ", expecting " : " or "; + message += name_[[x]]; + } + } + } + } + else + // FIXME: to there... + message = "parse error"; + } + error_ (); return 1; /* Accept. */ -- 2.45.2