+2009-03-02 Akim Demaille <demaille@gostai.com>
+
+ 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 <demaille@gostai.com>
Dub make_TOKEN as a public type interface.
%debug
%skeleton "lalr1.cc"
%defines
+%define assert
%define variant
%define lex_symbol
+%locations
%code requires // *.hh
{
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