From 882f02ed8383e5dc0d2122d72a77143acd9d3607 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Wed, 31 Dec 2008 16:13:04 +0100 Subject: [PATCH] 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. --- ChangeLog | 11 +++++++++++ examples/variant.yy | 18 +++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index bf243128..6f8df1a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 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. * data/c++.m4 (b4_symbol_constructor_declare) (b4_symbol_constructor_define): New empty stubs. 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 -- 2.11.4.GIT