+2002-02-07 Robert Anisko <robert@lrde.epita.fr>
+
+ * 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 <robert@lrde.epita.fr>
* data/bison.c++: Fix m4 quoting in comments.
private:
+ virtual void error_ ();
+
/* Call to lexical analyser. */
- virtual
- void
- lex ()
- {
+ virtual
+ void
+ lex ()
+ {
looka = yylex (&value, &location);
}
int len;
int debug_;
int state;
-
+
/* Lookahead. */
int looka;
int ilooka;
-
+
+ /* Message. */
+ std::string message;
+
/* @$ and $$. */
SemanticType value;
LocationType location;
int
yy::b4_name::parse ()
{
+ int nerrs = 0;
+ int errstatus = 0;
+
/* Initialize stack. */
state_stack = StateStack (0);
semantic_stack = SemanticStack (1);
/* 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. */