diff --git a/ChangeLog b/ChangeLog index bf243128..6f8df1a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2009-03-02 Akim Demaille + + Use locations in the variant example. + Yes, this obfuscates the point of this example, variants only. But glr.cc + cannot work (yet?) without locations. This change makes it easier to use + this example with glr.cc. + + * examples/variant.yy (assert): %define it. + (locations): Request them. + (yylex): Bind the location to the stage. + 2009-03-02 Akim Demaille Dub make_TOKEN as a public type interface. diff --git a/examples/variant.yy b/examples/variant.yy index fe5dce0f..8471e6e8 100644 --- a/examples/variant.yy +++ b/examples/variant.yy @@ -1,8 +1,10 @@ %debug %skeleton "lalr1.cc" %defines +%define assert %define variant %define lex_symbol +%locations %code requires // *.hh { @@ -85,26 +87,28 @@ yy::parser::symbol_type yylex () { static int stage = -1; - switch (++stage) + ++stage; + yy::parser::location_type loc(0, stage + 1, stage + 1); + switch (stage) { case 0: - return yy::parser::make_TEXT ("I have three numbers for you."); + return yy::parser::make_TEXT ("I have three numbers for you.", loc); case 1: case 2: case 3: - return yy::parser::make_NUMBER (stage); + return yy::parser::make_NUMBER (stage, loc); case 4: - return yy::parser::make_TEXT ("And that's all!"); + return yy::parser::make_TEXT ("And that's all!", loc); default: - return yy::parser::make_END_OF_FILE (); + return yy::parser::make_END_OF_FILE (loc); } } // Mandatory error function void -yy::parser::error (const std::string& message) +yy::parser::error (const yy::parser::location_type& loc, const std::string& msg) { - std::cerr << message << std::endl; + std::cerr << loc << ": " << msg << std::endl; } int