From: Akim Demaille Date: Sun, 9 May 2010 21:58:50 +0000 (+0200) Subject: c++: use YYRHSLOC. X-Git-Tag: v2.7.90~680 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/bb9191dd311e4c6d80f8dd12c6a7ce9254404fbc c++: use YYRHSLOC. * data/lalr1.cc (YYRHSLOC): New. (YYLLOC_DEFAULT): Use it. * data/glr.cc: If location_type was user defined, do not include location.hh, and do not produce location.hh and position.hh. * tests/calc.at (YYLLOC_DEFAULT): Use YYRHSLOC. Check that glr.cc supports user defined location_type. * NEWS: Document this. --- diff --git a/ChangeLog b/ChangeLog index 724a1213..cea5f026 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2010-05-10 Akim Demaille + + c++: use YYRHSLOC. + * data/lalr1.cc (YYRHSLOC): New. + (YYLLOC_DEFAULT): Use it. + * data/glr.cc: If location_type was user defined, do not include + location.hh, and do not produce location.hh and position.hh. + * tests/calc.at (YYLLOC_DEFAULT): Use YYRHSLOC. + Check that glr.cc supports user defined location_type. + * NEWS: Document this. + 2010-05-07 Akim Demaille doc: fix typo. diff --git a/NEWS b/NEWS index 7097f3bd..cacdb770 100644 --- a/NEWS +++ b/NEWS @@ -3,10 +3,46 @@ Bison News * Changes in version ?.? (????-??-??): +** C++ parsers use YYRHSLOC + + Similarly to the C parsers, the C++ parsers now define the YYRHSLOC + macro and use it in the default YYLLOC_DEFAULT. You are encouraged + to use it. If, for instance, your location structure has "first" + and "last" members, instead of + + # define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first = (Rhs)[1].location.first; \ + (Current).last = (Rhs)[N].location.last; \ + } \ + else \ + { \ + (Current).first = (Current).last = (Rhs)[0].location.last; \ + } \ + while (false) + + use: + + # define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first = YYRHSLOC (Rhs, 1).first; \ + (Current).last = YYRHSLOC (Rhs, N).last; \ + } \ + else \ + { \ + (Current).first = (Current).last = YYRHSLOC (Rhs, 0).last; \ + } \ + while (false) + + ** Additional yylex/yyparse arguments The new directive %param declare additional argument to both yylex - and yyparse. The %lex-param, %parse-param, and %param directive + and yyparse. The %lex-param, %parse-param, and %param directives support one or more arguments. Instead of %lex-param {arg1_type *arg1} diff --git a/data/glr.cc b/data/glr.cc index feed669a..24b3fbbe 100644 --- a/data/glr.cc +++ b/data/glr.cc @@ -51,7 +51,8 @@ b4_defines_if([], [b4_fatal([b4_skeleton[: using %%defines is mandatory]])]) m4_include(b4_pkgdatadir/[c++.m4]) -m4_include(b4_pkgdatadir/[location.cc]) +b4_percent_define_ifdef([[location_type]], [], + [m4_include(b4_pkgdatadir/[location.cc])]) m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) @@ -226,7 +227,8 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++], #include #include #include -#include "location.hh" +]b4_percent_define_ifdef([[location_type]], [], + [[#include "location.hh"]])[ /* Using locations. */ #define YYLSP_NEEDED ]b4_locations_if([1], [0])[ diff --git a/data/lalr1.cc b/data/lalr1.cc index 7cb7db62..8094cccf 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -180,19 +180,20 @@ b4_namespace_close])[ If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ +#define YYRHSLOC(Rhs, K) ((Rhs)[K].location) #ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ -do { \ - if (N) \ - { \ - (Current).begin = (Rhs)[1].location.begin; \ - (Current).end = (Rhs)[N].location.end; \ - } \ - else \ - { \ - (Current).begin = (Current).end = (Rhs)[0].location.end; \ - } \ -} while (false) +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).begin = YYRHSLOC (Rhs, 1).begin; \ + (Current).end = YYRHSLOC (Rhs, N).end; \ + } \ + else \ + { \ + (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \ + } \ + while (false) #endif]])[ ]b4_namespace_open[ diff --git a/tests/calc.at b/tests/calc.at index 08ccbe41..5046d237 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -171,17 +171,17 @@ AT_SKEL_CC_IF( }; # define YYLLOC_DEFAULT(Current, Rhs, N) \ -do { \ - if (N) \ - { \ - (Current).first = (Rhs)[1].location.first; \ - (Current).last = (Rhs)[N].location.last; \ - } \ - else \ - { \ - (Current).first = (Current).last = (Rhs)[0].location.last; \ - } \ -} while (false) + do \ + if (N) \ + { \ + (Current).first = YYRHSLOC (Rhs, 1).first; \ + (Current).last = YYRHSLOC (Rhs, N).last; \ + } \ + else \ + { \ + (Current).first = (Current).last = YYRHSLOC (Rhs, 0).last; \ + } \ + while (false) ]])[ /* Exercise pre-prologue dependency to %union. */ @@ -716,6 +716,7 @@ m4_define([AT_CHECK_CALC_GLR_CC], [AT_CHECK_CALC([%language "C++" %glr-parser %defines %locations] $@)]) AT_CHECK_CALC_GLR_CC([]) +AT_CHECK_CALC_GLR_CC([%define location_type Span]) AT_CHECK_CALC_GLR_CC([%define parse.error verbose %name-prefix "calc" %verbose %yacc]) AT_CHECK_CALC_GLR_CC([%debug])