From: Akim Demaille Date: Tue, 31 Jul 2012 09:50:18 +0000 (+0200) Subject: Merge branch 'maint' X-Git-Tag: v2.7.90~368 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/cb9ec4fada480554cf47810fee736997d64e7427?hp=aaf63e45b65d35bb506e431ffa8360f259ee393c Merge branch 'maint' * maint: use obstack_printf scanner: restore a missing start condition gnulib: update maint: post-release administrivia version 2.6.1 gnulib: update maint: fix some syntax-check issues tests: do not depend on __cplusplus to decide for C++ or C output Conflicts: NEWS bootstrap.conf cfg.mk lib/.gitignore --- diff --git a/ChangeLog-2012 b/ChangeLog-2012 index 789e7605..5a8f3cd5 100644 --- a/ChangeLog-2012 +++ b/ChangeLog-2012 @@ -1,30 +1,32 @@ -2012-01-15 Jim Meyering +2012-01-15 Akim Demaille + + java: fix reduction traces. + * data/lalr1.java (yy_reduce_print): Fix state index. + Reported by Tim Landscheidt. + +2012-01-12 Jim Meyering + + build: avoid warning from coverity about lbitset_elt_find + * lib/lbitset.c (lbitset_elt_find): Remove unnecessary test of "elt", + at a point where we know it is non-NULL, due to prior dereference. + +2012-01-13 Jim Meyering maint: get fdl.texi from gnulib * bootstrap.conf (gnulib_modules): Add fdl. * doc/fdl.texi: Remove file. * doc/.gitignore: Add it here. -2012-01-15 Jim Meyering - maint: spell "file system" as two separate words * doc/Doxyfile.in: Spell it "file system", to avoid a "make syntax-check" failure. -2012-01-15 Jim Meyering - maint: avoid "the the" * djgpp/README.in: s/the the/the/ * src/parse-gram.c (lloc_default): Likewise. * src/parse-gram.y (lloc_default): Likewise, and remove a trailing space. -2012-01-13 Jim Meyering - - build: avoid warning from coverity about lbitset_elt_find - * lib/lbitset.c (lbitset_elt_find): Remove unnecessary test of "elt", - at a point where we know it is non-NULL, due to prior dereference. - 2012-01-13 Akim Demaille maint: factor copyright year. @@ -54,6 +56,12 @@ * lib/ebitset.c (ebitset_init): Likewise, for "size". * lib/lbitset.c (lbitset_not): Likewise, for "elt". +2011-08-21 Joel E. Denny + + lalr1.cc: remove trailing comma from enumerator list. + * data/lalr1.cc (yy::parser): Here. This suppresses a -pedantic + warning. + 2011-08-21 Joel E. Denny tests: add -pedantic for --enable-gcc-warnings. @@ -75,6 +83,22 @@ * tests/existing.at (GNU Cim Grammar) (GNU pic (Groff 1.18.1) Grammar.): Remove empty %union. +2011-07-24 Joel E. Denny + + global: remove unnecessary horizontal tabs. + This change was made by applying emacs' untabify function to + nearly all files in Bison's repository. Required tabs in make + files, ChangeLog, regexps, and test code were manually skipped. + Other notable exceptions and changes are listed below. + * bootstrap: Skip because we sync this with gnulib. + * data/m4sugar/foreach.m4 + * data/m4sugar/m4sugar.m4: Skip because we sync these with + Autoconf. + * djgpp: Skip because I don't know how to test djgpp properly, and + this code appears to be unmaintained anyway. + * README-hacking (Hacking): Specify that tabs should be avoided + where not required. + 2011-07-10 Joel E. Denny build: avoid YACC typo inherited from Autoconf. @@ -184,18 +208,6 @@ * tests/regression.at (Token number in precedence declaration): Extend. -2011-05-01 Joel E. Denny - - Prepare for 2.5 release. - * NEWS (2.5_rc1): Rename back to... - (2.5): ... this, and unset date. - -2011-05-01 Joel E. Denny - - Version 2.5_rc1. - * NEWS (2.5): Rename to... - (2.5_rc1): ... this, and set date. - 2011-05-01 Joel E. Denny Pacify -DGNULIB_POSIXCHECK. @@ -204,7 +216,7 @@ * src/files.c (file_name_split) * src/getargs.c (getargs) * src/location.c (boundary_set_from_string) - * src/output.c (token_definitions_output, output_skeleton) + * src/output.c (output_skeleton) * src/parse-gram.y (prologue_declaration) * src/scan-gram.l (handle_syncline) * src/symtab.c (symbol_new): Use mbschr and mbsrchr instead of @@ -356,12 +368,6 @@ * NEWS (2.5): Document fix for -Wno-CATEGORY. -2008-11-21 Di-an Jan - - Implement no-XXX arguments for --warnings, --report, --trace. - * src/getargs.c (flags_argmatch): Handles no-XXX. - Fix typo in doxygen comment. - 2011-03-20 Joel E. Denny doc: fix confusing citation of LAC publication. @@ -476,16 +482,17 @@ lr.keep-unreachable-states, lr.type, and parse.lac into brief summaries, and cross-reference the appropriate subsections of Tuning LR. For parse.lac, mention that it's only implemented for - deterministic parsers in C. - (Error Reporting): When mentioning %error-verbose, mention LAC, + deterministic parsers in C. In parse.error entry, mention LAC, and add cross-reference to the LAC section. + (Error Reporting): When mentioning parse.error, mention LAC, and + add cross-reference to the LAC section. (Tuning LR): New section with an extended version of the documentation removed from %define Summary. Change all cross-references in the manual to point here instead of there. - (Calc++ Parser): When mentioning %error-verbose, mention LAC, and - add cross-reference to the LAC section. - (Table of Symbols): In %error-verbose and YYERROR_VERBOSE entries, - add cross-references to Error Reporting. + (Calc++ Parser): When mentioning parse.error, mention LAC, and add + cross-reference to the LAC section. + (Table of Symbols): In %error-verbose entry, add cross-reference + to Error Reporting. (Glossary): Capitalize entry titles consistently. Add definitions for "defaulted state" and "unreachable state". Expand IELR acronym in IELR's entry. @@ -518,13 +525,14 @@ reversed access to location stack. * THANKS (Bernd Kiefer): Add. -2010-05-11 Akim Demaille +2011-02-13 Joel E. Denny - doc: please Emacs. - * doc/bison.texinfo (Local Variables): Move this after the - LocalWords, since the latter are looked for in the whole document, - while the former are looked for only at its end. - Require american spell checking. + doc: fix some minor inconsistencies. + * doc/bison.texinfo (%define Summary): Fix mislabeled entry for + lex_symbol. + (%code Summary): For consistency with the variable list in the + %define Summary, enclose the list of %code qualifiers in a table + instead of an itemize. 2011-02-06 Joel E. Denny @@ -809,7 +817,7 @@ is requested. * tests/conflicts.at (%nonassoc and eof): Extend to check the effect of each of -Dlr.type=canonical-lr and -Dparse.lac=full. - (%error-verbose and consistent errors): Likewise. + (parse.error=verbose and consistent errors): Likewise. (LAC: %nonassoc requires splitting canonical LR states): New test group demonstrating how LAC can fix canonical LR. * tests/input.at (LAC: Errors for %define): New test group. @@ -825,18 +833,6 @@ * bootstrap.conf (bootstrap_sync): Set to true. * gnulib: Update to latest so bootstrap is in sync now. -2010-11-07 Joel E. Denny - - yysyntax_error: adjust prior fixes for branch-2.5's lalr1.cc. - On master, there is no yychar in lalr1.cc, but there is on - branch-2.5, and the prior cherry-pick of "Fix handling of yychar - manipulation in user semantic actions" wasn't adjusted for that - difference. - * data/lalr1.cc (yy::parser::parse): Translate yychar before - every use of yytoken, and add comments explaining this approach. - * tests/conflicts.at (%error-verbose and consistent errors): - Extend to test yychar manipulation with lalr1.cc. - 2010-11-07 Joel E. Denny yysyntax_error: fix for consistent error with lookahead. @@ -854,14 +850,14 @@ * data/glr.c (yyreportSyntaxError): As in yacc.c, don't drop the unexpected token unless there actually is no lookahead. * data/lalr1.cc (yy::parser::parse): If there's no lookahead, - set yytoken to yyempty_ before invoking yysyntax_error_. + pass yyempty_ not yyla.type to yysyntax_error_. (yy::parser::yysyntax_error_): Again, don't drop the unexpected token unless there actually is no lookahead. * data/lalr1.java (YYParser::parse): If there's no lookahead, set yytoken to yyempty_ before invoking yysyntax_error. (YYParser::yysyntax_error): Again, don't drop the unexpected token unless there actually is no lookahead. - * tests/conflicts.at (%error-verbose and consistent + * tests/conflicts.at (parse.error=verbose and consistent errors): Extend test group to further reveal how the previous use of the simple "syntax error" message was too general. Test yacc.c, glr.c, lalr1.cc, and lalr1.java. No longer an expected @@ -879,7 +875,7 @@ There are no behavioral changes here. * data/glr.c (yyreportSyntaxError): Reorganize. * data/lalr1.cc (yy::parser::yysyntax_error_): Reorganize. - * tests/conflicts.at (%error-verbose and consistent errors): + * tests/conflicts.at (parse.error=verbose and consistent errors): Reorganize. 2010-11-07 Joel E. Denny @@ -892,6 +888,11 @@ * data/lalr1.java (YYParser::yysyntax_error): Reindent. * data/yacc.c (yysyntax_error): Reindent. +2010-10-31 Joel E. Denny + + Fix memory leak. + * src/output.c (prepare_rules): Free temporary array. + 2010-10-31 Joel E. Denny yysyntax_error: improve invocation readability. @@ -947,9 +948,32 @@ out of storage? If not, we can omit malloc-gnu; but for now I left it in to be safe. (vc_ignore): Remove. + (gnulib_mk_hook): New function. * README-hacking: Renamed from HACKING, since gnulib bootstrap now uses that convention. +2010-09-09 Paul Hilfinger + + * data/glr.c (yySymbol): Define as int to avoid compiler warnings about + possible change of value. + +2010-09-08 Paul Hilfinger + + * data/glr.c (yy_reduce_print): Change yyrhsVals to yyvsp to remove + compiler errors when using %debug. + Add declaration of yylow when locations in use to avoid compilation + error. + (yyglrReduce): Conditionalize message "Parse ... rejected by rule..." + on whether we are in split mode, for consistency with behavior of + non-GLR parsing. + +2010-09-01 Akim Demaille + + Address GCC warnings about shadowed local variables (yyflag). + * data/glr.c (YYCHK): Rename yyflag as yychk_flag. + (yyprocessOneStack): Reduce the scope of yyaction, yyconflicts, + yyrule, and yyflag. + 2010-08-05 Joel E. Denny Version 2.4.3. @@ -1004,6 +1028,14 @@ * po/POTFILES.in: Add remaining gnulib files that have translatable strings. +2010-07-25 Joel E. Denny + + build: fix our adjustments for gnulib files in lib. + * configure.ac: For prepending lib/ to the values of config + variables, fix detection of empty values. Also, due to recent + gnulib changes, add LIBUNISTRING_UNITYPES_H and + LIBUNISTRING_UNIWIDTH_H to the list of those variables. + 2010-07-25 Joel E. Denny maint: use announce-gen's new --mail-headers. @@ -1020,6 +1052,61 @@ (Output files: -dv >&-): Skip test group if running maintainer-check-valgrind. +2010-07-23 Paul Hilfinger + + * NEWS: Describe new semantic-predicate feature. + * data/c.m4 (b4_predicate_case): New definition. + * data/java.m4 (b4_predicate_case): New definition. + * data/glr.c (yyimmediate): Add definition. + (yydoAction): Remove comment, now obsolete. + Do YY_REDUCE_PRINT here. + (yyglrReduce): Alter comment to indicate that semantic values + need not be deferred. + Remove YY_REDUCE_PRINT from here; done in yydoAction. + (yyprocessOneStack): Pass immediate flag. + Delete stacks rejected by predicates in newly split-off parsers. + Change handling of yyerr so that only current stack gets deleted + when semantic predicate fails. + (yyfillin): Don't crash if a semantic value is unresolved (as may + happen in predicate rules). + Copy lr state as well in debugging mode. + Update comment on setting of yysval to include yyloc as well. + (yy_reduce_print): Add yynormal argument. Perform fillin properly. + Report unresolved RHS values. + (yyimmediate): New table. + * src/gram.h (struct rule): Add is_predicate field. + * src/output.c (user_actions_output): Use b4_predicate_case for + predicates. + (prepare_symbols): Output yyimmediate. + * src/scan-gram.l: Add %? token, SC_PREDICATE state. + * src/scan-code.l (code_props_rule_action_init): Add is_predicate + argument. + * src/scan-code.h (struct code_props): Add is_predicate field. + (code_props_rule_action_init): New interface. + * src/parse-gram.y (%?{...}): New token. + (rhs): Add %?{...} rule. + * src/parse-gram.c: Regenerate. + * src/parse-gram.h: Regenerate. + * src/reader.c (grammar_current_rule_action_append): Add + immediate argument. + (grammar_midrule_action): Use new interface for + code_props_rule_action_init. + (grammar_current_rule_action_append): Ditto. + (packgram): Transfer is_predicate value. + * src/reader.h (grammar_current_rule_action_append): New interface. + * doc/bison.texinfo: Document semantic predicates (%?). + + * data/glr.c (yylhsNonterm, yyisDefaultedState,yyDefaultAction) + (yygetLRActions,yynewGLRStackItem,yyaddDeferredAction,yyinitStateSet) + (yyinitGLRStack,yyexpandGLRStack,yyupdateSplit,yymarkStackDeleted) + (yyundeleteLastStack,yyglrShift,yyglrShiftDefer,yydoAction,yyglrReduce) + (yyidenticalOptions,yymergeOptionSets,yyresolveStates,yyresolveAction) + (yyresolveLocations,yyresolveValue,yyreducePrint): Update parameter + names in comments and mention all parameters. + (struct yyGLRState): Fix description of yyposn field. + (yyresolveLocations): Correct comment so as not to imply action when + yyn1==0. + 2010-06-17 Paul Eggert Update from GFDL GFDL 1.2 to 1.3. @@ -1027,8 +1114,6 @@ * doc/fdl.texi: Update to version 1.3, taken from: http://www.gnu.org/licenses/fdl.texi -2010-06-17 Paul Eggert - Do not use date ranges in copyright notices. See http://www.gnu.org/prep/maintain/maintain.html#Copyright-Notices @@ -1038,23 +1123,23 @@ * data/README, data/bison.m4, data/c++-skel.m4, data/c++.m4: * data/c-skel.m4, data/c.m4, data/glr.c, data/glr.cc: * data/java-skel.m4, data/java.m4, data/lalr1.cc: - * data/lalr1.java, data/location.cc: - * data/xslt/bison.xsl: + * data/lalr1.java, data/local.mk, data/location.cc: + * data/stack.hh, data/variant.hh, data/xslt/bison.xsl: * data/xslt/xml2dot.xsl, data/xslt/xml2text.xsl: * data/xslt/xml2xhtml.xsl, data/yacc.c, djgpp/Makefile.maint: * djgpp/README.in, djgpp/config.bat, djgpp/config.sed: * djgpp/config.site, djgpp/config_h.sed, djgpp/djunpack.bat: - * djgpp/subpipe.c, djgpp/subpipe.h: - * djgpp/testsuite.sed, doc/bison.texinfo: - * doc/refcard.tex, etc/README, etc/bench.pl.in: + * djgpp/local.mk, djgpp/subpipe.c, djgpp/subpipe.h: + * djgpp/testsuite.sed, doc/bison.texinfo, doc/local.mk: + * doc/refcard.tex, etc/README, etc/bench.pl.in, etc/local.mk: * examples/calc++/Makefile.am, examples/extexi: - * lib/abitset.c, lib/abitset.h: + * examples/local.mk, lib/abitset.c, lib/abitset.h: * lib/bbitset.h, lib/bitset.c, lib/bitset.h: * lib/bitset_stats.c, lib/bitset_stats.h, lib/bitsetv-print.c: * lib/bitsetv-print.h, lib/bitsetv.c, lib/bitsetv.h: * lib/ebitset.c, lib/ebitset.h, lib/get-errno.c: * lib/get-errno.h, lib/lbitset.c, lib/lbitset.h: - * lib/libiberty.h, lib/main.c, lib/timevar.c: + * lib/libiberty.h, lib/local.mk, lib/main.c, lib/timevar.c: * lib/timevar.def, lib/timevar.h, lib/vbitset.c: * lib/vbitset.h, lib/yyerror.c, m4/bison-i18n.m4: * m4/c-working.m4, m4/cxx.m4, m4/subpipe.m4, m4/timevar.m4: @@ -1066,7 +1151,7 @@ * src/derives.c, src/derives.h, src/files.c, src/files.h: * src/flex-scanner.h, src/getargs.c, src/getargs.h: * src/gram.c, src/gram.h, src/graphviz.c, src/ielr.c: - * src/ielr.h, src/lalr.c, src/lalr.h: + * src/ielr.h, src/lalr.c, src/lalr.h, src/local.mk: * src/location.c, src/location.h, src/main.c: * src/muscle-tab.c, src/muscle-tab.h, src/named-ref.c: * src/named-ref.h, src/nullable.c, src/nullable.h: @@ -1083,13 +1168,10 @@ * tests/calc.at, tests/conflicts.at, tests/cxx-type.at: * tests/existing.at, tests/glr-regression.at: * tests/headers.at, tests/input.at, tests/java.at: - * tests/local.at, tests/named-refs.at: + * tests/local.at, tests/local.mk, tests/named-refs.at: * tests/output.at, tests/push.at, tests/reduce.at: * tests/regression.at, tests/sets.at, tests/skeletons.at: * tests/synclines.at, tests/testsuite.at, tests/torture.at: - * data/Makefile.am, data/location.cc, doc/Makefile.am, src/Makefile.am: - * tests/Makefile.am, lib/Makefile.am, examples/Makefile.am: - * etc/Makefile.am: Don't use date ranges in copyright notices. 2010-05-11 Akim Demaille @@ -1100,7 +1182,24 @@ sections. * NEWS (2.5): Document this. -2010-05-07 Akim Demaille +2010-05-11 Akim Demaille + + doc: please Emacs. + * doc/bison.texinfo (Local Variables): Move this after the + LocalWords, since the latter are looked for in the whole document, + while the former are looked for only at its end. + Require american spell checking. + +2010-05-10 Akim Demaille + + doc: fix lalr1.cc documentation. + * doc/bison.texinfo (C++ Scanner Interface): Fix yylex signature. + (C++ Bison Interface): Fix lalr1.cc skeleton name. + (C++ Parser Interface): Fix semantic_type and location_type names. + Document yy::parser::token. + Reported by Jerry Quinn. + +2010-05-10 Akim Demaille c++: use YYRHSLOC. * data/lalr1.cc (YYRHSLOC): New. @@ -1111,28 +1210,45 @@ Check that glr.cc supports user defined location_type. * NEWS: Document this. -2010-05-10 Akim Demaille +2010-05-07 Akim Demaille - doc: fix lalr1.cc documentation. - * doc/bison.texinfo (C++ Scanner Interface): Fix yylex signature. - (C++ Bison Interface): Fix lalr1.cc skeleton name. - (C++ Parser Interface): Fix semantic_type and location_type names. - Document yy::parser::token. - Reported by Jerry Quinn. + doc: fix typo. + * tests/synclines.at: here. + +2010-05-04 Akim Demaille + + tests: enhance AT_SYNCLINES_COMPILE. + * tests/synclines.at (AT_SYNCLINES_COMPILE): More distcc patterns. + (AT_TEST_SYNCLINE): Remove GCC 4.5 protection which is already + taken care of in AT_SYNCLINES_COMPILE. 2010-05-04 Akim Demaille lalr1.cc: don't generate location.hh when location_type is defined - * data/bison.m4 (b4_percent_define_use): New. - (b4_percent_define_get): Use it. - Accept a default value. + * data/bison.m4 (b4_percent_define_get): Accept a default value. * data/c++.m4: Do not provide a default value for the %define variable location_type, rather, use b4_percent_define_get with a default argument where its value is needed. * data/lalr1.cc: Do not load location.cc (which outputs both location.hh and position.hh) if the user defined location_type. Do not include location.hh either. - * data/glr.cc: Likewise. + +2010-05-04 Akim Demaille + + lalr1.cc: minor refactoring. + * data/lalr1.cc: Don't issue empty namespaces. + +2010-05-04 Akim Demaille + + tests: fix %printer. + Currently, there is no check that %printer ... (nor + %destructor) is about an existing type. This C++ test had + it wrong (<::std::string> vs. ). + + * tests/c++.at (AT_CHECK_VARIANTS): In list.yy, redefine the + pretty-printing of lists into something better for parser traces. + Update the expected output. + Fix correspondance between %type/%token and %printer. 2010-05-04 Akim Demaille @@ -1143,14 +1259,6 @@ * tests/local.at (_AT_BISON_OPTION_PUSHDEFS): Adjust to the location_type changes. -2010-05-04 Akim Demaille - - tests: enhance AT_SYNCLINES_COMPILE. - * tests/synclines.at (AT_TEST_SYNCLINE): Move GCC 4.5 protection - into... - (AT_SYNCLINES_COMPILE): here. - Add more distcc patterns. - 2010-05-01 Joel E. Denny tests: fix maintainer-xml-check. @@ -1314,7 +1422,7 @@ portability: fix for BSD make. Reported by Johan van Selst at . - * tests/Makefile.am ($(TESTSUITE)): Qualify package.m4 in + * tests/local.mk ($(TESTSUITE)): Qualify package.m4 in this dependency list as in package.m4's target rule. 2010-03-23 Joel E. Denny @@ -1324,6 +1432,8 @@ . * NEWS (2.4.3): New. * THANKS (Johan van Selst): Add. + * etc/prefix-gnulib-mk (prefix): Adjust regex for makefile + targets so that gnulib's new c++defs.h is matched. * gnulib: Update to latest. 2010-03-20 Joel E. Denny @@ -1376,7 +1486,7 @@ * bootstrap.conf (gnulib_modules): Add pipe. * gnulib: Update to latest to make sure we have all the latest fixes. - * lib/Makefile.am (libbison_a_SOURCES): Remove subpipe.h and + * lib/local.mk (lib_libbison_a_SOURCES): Remove subpipe.h and subpipe.c. * po/POTFILES.in (lib/subpipe.c): Remove. * src/files.c (compute_output_file_names): Update invocations @@ -1412,6 +1522,15 @@ * tests/atlocal.in (abs_top_srcdir): Remove shell variable, which is already defined in atconfig. +2010-01-22 Joel E. Denny + + tests: fix missing include caught by g++ 4.4.1. + Reported by Tys Lefering. + * HACKING (Release checks): Add note about trying a recent GCC. + * tests/regression.at (_AT_DATA_DANCER_Y): For C++, include + cstdlib for abort. + (_AT_DATA_EXPECT2_Y): Likewise. + 2010-01-21 Joel E. Denny * cfg.mk (gnulib_dir): Assume gnulib is a subdirectory. @@ -1497,45 +1616,6 @@ * HACKING (Release Procedure): Recommend a secure automake. -2008-12-11 Akim Demaille - - Propagate i18n changes into glr.c. - * data/glr.c (yyreportSyntaxError): Use "switch" instead of - building the error message format dynamically. - * data/lalr1.java: Formatting changes. - -2009-12-22 Joel E. Denny - - Port small part of master's 11707b2b so future ports are easier. - * data/lalr1.java (YYParser::yysyntax_error): Untabify. - -2008-12-11 Akim Demaille - - Simplify the i18n of the error messages. - * data/lalr1.cc: Comment changes. - -2008-11-11 Akim Demaille - - Prefer M4 to CPP. - * data/lalr1.cc: Use b4_error_verbose_if instead of #if - YYERROR_VERBOSE. - -2008-11-11 Akim Demaille - - Support i18n of the parse error messages. - * TODO (lalr1.cc/I18n): Remove. - * data/lalr1.cc (yysyntax_error_): Support the translation of the - error messages, as done in yacc.c. - Stay within the yy* pseudo namespace. - -2009-12-22 Joel E. Denny - - Port small part of master's 8901f32e so future ports are easier. - * data/lalr1.cc (yy::parser::yysyntax_error_): Always add second - argument, but name it in the function definition only when - verbose error messages are enabled and it'll thus be used. - (yy::parser::parse): Update use of yysyntax_error_. - 2009-12-29 Joel E. Denny portability: `<' and `>' are not always defined on addresses. @@ -1581,7 +1661,7 @@ action): New test group checking that translation happens before lookahead destructor calls at parser return. Previously, incorrect destructors were called. - * tests/conflicts.at (%error-verbose and consistent + * tests/conflicts.at (parse.error=verbose and consistent errors): New test group checking that translation happens at syntax error detection before the associated verbose error message and the associated lookahead destructor calls. While @@ -1609,6 +1689,19 @@ documentation. (LocalWords): Remove YYFAIL. +2009-12-20 Joel E. Denny + + tests: cleanup. + * tests/c++.at (Syntax error discarding no lookahead): Don't + ignore stderr. Instead, eliminate remaining warnings. + +2009-12-18 Joel E. Denny + + lalr1.cc: don't discard non-existent lookahead on syntax error. + * data/lalr1.cc (yy::parser::parse): Check yyempty first. + * tests/c++.at (Syntax error discarding no lookahead): New test + group. + 2009-12-17 Joel E. Denny Code cleanup. @@ -1673,6 +1766,14 @@ * tests/atlocal.in (LIBS): As for LDADD in src/local.mk, add lib/libbison.a so gnulib libraries can be linked. +2009-12-15 Joel E. Denny + + gnulib: update for fix of fprintf-posix, which we'll use soon. + * etc/prefix-gnulib-mk (prefix): Adjust regex for make file + targets so that gnulib's new arg-nonnull.h and link-warning.h + are matched. + * gnulib: Update. + 2009-12-14 Joel E. Denny Enable assertion output and --disable-assert for configure. @@ -1726,27 +1827,20 @@ * data/bison.m4: Update comments for rename to muscle-tab.h. -2009-10-08 Joel E. Denny - - Rename muscle_tab.* to muscle-tab.* for consistency with master. - * src/Makefile.am (bison_SOURCES): Update. - * src/getargs.c, src/ielr.c, src/lalr.c, src/main.c, - src/output.c, src/parse-gram.y, src/print.c, src/reader.c, - src/tables.c: Update include. - * src/muscle_tab.c, src/muscle_tab.h: Rename to... - * src/muscle-tab.c, src/muscle-tab.h: ... these and update - include. - 2009-10-07 Joel E. Denny Minor code cleanup. - * src/muscle_tab.c (MUSCLE_USER_NAME_CONVERT): Remove macro and + * src/muscle-tab.c (MUSCLE_USER_NAME_CONVERT): Remove macro and replace all uses with UNIQSTR_CONCAT. * src/uniqstr.c (uniqstr_vsprintf): New function. * src/uniqstr.h (uniqstr_vsprintf): Add prototype. (UNIQSTR_CONCAT, UNIQSTR_GEN_FORMAT, UNIQSTR_GEN_FORMAT_): New macros. +2009-10-06 Joel E. Denny + + * TODO (Complaint submessage indentation): New. + 2009-10-04 Joel E. Denny Minor code cleanup. @@ -1781,30 +1875,25 @@ message buffer, import and clean up memory management code from... (yyparse, yypush_parse): ... here. - * tests/regression.at (%error-verbose overflow): No longer an - expected failure. + * tests/regression.at (parse.error=verbose overflow): No longer + an expected failure. 2009-09-23 Joel E. Denny yysyntax_error: test memory management more. * tests/atlocal.in (NO_WERROR_CFLAGS): New cpp macro. - * tests/regression.at (%error-verbose and YYSTACK_USE_ALLOCA): - New test group. - (%error-verbose overflow): New test group that reveals an + * tests/regression.at (parse.error=verbose and + YYSTACK_USE_ALLOCA): New test group. + (parse.error=verbose overflow): New test group that reveals an obscure bug. Expected fail for now. -2008-12-11 Akim Demaille - - Pass the token type to yysyntax_error. - * data/yacc.c (yysyntax_error): Take the transated token instead - of the raw number. - Adjust callers. - -2008-12-11 Akim Demaille +2009-10-04 Joel E. Denny - Simplify the i18n of the error messages. - * data/yacc.c (yysyntax_error): Rewrite, using a switch instead - of building dynamically the format string. + benchmarks: use %debug consistently among grammars. + * etc/bench.pl.in (generate_grammar_triangular): Do not activate + %debug by default. It can affect the timings even if yydebug=0. + (generate_grammar_calc): For consistency with other grammars, + use YYDEBUG environment variable to set yydebug. 2009-10-03 Joel E. Denny @@ -1838,16 +1927,6 @@ * tests/regression.at (parse-gram.y: LALR = IELR): New test group. -2009-09-16 Akim Demaille - - doc: comment changes. - * doc/bison.texinfo: Comment changes. - -2009-09-16 Akim Demaille - - doc: spell checking. - * doc/bison.texinfo: here. - 2009-09-19 Alex Rozenman Keep sub-messages aligned. Fix strings for translation. @@ -1864,6 +1943,62 @@ * tests/named-ref.at: Adjust test-cases. * NEWS (2.5): Add an announcement about named references. +2009-09-17 Akim Demaille + + doc: fixes. + * doc/bison.texinfo: here. + Reported by Alex Rozenman. + +2009-09-16 Akim Demaille + + doc: lalr1.cc and variants. + * doc/bison.texinfo (Decl Summary): Document the "lex_symbol" and + "variant" %define variables. + (C++ Semantic Values): Split into... + (C++ Unions, C++ Variants): these. + The latter is new. + (C++ Parser Interface): Fix type names. + Document parser::syntax_error. + Document the fact that locations are not mandatory. + (C++ Scanner Interface): Split into... + (Split Symbols, Complete Symbols): these. + The later is new. + (Calc++ Parsing Driver): Use variants. + Add more comments. + Adjust style. + (Calc++ Parser): Declare all the tokens, no + longer accept raw characters. + Remove %union. + Adjust types and printers. + Remove destructors. + (Calc++ Scanner): Use make_ functions. + Use strerror in error message. + +2009-09-16 Akim Demaille + + doc: spell checking. + * doc/bison.texinfo: here. + +2009-09-16 Akim Demaille + + doc: comment changes. + * doc/bison.texinfo: Comment changes. + +2009-09-16 Akim Demaille + + lalr1.cc: factor the yytranslate_ invocation in make_SYMBOLS. + * data/c++.m4, data/lalr1.cc (parser::symbol_type): Change the + constructor to take a token_type instead of the (internal) symbol + number. + Call yytranslate_. + * data/variant.hh (b4_symbol_constructor_define_): Therefore, + don't call yytranslate_ here. + +2009-09-16 Akim Demaille + + TODO: statistics. + * TODO (Figures): New. + 2009-09-13 Joel E. Denny tests: clean up push.at test group titles. @@ -1887,19 +2022,79 @@ comment, instead of saying "yyparse or yypush_parse", say either "yyparse" or "yypush_parse" depending on which it actually is. -2009-09-03 Joel E. Denny +2009-09-10 Joel E. Denny - Complain about unused %define variables and %code qualifiers. - * NEWS (2.5): Document. - * data/bison.m4 (b4_check_user_names): Complain instead of warn. - * doc/bison.texinfo (Decl Summary): Document complaint, and - improve %define documentation a little otherwise. - * tests/input.at (Reject unused %code qualifiers): Update. - (%define errors): Update. - (%define, --define, --force-define): Update. - (%define backward compatibility): Update. - (Unused %define api.pure): Update. - * tests/push.at (Push Parsing: Unsupported Skeletons): Update. + Fix --enable-gcc-warnings. + * src/parse-gram.y (%printer ): Handle param_none. + +2009-09-09 Akim Demaille + + lalr1.cc: syntax_error as exceptions. + It is common to use sort of factories in the user actions. These + factories may check some "syntactic" constraints that are not + enforced by the grammar itself. This is possible using YYERROR + within the action itself. Provide the user with a means to throw + a syntax_error exception. + + * data/c++.m4 (b4_public_types_declare, b4_public_types_define): + Declare and define yy::parser::syntax_error. + * data/lalr1.cc: Include stdexcept. + (yy::parser::parse): Wrap the user action within a try/catch. + * data/glr.cc: Include stdexcept. + +2009-09-09 Akim Demaille + + lalr1.cc: add missing "inline". + * data/c++.m4 (b4_public_types_define): Add missing inline to + implementations provided in headers. + +2009-09-09 Akim Demaille + + %param: documentation. + * NEWS (2.6): Document %param, %lex-param, and %parse-param + changes. + * doc/bison.texinfo: Document that %lex-param and %parse-param + are n-ary. + Changes some examples to demonstrate it. + (Calc++ Parser): Use %param. + +2009-09-09 Akim Demaille + + Regen. + +2009-09-09 Akim Demaille + + style changes. + * src/parse-gram.y (add_param): Scope changes. + +2009-09-09 Akim Demaille + + %parse: support several arguments. + * src/parse-gram.y (current_param): New. + (param_type): Add param_none. + (params): New nonterminal. + Use it. + +2009-09-09 Akim Demaille + + Regen. + +2009-09-09 Akim Demaille + + %param. + Provide a means to factor lex-param and parse-param common + declarations. + + * src/parse-gram.y (param_type): New. + Define a %printer for it. + (add_param): Use it. + (%parse-param, %lex-param): Merge into... + (%parse): this new token. + Adjust the grammar to use it. + * src/scan-gram.l (RETURN_VALUE): New. + (RETURN_PERCENT_FLAG): Use it. + (RETURN_PERCENT_PARAM): New. + Use it to support %parse-param, %lex-param and %param. 2009-09-03 Joel E. Denny @@ -1918,6 +2113,34 @@ rename variable "exact_mode" to "explicit_bracketing". * tests/named-ref.at: Adjust existing tests and add a new one. +2009-09-04 Akim Demaille + + Adjust synclines in src/parse-gram.[ch]. + * tests/bison.in: Do some magic (including working around issues + with ylwrap) when this wrapper is used to compile + src/parse-gram.y. + +2009-09-03 Joel E. Denny + + Complain about unused %define variables and %code qualifiers. + * NEWS (2.5): Document. + * data/bison.m4 (b4_check_user_names): Complain instead of warn. + * doc/bison.texinfo (Decl Summary): Document complaint, and + improve %define documentation a little otherwise. + * tests/input.at (Reject unused %code qualifiers): Update. + (%define errors): Update. + (%define, --define, --force-define): Update. + (%define backward compatibility): Update. + (Unused %define api.pure): Update. + * tests/push.at (Push Parsing: Unsupported Skeletons): Update. + +2009-09-03 Joel E. Denny + + Don't suppress warnings about unused parse.error. + * data/bison.m4 (b4_error_verbose_flag): Don't examine value of + %define variable parse.error unless b4_error_verbose_flag is + actually expanded in a skeleton. + 2009-09-03 Akim Demaille * NEWS (2.4.2): Add "Internationalization" item. @@ -1948,7 +2171,8 @@ (Table of Symbols): Likewise. * src/ielr.c (LrType): Update documentation. * src/parse-gram.y (content.opt): Add production for ID. - * tests/calc.at: Remove quotes in most tests. + * tests/actions.at: Remove quotes in most tests. + * tests/calc.at: Likewise. * tests/existing.at: Likewise. * tests/input.at: Likewise. * tests/local.at: Likewise. @@ -2002,8 +2226,8 @@ 2009-08-26 Joel E. Denny Actually handle the yytable zero value correctly this time. - * data/glr.c, data/lalr1.cc, data/lalr1.java, data/yacc.c: Don't - mention zero values in the YYTABLE comments. + * data/bison.m4 (b4_integral_parser_tables_map): Don't mention + zero values in the YYTABLE comments. * data/glr.c (yytable_value_is_error): Don't check for zero value. * data/lalr1.cc (yy_table_value_is_error_): Likewise. @@ -2016,11 +2240,10 @@ 2009-08-25 Joel E. Denny More fixes related to last two patches. + * data/bison.m4 (b4_integral_parser_tables_map): Fix YYTABLE + comments: zero indicates syntax error not default action. * data/c.m4 (b4_table_value_equals): Comment that YYID must be defined. - * data/glr.c, data/lalr1.cc, data/lalr1.java, data/yacc.c: Fix - yytable comments: zero indicates syntax error not default - action. * data/glr.c (yyis_pact_ninf): Rename to... (yypact_value_is_default): ... this. (yyisDefaultedState): Update for rename. @@ -2134,12 +2357,67 @@ 2009-08-19 Akim Demaille - doc: %initial-action to initialize yylloc. + tests: distcc compliance. + * tests/synclines.at (AT_SYNCLINES_COMPILE): Discard distcc's + error messages from the output. + +2009-08-19 Akim Demaille + + variables: simplify the upgrade of namespace into api.namespace. + + This patch simplifies "variables: rename namespace as + api.namespace", commit 67501061076ba46355cfd9f9361c7eed861b389c. + Suggested by Joel E. Denny in + http://lists.gnu.org/archive/html/bison-patches/2009-07/msg00006.html + + * src/muscle-tab.c (muscle_percent_variable_update): New. + (muscle_percent_define_insert): Use it in replacement of the + previous tr invocation. + Remove variable_tr, no longer needed. + * data/bison.m4 (b4_percent_define_copy_, b4_percent_define_copy): + Remove. + * data/c++.m4: No longer handle namespace -> api.namespace. + * tests/input.at (%define backward compatibility): Check that + namespace is treated as api.namespace. + +2009-08-19 Akim Demaille + + doc: %initial-action to initialize yylloc. Reported by Bill Allombert. * doc/bison.texinfo: Set fill-column to 76. (Location Type): Document the use of %initial-action to initialize yylloc. +2009-08-19 Akim Demaille + + lalr1.cc: use state_type. + * data/lalr1.cc (yysyntax_error_): Use state_type. + Move argument names into yy*. + +2009-08-19 Akim Demaille + + lalr1.cc: get rid of yyparse's yystate. + yystate and yystack_[0].state are equal, keep only the latter. + The former was also used as a temporary variable to compute the + post-reduction state. Move this computation into an auxiliary + function. + + * data/glr.c (yyLRgotoState): Fuse variable definition and first + assignment. + * data/lalr1.cc (yy_lr_goto_state_): New. + (yyparse): Use it. + Replace remaining uses of yystate by yystate_[0].state. + Remove the former. + +2009-08-19 Akim Demaille + + lalr1.cc: destroy $$ when YYERROR is called. + * data/lalr1.cc (yyreduce): Compute the resulting state before + running the user action so that yylhs is a valid symbol. + (yyerrorlab): Since yylhs is complete (it knows its type), we can + simply call yy_destroy_ to destroy $$ on YYERROR invocations. + * tests/c++.at (AT_CHECK_VARIANTS): Test YYERROR with variants. + 2009-08-18 Joel E. Denny maint: update for gnulib's recent update-copyright changes @@ -2200,6 +2478,71 @@ * tests/input.at (Numbered tokens): Recombine tests now that the output should be deterministic across multiple numbers. +2009-08-12 Akim Demaille + + tests: GCC 4.5 compliance. + * tests/synclines.at (AT_SYNCLINES_COMPILE): Adjust to GCC 4.5's + messages about #error. + +2009-08-12 Akim Demaille + + build: fix the generation of the documentation. + Some of our targets use "bison --help", but they can't depend on + "bison" itself (to avoid additional requirements on the user), so + they used to call "make src/bison" in the commands. Then + concurrent builds may fail: one make might be aiming one of its + jobs at compiling src/bison, and another job at generating the man + page. If the latter is faster than the former, then we have two + makes that concurrently try to compile src/bison. + + This might also be a more convincing explanation for the failure + described in the patch "build: fix paths". + + * Makefile.am (SUFFIXES): Initialize. + * build-aux/move-if-change: New, symlink to gnulib's. + * build-aux/local.mk: Ship it. + * doc/common.x: Remove, merged into... + * doc/bison.x: here. + * doc/local.mk (doc/bison.help): New. + ($(CROSS_OPTIONS_TEXI)): Depend on it. + Use src/bison. + (.x.1): Replace with... + (doc/bison.1): this explicit, simpler, target. + (common_dep): Remove, inlined where appropriate. + (SUFFIXES, PREPATH): Remove, unused. + +2009-08-12 Akim Demaille + + gnulib: improve prefixing. + * configure.ac (gl_PREFIXED_LIBOBJS): Don't rename it, rather, + change the value of... + (gl_LIBOBJS): this. + Adjust more variables. + * etc/prefix-gnulib-mk (prefix_assignment): Don't rename + gl_LIBOBJS. + (prefix): Also transform rules whose targets have slashes. + Use $prefix liberally. + Map @MKDIR_P@ to $(MKDIR_P). + Prefix directories that are mkdir'd. + +2009-08-12 Akim Demaille + + build: fix paths. + When using $(top_builddir) inconsistently, Make (including GNU + Make) is sometimes confused. As a result it may want to build + lib/libbison.la and $(top_builddir)/lib/libbison.la (the same + file, different names) concurrently, which, amusingly enough, + might end with: + + ranlib lib/libbison.a + ranlib lib/libbison.a + make[2]: *** [lib/libbison.a] Segmentation fault + + on OS X. + + * doc/local.mk, src/local.mk: Do not use $(top_builddir) when not + needed. + 2009-08-12 Akim Demaille distcheck: fix. @@ -2208,7 +2551,7 @@ 2009-08-10 Joel E. Denny - * tests/Makefile.am (TESTSUITE_AT): Add named-refs.at. + * tests/local.mk (TESTSUITE_AT): Add named-refs.at. 2009-08-10 Joel E. Denny @@ -2273,7 +2616,7 @@ maint: automate b4_copyright updates. * Makefile.am (update-b4-copyright): New target rule. - * build-aux/Makefile.am (EXTRA_DIST): Add update-b4-copyright. + * build-aux/local.mk (EXTRA_DIST): Add update-b4-copyright. * build-aux/update-b4-copyright: New. * data/yacc.c: Remove stray characters around b4_copyright invocations. @@ -2330,14 +2673,6 @@ * src/scan-gram.l (SC_ESCAPED_CHARACTER): Actually use length variable. -2009-07-24 Alex Rozenman - - Fix some memory leaks. - * src/named-ref.c: Add a pointer check (named_ref_free). - * src/scan-code.l: New function (variant_table_free). Called in - code_scanner_free. - * src/symlist.c: Call to named_ref_free (symbol_list_free). - 2009-07-24 Joel E. Denny Warn about character literals not of length one. @@ -2347,6 +2682,14 @@ (SC_ESCAPED_CHARACTER): Warn if length is wrong. * tests/input.at (Bad character literals): New test group. +2009-07-24 Alex Rozenman + + Fix some memory leaks. + * src/named-ref.c: Add a pointer check (named_ref_free). + * src/scan-code.l: New function (variant_table_free). Called in + code_scanner_free. + * src/symlist.c: Call to named_ref_free (symbol_list_free). + 2009-07-24 Joel E. Denny * src/lalr.c (state_lookahead_tokens_count): Correct comment. @@ -2371,10 +2714,6 @@ do not distinguish between a missing value and an empty string value. -2009-07-21 Joel E. Denny - - * m4/m4.m4: Make it a sym link to submodules/autoconf/m4/m4.m4. - 2009-07-15 Joel E. Denny Revert unnecessary column realignment in --help output. @@ -2384,8 +2723,8 @@ 2009-07-04 Alex Rozenman - Alphabetical order in src/Makefile.am. - * src/Makefile.am: Adjust. + Alphabetical order in src/local.mk. + * src/local.mk: Adjust. 2009-07-04 Alex Rozenman @@ -2415,6 +2754,35 @@ Not only this is inefficient, this also builds incorrect sources with several extractions mixed together. +2009-06-29 Akim Demaille + + parse.error: fix. + * data/bison.m4: Move code related to specific variables after the + definition of the variable-maintaining macros so that we don't + "invoke" b4_percent_define_check_values before it is defined. + +2009-06-29 Akim Demaille + + variables: parse.error + + Implement, document, and test the replacement of %error-verbose + by %define parse.error "verbose". + * data/bison.m4 (b4_error_verbose_if): Reimplement to track the + values of the parse.error variable. + Make "simple" its default value. + Check the valid values. + * src/parse-gram.y: Use %define parse.error. + (PERCENT_ERROR_VERBOSE): New token. + Support it. + * src/scan-gram.l: Support %error-verbose. + + * doc/bison.texinfo (Decl Summary): Replace the documentation of + %define error-verbose by that of %define parse.error. + * NEWS: Document it. + + * tests/actions.at, tests/calc.at: Use parse.error instead of + %error-verbose. + 2009-06-27 Alex Rozenman Implement support for named symbol references. @@ -2441,6 +2809,27 @@ hash: check insertion for memory exhaustion. * src/uniqstr.c (uniqstr_new): New. +2009-06-24 Akim Demaille + + variables: rename namespace as api.namespace. + Discussed in + http://lists.gnu.org/archive/html/bison-patches/2009-04/msg00033.html + + * data/bison.m4 (b4_percent_define_copy_, b4_percent_define_copy): + New. + (b4_percent_define_use): New. + Use it where applicable. + * data/c++.m4: Replace uses of the variable "namespace" by + "api.namespace". + Default the latter to the former. + * doc/bison.texinfo (Decl Summary): Document "namespace" as + obsolete. + Document api.namespace. + Use @samp to document %define uses, keep @code for identifiers. + * NEWS: Likewise. + * tests/c++.at, tests/input.at: Test api.namespace instead of + namespace. (The tests passed with namespace.) + 2009-06-11 Akim Demaille style changes. @@ -2462,6 +2851,13 @@ * src/state.c (state_hash_insert): Check the return value of hash_insert. +2009-06-11 Akim Demaille + + tests: honor TESTSUITEFLAGS in every check target. + * tests/local.mk (RUN_TESTSUITE): New. + (check-local, installcheck-local, maintainer-check-g++) + (maintainer-check-posix, maintainer-check-valgrind): Use it. + 2009-06-10 Akim Demaille deterministic test suite. @@ -2478,6 +2874,17 @@ Use different file names for the three tests to make the maintenance easier. +2009-06-10 Akim Demaille + + gnulib: update. + * gnulib: Update to latest. + * lib/.cvsignore, lib/.gitignore, m4/.cvsignore, + * m4/.gitignore: Regen. + * src/symtab.c (symbol_from_uniqstr, semantic_type_from_uniqstr): + Call xalloc_die on hash_insert failures. + Requested by the new __warn_unused_result__ attribute of + hash_insert. + 2009-06-10 Akim Demaille deterministic user-token-number redeclaration errors. @@ -2492,14 +2899,9 @@ 2009-05-25 Akim Demaille - gnulib: update. - * gnulib: Update to latest. - * lib/.cvsignore, lib/.gitignore, m4/.cvsignore, - * m4/.gitignore: Regen. - * src/symtab.c (symbol_from_uniqstr, semantic_type_from_uniqstr): - Call xalloc_die on hash_insert failures. - Requested by the new __warn_unused_result__ attribute of - hash_insert. + build: avoid ignored errors. + * doc/local.mk ($(CROSS_OPTIONS_TEXI)): Don't generate ignored + errors, they pollute the output. 2009-05-22 Joel E. Denny @@ -2507,8 +2909,8 @@ * NEWS (2.5): Add a new entry for that change. * doc/bison.texinfo (Decl Summary): Update %define entry. (Bison Options): Update -D/--define/-F/--force-define entry. - * src/muscle_tab.c (muscle_percent_define_insert): Implement. - * src/muscle_tab.h (muscle_percent_define_insert): Update + * src/muscle-tab.c (muscle_percent_define_insert): Implement. + * src/muscle-tab.h (muscle_percent_define_insert): Update comments. * tests/input.at (`%define errors'): Update. (`%define, --define, --force-define'): Update. @@ -2526,11 +2928,13 @@ * src/getargs.c (usage): Document -F/--force-define. Realign options in output. (short_options, long_options, getargs): Parse -F/--force-define, - and update muscle_percent_define_insert invocation. - * src/muscle_tab.h (muscle_percent_define_how): New enum type. + and update muscle_percent_define_insert invocations. + * src/muscle-tab.h (muscle_percent_define_how): New enum type. (muscle_percent_define_insert): Add argument with that type. - * src/muscle_tab.c (muscle_percent_define_insert): Implement + * src/muscle-tab.c (muscle_percent_define_insert): Implement -F/--force-define behavior and priorities. + (muscle_percent_define_ensure): Update + muscle_percent_define_insert invocation. * src/parse-gram.y (prologue_declaration): Update muscle_percent_define_insert invocations. * tests/input.at (`%define, --define'): Rename to... @@ -2541,13 +2945,9 @@ Update some comments to make sense for -D. * data/bison.m4 (b4_check_user_names): In header comments, say "user occurrence" instead of "grammar occurrence". - * src/muscle_tab.h (muscle_percent_define_insert): Likewise. + * src/muscle-tab.h (muscle_percent_define_insert): Likewise. (muscle_percent_code_grow): Likewise just for consistency. -2009-05-22 Joel E. Denny - - * data/c++.m4: Update copyright year. - 2009-05-20 Joel E. Denny * data/c++.m4 (b4_namespace_close): Simplify slightly. @@ -2566,21 +2966,34 @@ * src/getargs.c (skeleton_arg): Remove now useless variable. Should help the compiler see that this printf-like call is sane. +2009-05-15 Akim Demaille + + Rename token.prefix as api.tokens.prefix. + Discussed here. + http://lists.gnu.org/archive/html/bison-patches/2009-05/msg00024.html. + + * NEWS, data/bison.m4, data/c.m4, data/java.m4, doc/bison.texinfo, + * tests/c++.at, tests/calc.at, tests/java.at, tests/local.at + (token.prefix): Rename as... + (api.tokens.prefix): this. + 2009-05-11 Akim Demaille doc: use C++ headers. * doc/bison.texinfo (Calc++ Scanner): Prefer C++ headers to C headers. -2009-05-05 Akim Demaille - - fix hexadecimal token number support. - * src/scan-gram.l: Catch incorrect ids after hexadecimal numbers. - -2009-05-05 Akim Demaille +2009-05-11 Akim Demaille - tests: check token numbers. - * tests/input.at (Numbered tokens): New. + doc: token.prefix + * doc/bison.simple (Decl Summary): Document token.prefix. + (Calc++ Parser): Various fixes. + Formatting changes. + Use token.prefix. + Introduce a macro TOKEN to shorten the code and make it more + readable. + (Calc++ Scanner): Adjust. + * NEWS (Variable token.prefix): New. 2009-05-04 Akim Demaille @@ -2588,11 +3001,6 @@ * src/scan-gram.l({int}{id}): Report as an invalid identifier. * tests/input.at: Adjust. -2009-05-04 Akim Demaille - - space changes. - * src/scan-gram.l: Untabify to be robust to zealous editors. - 2009-05-04 Akim Demaille identifiers: dashes are letters. @@ -2622,7 +3030,7 @@ * data/c.m4 (b4_identification): Update comment. * data/yacc.c: Update access. * doc/bison.texinfo: Update. - * etc/bench.pl.in (bench_grammar): Update use. + * etc/bench.pl.in (bench_push_parser): Update use. * src/files.c (tr): Move to... * src/getargs.c, src/getargs.h (tr): ... here because I can't think of a better place to expose it. My logic is that, for all @@ -2664,38 +3072,11 @@ Pacify ./configure --enable-gcc-warnings. * tests/input.at (Symbols): Prototype yyerror and yylex. -2009-04-21 Akim Demaille - - tests: check the use of dashes and periods in symbols. - * tests/input.at (Symbol): New test group. - 2009-04-29 Joel E. Denny Document how `%define "var" "value"' is not M4-friendly. * src/parse-gram.y (variable): In comments here. -2009-04-29 Joel E. Denny - - Add copyright updates missed during previous cherry pick. - * src/output.c: Here. - * src/parse-gram.y: Here. - * src/scan-gram.l: Here. - -2009-04-20 Akim Demaille - - variables: accept dashes. - * src/scan-gram.l ({id}): Also accept dashes after the initial - letter. - ({directive}): Use {id}. - * src/parse-gram.y: Comment and formatting changes. - * doc/bison.texinfo (Symbols): Adjust the lexical definitions of - symbols. - * src/complain.h, src/complain.c (yacc_at): New. - * src/symtab.c (symbol_new): Use yacc_at to report inappropriate - symbol names. - * src/output.c (token_definitions_output): Do not #define token - names with dashes. - 2009-04-24 Joel E. Denny Clean up recent patches a little. @@ -2709,7 +3090,7 @@ Suggested by Akim Demaille at . * data/bison.m4 (_b4_percent_define_check_values): Implement. - * src/muscle_tab.c (muscle_percent_define_check_values): Implement. + * src/muscle-tab.c (muscle_percent_define_check_values): Implement. * tests/input.at (%define lr.default_reductions invalid values): Merge into... (%define enum variables): ... here, and update output. @@ -2721,8 +3102,9 @@ comments, and renaming %define lr.default_rules to %define lr.default_reductions. * NEWS (2.5): Update IELR documentation. - * data/glr.c, data/lalr1.cc, data/lalr1.java, data/yacc.c: - Adjust YYDEFACT and yydefact_ documentation. + * data/bison.m4 (b4_integral_parser_tables_map): Adjust YYDEFACT + documentation. + * data/glr.c, data/lalr1.java: Sync copyright dates. * doc/bison.texinfo (Decl Summary): Adjust lr.default_reductions and lr.type documentation. Make some other wording improvements. @@ -2744,6 +3126,11 @@ * tests/reduce.at (AT_TEST_LR_DEFAULT_RULES): Rename to... (AT_TEST_LR_DEFAULT_REDUCTIONS): ... this, and update. +2009-04-21 Akim Demaille + + tests: check the use of dashes and periods in symbols. + * tests/input.at (Symbol): New test group. + 2009-04-21 Joel E. Denny Document %define lr.type and lr.default_rules. @@ -2873,6 +3260,45 @@ (`%define lr.default_rules "consistent"'): Likewise. (`%define lr.default_rules "accepting"'): Likewise. +2009-04-20 Akim Demaille + + Formatting change. + +2009-04-20 Akim Demaille + + bison: factoring. + * src/output.c (token_definitions_output): Use symbol_id_get + instead of duplicating its logic. + * TODO (YYERRCODE): Extend. + +2009-04-20 Akim Demaille + + variables: prefer error-verbose to error_verbose. + * data/bison.m4 (b4_error_verbose_if): Based on error-verbose + instead of error_verbose. + * src/scan-gram.l (%error-verbose): Map to the error-verbose + variable. + * doc/bison.texinfo: Promote %define error-verbose instead of + %error-verbose. + * tests/actions.at: Prefer %define error-verbose to %error-verbose. + +2009-04-15 Akim Demaille + + variables: accept dashes. + * data/bison.m4 (b4_percent_define_if_define_): Also map dashes to + underscores. + * src/scan-gram.l ({id}): Also accept dashes after the initial + letter. + ({directive}): Use {id}. + * src/parse-gram.y: Comment and formatting changes. + * doc/bison.texinfo (Symbols): Adjust the lexical definitions of + symbols. + * src/complain.h, src/complain.c (yacc_at): New. + * src/symtab.c (symbol_new): Use yacc_at to report inappropriate + symbol names. + * src/output.c (token_definitions_output): Do not #define token + names with dashes. + 2009-04-20 Akim Demaille Consistently refer to Yacc, not YACC. @@ -2889,30 +3315,31 @@ Document semicolon warnings. * NEWS (2.5): Here. -2008-12-08 Akim Demaille +2009-04-14 Akim Demaille - Fix portability issue in the test suite. - * tests/local.at (AT_MATCHES_CHECK): New. - Based on Perl instead of Sed. Sed has too many portability - pitfalls, not ever Sed is GNU Sed. - * tests/actions.at (Fix user actions without a trailing semicolon): - Use it. + variables: use `parse.assert' instead of `assert'. + * TODO (assert): Remove. + * data/bison.m4 (b4_assert_if): Replace with... + (b4_parse_assert_if): this. + * data/lalr1.cc, data/variant.hh, tests/c++.at: Adjust. + * doc/bison.texinfo (Decl Summary): Document parse.assert. -2008-12-07 Di-an Jan +2009-04-14 Akim Demaille - Implement the FIXME that ends an user action with a semicolon - if it seems necessary. - * src/scan-code.l (flex rules section): Flag cpp directive from - any `#' to the first unescaped end-of-line. Semicolon is not - needed after `;', `{', '}', or cpp directives and is needed after - any other token (whitespaces and comments have no effect). - * tests/actions.at (Fix user actions without a trailing semicolon): - New test. - * tests/input.at (AT_CHECK_UNUSED_VALUES): Add semicolons to - to make user actions complete statements. - Adjust column numbers in error messages. - * tests/regression.at (Fix user actions without a trailing semicolon): - Remove. Covered by new test. + variables: use `parse.trace' instead of `debug'. + * src/getargs.c (getargs): Map -t to %define trace.parse. + * src/scan-gram.l (%debug): Map to %define trace.parse. + * data/bison.m4 (b4_percent_define_if_define): Map `.' in variable + names to `_' in macro names. + (b4_debug_if): Replace with... + (b4_parse_trace_if): this. + * data/glr.c, data/glr.cc, data/lalr1.cc, data/lalr1.java, + * data/yacc.c: Adjust. + * doc/bison.texinfo (Decl Summary): Document %debug as obsoleted. + Use @code to label the variable list. + Document the variable parse.trace. + (Tracing): Promote the parse.trace variable. + * TODO: %printer is not documented. 2009-04-14 Akim Demaille @@ -2933,161 +3360,131 @@ 2009-04-06 Joel E. Denny - * NEWS (2.5): Describe new -D/--define feature. - -2008-11-10 Akim Demaille - - --trace=muscles - * src/getargs.h, src/getargs.c (trace_muscle): New. - (trace_types, trace_args): Support it. - * src/output.c (output_skeleton): Use it. + * NEWS (2.5): New section. Describe new -D/--define feature. -2008-11-10 Akim Demaille +2009-04-06 Akim Demaille - muscles_output. - * src/output.c (muscles_output): New, extracted from... - (output_skeleton): here. - Adjust. + Regen. + * src/parse-gram.h, src/parse-gram.c: Regen. -2008-11-21 Akim Demaille +2009-04-06 Akim Demaille - Display the changes in cross-options.texi. - * build-aux/cross-options.pl ($sep): New, to separate items. - * doc/Makefile.am ($(srcdir)/cross-options.texi): Use diff to display - the changes. + rename muscle_tab.* as muscle-tab.* for consistency. + * src/muscle_tab.h, src/muscle_tab.c: Rename as... + * src/muscle-tab.h, src/muscle-tab.c: these. + * src/getargs.c, src/local.mk, src/main.c, src/output.c, + * src/parse-gram.y, src/reader.c, src/scan-code.l: Adjust. -2008-11-20 Di-an Jan +2009-04-06 Akim Demaille - Improves options in the manual. - * doc/bison.texinfo (-g, -x): Add space before argument. - (Option Cross Key): Implement FIXME: listing directives also. - * build-aux/cross-options.pl: Read from rather than <>. - (Short Option): Special case -d. Put arguments inside @option. - (Bison Directive): Add column, automatically extracted from - src/scan-gram.l (actual name passed as the first argument) - with special case for %define. - * doc/Makefile.am (doc/cross-options.texi): Pass src/scan-gram.l - to build-aux/cross-options.pl. - * src/getargs.c (usage): Document limitations of cross-options.pl. - * src/scan-gram.l: Likewise. + Makefile: introduce $(BISON). + * src/local.mk (BISON): New. + (YACC): Use it. -2009-02-25 Akim Demaille +2009-04-06 Akim Demaille - Copyright years. - * data/glr.c: Add 2007 and 2008 here, consistenly with the comments. + parser: handle %locations as %define locations. + * src/getargs.h, src/getargs.c (locations_flag): Remove. + * src/getargs.c, src/scan-code.l: Use muscle_percent_define_ensure + to set "locations" to true. + * src/output.c (prepare): Don't output "locations". + * src/scan-gram.l (%locations): Handle it as a %. + * src/parse-gram.y: It's no longer a token. + Don't handle it. + * data/bison.m4 (b4_locations_if): Define it with + b4_percent_define_if_define. + * data/c.m4, data/glr.cc: Adjust. -2008-12-08 Akim Demaille +2009-04-06 Akim Demaille - Install autoconf as a submodule to get m4sugar. - * .gitmodules: Add submodules/autoconf. - * data/m4sugar/foreach.m4, data/m4sugar/m4sugar.m4: Now links into - submodules/autoconf. + Regen. + * src/parse-gram.c: Regen. -2008-11-17 Joel E. Denny +2009-04-06 Akim Demaille - Simplify last patch slightly. - * src/getargs.c (getargs): Here. + muscle: factor the handling of obsolete of obsolete directives. + Suggested by Joel E. Denny. -2008-11-17 Joel E. Denny + * src/muscle_tab.h, src/muscle_tab.c (muscle_percent_define_ensure): + New, extracted from... + * src/parse-gram.y (prologue_declaration: pure-parser): here. + Remove it. + (prologue_declaration: "%"): Use + muscle_percent_define_ensure. + (%error-verbose, %pure-parser): No longer tokens. + * src/scan-gram.l (pure-parser): Return as a %. - Fix last warning from --enable-gcc-warnings. - * src/getargs.c (getargs): Don't assign const address to non-const - pointer. +2009-04-06 Joel E. Denny -2008-11-17 Di-an Jan + Fix options documentation. + * build-aux/cross-options.pl: As in --help output, write optional + arguments as [=ARG] not =[ARG]. + * doc/bison.texinfo (Bison Options): Add -W/--warnings argument. - Handle --enable-gcc-warnings. - * src/getargs.c (command_line_location): Set parameters to void. +2009-04-04 Joel E. Denny -2008-11-11 Akim Demaille + Replace BISON_PROG_GNU_M4 with Autoconf's AC_PROG_GNU_M4. + If the first m4 in $PATH is wrong, it keeps looking. Moreover, its + requirements for a correct m4 are stricter. + * m4/m4.m4: Make it a symbolic link to submodules/autoconf/m4/m4.m4. + * configure.ac: Update to use AC_PROG_GNU_M4. + Reported by Eric Blake. - AT_FULL_COMPILE. - * tests/actions.at, tests/regression.at: Use it. +2009-04-03 Joel E. Denny -2008-11-07 Akim Demaille + Help with updating web manual. + * HACKING: Incorporate instructions from gnulib/doc/README. + * bootstrap.conf (gnulib_modules): Add gendocs. - Pass command line location to skeleton_arg and language_argmatch. - * src/getargs.h, src/getargs.c (skeleton_arg, language_argmatch): - The location argument is now mandatory. - Adjust all dependencies. - (getargs): Use command_line_location. +2009-04-03 Akim Demaille + + Regen. + * src/parse-gram.h, src/parse-gram.c: Regen. + +2009-04-03 Akim Demaille + + Factor %FLAG at scan level. + * src/parse-gram.y (PERCENT_DEBUG, PERCENT_ERROR_VERBOSE): Token + definitions and associated rules, replaced by.... + (PERCENT_FLAG): this new token type, and rule. + * src/scan-gram.l (RETURN_PERCENT_FLAG): New. + Use it for %debug and %error-verbose. + +2009-04-03 Akim Demaille + + Regen. + * src/parse-gram.h, src/parse-gram.c: Regen. + +2009-04-03 Akim Demaille + + Treat %debug as %define debug. + * data/bison.m4 (b4_debug_if): New. + * data/glr.c, data/glr.cc, data/lalr1.cc, data/yacc.c, + * data/lalr1.java: Use it instead of b4_debug_flag. + * src/getargs.h, src/getargs.c (debug_flag): Remove. + * src/output.c (prepare): Don't output it. + * src/parse-gram.y: Treat %debug as %define debug. + +2009-04-03 Akim Demaille + + Treat %error-verbose as %define error_verbose. + This allows to pass -Derror_verbose on the command line. Better + yet, it allows to pass -Derror_verbose=$(ERROR_VERBOSE), with + ERROR_VERBOSE being defined as false or true. + * data/bison.m4 (b4_percent_define_if_define): Instead of relying + on b4_percent_define_ifdef, for does not check the defined value, + but only whether the symbol is defined, rely on + b4_percent_define_flag_if, so that a value of "false" is processed + as a false. + If not defined, define the flag to "false". + (b4_error_verbose_if): New. + * data/glr.c, data/lalr1.cc, data/yacc.c: Use it instead of + b4_error_verbose_flag. + * src/getargs.h, src/getargs.c (error_verbose_flag): Remove. + * src/output.c (prepare): Don't output it. + * src/parse-gram.y (%error-verbose): Treat as %define error_verbose. -2008-11-07 Akim Demaille - - -D, --define. - * src/getargs.c (usage): Document -D. - Fix help string for --locations. - (command_line_location): New. - (short_options, long_options, getargs): Support -D, --define. - (getargs): Move -d support at the right place. - * doc/bison.texinfo (Bison Options): Update. - * tests/input.at (%define, --define): New. - -2008-11-07 Akim Demaille - - Initialize the muscle table before parsing the command line. - * src/getargs.c (quotearg.h, muscle_tab.h): Include. - (getargs): Define file_name. - * src/main.c (main): Initialize muscle_tab before calling - getargs. - * src/muscle_tab.c (muscle_init): No longer define file_name, as - its value is not available yet. - -2008-11-09 Akim Demaille - - Require the generation of parse-gram.output. - * src/Makefile.am (YACC): Pass --report=all. - -2009-04-06 Joel E. Denny - - * NEWS (2.5): New stub. - -2009-04-06 Joel E. Denny - - Fix options documentation. - * build-aux/cross-options.pl: As in --help output, write optional - arguments as [=ARG] not =[ARG]. - * doc/bison.texinfo (Bison Options): Add -W/--warnings argument. - -2008-11-07 Akim Demaille - - Fix --help. - * src/getargs.c (usage): Fix help string for -W. - -2008-11-07 Akim Demaille - - Handle more general types of option arguments. - * build-aux/cross-options.pl: The argument ends at the first - space, not the first non-symbol character. - Use @var for each word appearing the argument description. - -2009-04-04 Joel E. Denny - - Remove spurious initial empty lines. - * data/location.cc: End the @output lines with an @. - -2008-11-04 Akim Demaille - - Remove spurious initial empty lines. - * data/glr.c, data/glr.cc, data/lalr1.cc, data/lalr1.java, - * data/yacc.c: End the @output lines with an @. - -2009-04-04 Joel E. Denny - - Replace BISON_PROG_GNU_M4 with Autoconf's AC_PROG_GNU_M4. - If the first m4 in $PATH is wrong, it keeps looking. Moreover, its - requirements for a correct m4 are stricter. - * m4/m4.m4: Replace with Autoconf 2.63's m4/m4.m4. - * configure.ac: Update to use AC_PROG_GNU_M4. - Reported by Eric Blake. - -2009-04-03 Joel E. Denny - - Help with updating web manual. - * HACKING: Incorporate instructions from gnulib/doc/README. - * bootstrap.conf (gnulib_modules): Add gendocs. - -2009-04-03 Joel E. Denny +2009-04-03 Joel E. Denny Fix strange %define locations for default values. Reported by Akim Demaille at @@ -3106,16 +3503,12 @@ * tests/skeletons.at (%define Boolean variables: invalid skeleton defaults): Update output. -2008-11-07 Akim Demaille - - Locations without columns for command line arguments. - * src/location.c (location_print): Don't display negative columns. - * src/location.h: Document this. - -2009-02-03 Joel E. Denny +2009-04-03 Joel E. Denny - Add reminder about uploading public key to keys.gnupg.net. - * HACKING (Release Procedure): Here. + Pacify ./configure --enable-gcc-warnings. + * Makefile.am (AM_CFLAGS): Remove $(WERROR_CFLAGS) because many files + in lib won't compile with it. + * src/local.mk (src_bison_CFLAGS): Use $(WERROR_CFLAGS) here only. 2009-03-31 Akim Demaille @@ -3158,8 +3551,201 @@ gnulib: update. * gnulib: Update to latest. - * lib/Makefile.am (AM_CPPFLAGS): It is now defined by gnulib, so - use +=. + * src/local.mk (AM_CFLAGS): Move to... + * Makefile.am: here. + * etc/prefix-gnulib-mk (prefix_assignment): Also transform + AM_CFLAGS. + +2009-03-02 Akim Demaille + + Comment changes. + +2009-03-02 Akim Demaille + + Share b4_yytranslate_define. + * data/lalr1.cc (b4_yytranslate_define): Move to... + * data/c++.m4: here. + +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. + (b4_public_types_declare, b4_public_types_define): Use them. + * data/lalr1.cc (b4_symbol_constructor_declare) + (b4_symbol_constructor_declare_) + (b4_symbol_constructor_define_, b4_symbol_constructor_define): + Move to... + * data/variant.hh: here. + Remove the "b4_variant_if" parts, as variant.hh is loaded only if + needed. + * data/lalr1.cc: No longer invoke b4_symbol_constructor_define and + b4_symbol_constructor_declare, as it is now done by + b4_public_types_define and b4_public_types_declare. + +2009-03-02 Akim Demaille + + Coding style changes. + * data/lalr1.cc (b4_symbol_constructor_declaration_) + (b4_symbol_constructor_declarations) + (b4_symbol_constructor_definition_) + (b4_symbol_constructor_definitions) + (b4_yytranslate_definition): Rename as... + (b4_symbol_constructor_declare_) + (b4_symbol_constructor_declare) + (b4_symbol_constructor_define_) + (b4_symbol_constructor_define) + (b4_yytranslate_define): these. + * data/variant.hh (b4_variant_definition): Rename as... + (b4_variant_define): this. + +2009-03-02 Akim Demaille + + Factor b4_assert_if, b4_lex_symbol_if, and b4_variant_if. + * data/bison.m4 (b4_percent_define_if_define): New. + * data/c++.m4 (b4_variant_if): Move to... + * data/bison.m4: Here, using b4_percent_define_if_define. + * data/lalr1.cc (b4_assert_if, b4_lex_symbol_if): Move to... + * data/bison.m4: Here, using b4_percent_define_if_define. + +2009-03-02 Akim Demaille + + Dub symbol_type_base as a public type. + * data/c++.m4 (b4_public_types_declare): Now define + symbol_type_base and symbol_type. + (b4_public_types_define): New. + In both cases, the definitions are taken verbatim from lalr1.cc. + * data/lalr1.cc: Adjust. + +2009-03-02 Akim Demaille + + b4_public_types_declare. + * data/c++.m4 (b4_public_types_declare): New. + * data/glr.cc, data/lalr1.cc: Use it. + +2009-03-02 Akim Demaille + + b4_semantic_type_declare. + * data/c++.m4 (b4_semantic_type_declare): New. + Factors and generalizes what was in glr.cc and lalr1.cc. + * data/variant.hh (b4_semantic_type_declare): Redefine it for + variants. + * data/lalr1.cc, data/glr.cc: Use it. + +2009-02-26 Akim Demaille + + Upgrade gnulib. + * gnulib: Upgrade from master. + * lib/.cvsignore, lib/.gitignore, m4/.cvsignore, m4/.gitignore: + Regen. + +2009-02-25 Akim Demaille + + Remove useless arguments. + * data/glr.c (yy_reduce_print): $$ and @$ are not used and not + relevant. + +2009-02-25 Akim Demaille + + Comment changes. + * data/lalr1.cc: here. + +2009-02-25 Akim Demaille + + Fix glr.cc's debug level handling. + * data/glr.cc (yydebug_): Remove, as it is actually yydebug from + glr.c which is used. + (debug_level, set_debug_level): Adjust. + +2009-02-25 Akim Demaille + + Copyright years. + * data/glr.c: Add 2007 and 2008 here, consistenly with the comments. + +2009-02-25 Akim Demaille + + Style changes. + * etc/bench.pl.in (generate_grammar_list): Consitently use + location_type, not yy::location. + +2009-02-25 Akim Demaille + + Comment change. + * data/lalr1.cc: here. + +2009-02-19 Akim Demaille + + Make yyparser::error public. + * data/lalr1.cc: here. + There is no good reason to keep it private (and it is convenient + to use it from the scanner for instance). It is already public in + glr.cc. + +2009-02-19 Akim Demaille + + Comment changes. + * data/glr.cc: here. + +2009-02-19 Akim Demaille + + Remove trailing blanks. + The epilogue has its own ending \n, no need to add another. + + * data/glr.c, data/lalr1.java, data/yacc.c: dnl when outputing the + epilogue. + * data/glr.cc: dnl when extending the epilogue. + Remove stray "private:". + +2009-02-19 Akim Demaille + + Use b4_c_modern. + * data/c.m4 (b4_c_function_decl): Here. + +2009-02-19 Akim Demaille + + Comment changes. + * data/lalr1.cc: here. + +2009-02-19 Akim Demaille + + Extract variant.hh + * data/variant.hh: New, extracted from... + * data/lalr1.cc: here. + Adjust. + * data/local.mk: Adjust. + +2009-02-19 Akim Demaille + + Extract stack.hh from lalr1.cc. + * data/stack.hh: New. + * data/lalr1.cc: Extract from here. + * data/local.mk: Adjust. + +2009-02-03 Joel E. Denny + + Add reminder about uploading public key to keys.gnupg.net. + * HACKING (Release Procedure): Here. + +2009-01-28 Akim Demaille + + * NEWS: Update information about 2.4.1 and 2.4.2. + +2008-11-04 Akim Demaille + + Reformat NEWS. + * NEWS: Use more outline-mode markup. + Suggested by Jim Meyering. 2009-01-08 Akim Demaille @@ -3175,30 +3761,110 @@ * tests/java.at: Use $EGREP instead of egrep. Use AT_CHECK's ignore instead of grep's -q. -2008-12-11 Joel E. Denny +2008-12-11 Akim Demaille + + Pass the token type to yysyntax_error. + * data/yacc.c (yysyntax_error): Take the transated token instead + of the raw number. + Adjust callers. + * TODO: Update. - Version 2.4.1. - * NEWS: Set version and date. - * lib/Makefile.am: Update copyright year. - * tests/atlocal.in: Update copyright year. +2008-12-11 Akim Demaille -2008-12-11 Joel E. Denny + Formatting changes. + * data/glr.c: Formatting changes. - Semicolon feature removal is not about future language support. - * NEWS: The semicolon feature is no longer active for newer languages, - so don't claim that it causes trouble for them. +2008-12-11 Akim Demaille -2008-12-11 Joel E. Denny + Propagate i18n changes into glr.c. + * TODO: Update. + * data/glr.c (yyreportSyntaxError): Use "switch" instead of + building the error message format dynamically. + * data/lalr1.java: Formatting changes. - * gnulib: Update submodule to HEAD. +2008-12-11 Akim Demaille -2008-12-09 Akim Demaille + Use testsuite -C. + * tests/local.mk: Replace "cd && testsuite" by "testsuite -C". + Solves problems when top_srcdir is an absolute path. + Suggested by Eric Blake. + * configure.ac: Require Autoconf 2.62. + +2008-12-11 Akim Demaille + + Simplify the i18n of the error messages. + * data/lalr1.cc: Comment changes. + * data/yacc.c (yysyntax_error): Rewrite, using a switch as in + lalr1.cc instead of building dynamically the format string. + +2008-12-08 Akim Demaille + + Fix portability issue in the test suite. + * tests/local.at (AT_MATCHES_CHECK): New. + Based on Perl instead of Sed. Sed has too many portability + pitfalls, not ever Sed is GNU Sed. + * tests/actions.at (Fix user actions without a trailing semicolon): + Use it. + +2008-12-08 Akim Demaille Update data/README. * data/README: Document glr.cc, lalr1.java, m4sugar and xslt. +2008-12-08 Akim Demaille + + Install autoconf as a submodule to get m4sugar. + * .gitmodules: Add submodules/autoconf. + * data/m4sugar/foreach.m4, data/m4sugar/m4sugar.m4: Now links into + submodules/autoconf. + +2008-12-08 Akim Demaille + + Test token.prefix in all the skeletons. + * data/java.m4 (b4_token_enum): Use the token.prefix. + * tests/local.at (AT_BISON_OPTION_PUSHDEFS): Define AT_TOKEN_PREFIX. + * tests/calc.at (_AT_DATA_CALC_Y): Use it. + Add checks for yacc.c, glr.c, lalr1.cc and glr.cc. + * tests/java.at: Comment changes. + (AT_CHECK_JAVA_MINIMAL): Define the END token. + (Java parser class and package names): Add token.prefix check. + +2008-12-08 Akim Demaille + + Fix regeneration of atconfig. + * tests/local.mk (tests/atconfig): The rule was incorrect, but + remove it: now that there is no tests/Makefile.am, the top-level + Makefile properly updates atconfig when needed. + +2008-12-07 Di-an Jan + + Implement the FIXME that ends an user action with a semicolon + if it seems necessary. + * src/scan-code.l (flex rules section): Flag cpp directive from + any `#' to the first unescaped end-of-line. Semicolon is not + needed after `;', `{', '}', or cpp directives and is needed after + any other token (whitespaces and comments have no effect). + * tests/actions.at (Fix user actions without a trailing semicolon): + New test. + * tests/input.at (AT_CHECK_UNUSED_VALUES): Add semicolons to + to make user actions complete statements. + Adjust column numbers in error messages. + * tests/regression.at (Fix user actions without a trailing semicolon): + Remove. Covered by new test. + +2008-12-07 Akim Demaille + + Update gnulib. + * gnulib: Update from master. + 2008-12-05 Eric Blake + Avoid compiler warning. + * src/output.c (muscle_insert_item_number_table): Delete unused + function. + +2008-12-02 Eric Blake + Build testsuite with newer autoconf. * tests/output.at (m4_expand): Don't override in newer autoconf, where the underlying implementation changed. @@ -3208,69 +3874,1383 @@ (_AT_VERBOSE_GLR_STDERR): Expand to double-quoted strings, since some of them contain unbalanced ')'. -2008-11-19 Joel E. Denny +2008-12-01 Akim Demaille - * NEWS: Clarify a little. + Use b4_symbol for printers and destructors everywhere. + * data/bison.m4 (b4_symbol_action_location): New. + * data/c.m4 (b4_symbol_actions): Remove. + Adjust all callers to use by b4_symbol_foreach and the corresponding + b4_symbol_printer/destructor macro. + * data/glr.cc: Adjust. + * data/lalr1.java: Adjust the %destructor sanity check. + * src/output.c (symbol_code_props_output): Remove, we no longer + need the b4_symbol_printers/destructors tables. -2008-11-19 Joel E. Denny +2008-12-01 Akim Demaille - * NEWS: Update for recent changes. + Use b4_symbol_case_. + * data/lalr1.cc, data/bison.m4 (b4_symbol_action): Use + b4_symbol_case_. -2008-11-18 Joel E. Denny +2008-12-01 Akim Demaille - Fix unexpanded macros in GLR defines file. - Reported by Csaba Raduly at - . - * THANKS (Csaba Raduly): Add. - * data/glr.c: Fix overquoting on b4_prefix for yylval and yylloc. - * tests/calc.at (_AT_DATA_CALC_Y): If %defines is specified, generate - lexer in a separate module that includes the defines file. - (AT_CHECK_CALC): Use AT_FULL_COMPILE and request compilation of lexer - source. - * tests/local.at (_AT_BISON_OPTION_PUSHDEFS): Push AT_DEFINES_IF. - Adjust AT_LOC and AT_VAL to use AT_NAME_PREFIX. - (AT_BISON_OPTION_POPDEFS): Pop AT_DEFINES_IF. - (AT_DATA_SOURCE_PROLOGUE): New. - (AT_DATA_GRAMMAR_PROLOGUE): Use AT_DATA_SOURCE_PROLOGUE. - (AT_DATA_SOURCE): New. - (AT_FULL_COMPILE): New, copied from master branch and extended to - support an additional source file. + Move b4_symbol based macro to bison.m4. + * data/lalr1.cc (b4_symbol_, b4_symbol, b4_symbol_if) + (b4_symbol_action, b4_symbol_destructor, b4_symbol_printer) + (b4_symbol_case_, b4_symbol_foreach, b4_type_action_) + (b4_type_foreach): Move to... + * data/bison.m4: Here. + * data/lalr1.cc (b4_symbol_action): Specialize for C++: use + b4_symbol_value_template instead of b4_symbol_value. -2008-11-17 Joel E. Denny +2008-12-01 Akim Demaille - Don't let maintainer-*-check targets force a version update. - * cfg.mk (_is-dist-target): Implement. maintainer-check* was already - handled. + b4_symbol/type_foreach. + * data/lalr1.cc (b4_symbol_foreach, b4_type_foreach): New. + Use them. -2008-11-17 Di-an Jan +2008-12-01 Akim Demaille + + Use the symbol properties to output the printer/destructor for lalr1.cc. + Instead of defining complex list of tuples to define various + properties of the symbols, we now prefer to define symbols as + "structs" in m4: using the symbol key (its number), and the + property name, b4_symbol gives it value. Use this to handle + destructors and printers. + + * src/output.c (CODE_PROP): New. + (prepare_symbol_definitions): Use it to define the printer and + destructor related attributes of the symbols. + * data/lalr1.cc (b4_symbol_actions): Rename as... + (b4_symbol_action): this. + Use b4_symbol instead of 6 arguments. + (b4_symbol_printer, b4_symbol_destructor): New. + Use them instead of b4_symbol_actions. + +2008-12-01 Akim Demaille + + Avoid capturing variables too easily. + * src/muscle_tab.h (MUSCLE_INSERT_BOOL, MUSCLE_OBSTACK_SGROW): Use + v__ and p__ instead of v and p. + +2008-12-01 Akim Demaille + + Remove spurious empty line before syncline. + * data/bison.m4 (b4_syncline): Don't output an empty line before + the output. + +2008-11-26 Akim Demaille + + Convert lib/Makefile.am into lib/local.mk. + The real problem is rather gnulib.mk, which itself is extracted + from a Makefile.am that gnulib expects to the "recursive". The + tool prefix-gnulib-mk converts such a gnulib.mk to be + non-recursive. Also, some AC_SUBST variables need to be adjusted. + + * etc/prefix-gnulib-mk: New. + * bootstrap (slurp): Use it to convert further gnulib.mk. + No longer try to avoid re-creation of lib/gnulib.mk as the changes + are deeper. + * lib/Makefile.am: Rename as... + * lib/local.mk: this. + Adjust to be prefixed. + * Makefile.am, configure.ac: Adjust. + * src/local.mk (AM_CPPFLAGS): Extend it, don't define it. + +2008-11-26 Akim Demaille + + s/_FLAGS/FLAGS/. + * tests/local.mk (TESTSUITE_FLAGS, AUTOTEST_FLAGS): Rename as... + (TESTSUITEFLAGS, AUTOTESTFLAGS): these to compy with the GCS. + Reported by Eric Blake. - * doc/bison.texinfo: Synchronize ``Detail Node Listing''. - Align menus. Adjust word wrapping. Use node names for menu names. - (Examples): Don't abbreviate node names. - (LocalWords): Remove abbreviations. - (Copying): Make description a sentence. - (Java Action Features): Remove period to match the rest of menu. +2008-11-26 Akim Demaille + + Use b4_parser_tables_define in glr.cc. + * data/glr.c: Use b4_parser_tables_define instead of defining the + (deterministic integral) tables by hand. + +2008-11-26 Akim Demaille + + Use b4_parser_tables_define in Java. + * data/java.m4 (b4_typed_parser_table): Rename as... + (b4_typed_parser_table_define): this, for consistency. + Accept a comment as $4. + Move $2 into yy*_. + (b4_integral_parser_table): Rename as... + (b4_integral_parser_table_define): this. + * data/lalr1.java: Adjust all uses. + Use b4_parser_tables_define instead of generation by hand. + +2008-11-26 Akim Demaille + + Prepare the convergence bw C style and Java table generation. + * data/bison.m4 (b4_tables_map, b4_tables_declare) + (b4_tables_define): Rename as... + (b4_integral_parser_tables_map, b4_parser_tables_declare) + (b4_parser_tables_define): these. + * data/c.m4 (b4_table_define): Rename as... + (b4_integral_parser_table_define): this. + * data/lalr1.cc: Adjust. + (b4_table_define, b4_table_declare): Rename as... + (b4_integral_parser_table_define) + (b4_integral_parser_table_declare): these. + (yyrline_): Move the comment where it is actually used. + * data/yacc.c: Adjust. + (yyrline): Use b4_integral_parser_table_define. + +2008-11-26 Akim Demaille + + Regen. + * src/parse-gram.h, src/parse-gram.c: Regen. + +2008-11-26 Akim Demaille + + Factor the generation of the (integral) tables bw yacc.c and lalr1.cc. + * data/lalr1.cc (b4_tables_map): Move to... + * data/bison.m4: here. + Update the comment for yytable during the flight. + (b4_tables_declare, b4_tables_define): New. + * data/lalr1.cc: Use them. + * data/c.m4 (b4_table_define): New. + * data/yacc.c: Use b4_tables_define instead of output the tables + by hand. + * tests/regression.at (Web2c Actions): Adjust the expected output, + the order of the tables changed. + +2008-11-26 Akim Demaille + + Get rid of (yy)rhs and (yy)prhs. + These tables are no longer needed in the parsers, and they don't seem to + be useful. They are not documented either. + + * src/output.c (prepare_rules): Get rid of rhs and prhs. + Adjust the computation of (yy)r2. + +2008-11-26 Akim Demaille + + Rule length is unsigned. + * src/gram.h, src/gram.c (rule_rhs_length): Return a size_t. + +2008-11-26 Akim Demaille + + Get rid of lalr1-split.cc. + It was no longer maintainer. + + * data/lalr1-split.cc: Remove. + * etc/bench.pl.in (bench_fusion_parser): Remove. + Adjust. -2008-11-11 Paolo Bonzini +2008-11-26 Akim Demaille - * bootstrap.conf: Replace m4/warning.m4 with warnings module. - * configure.ac: Adjust usage. - * lib/Makefile.am: Replace $(WARNING_CFLAGS) with $(WARN_CFLAGS). - * src/Makefile.am: Replace $(WARNING_CFLAGS) with $(WARN_CFLAGS). - * tests/atlocal.in: Replace $(WARNING_*FLAGS) with $(WARN_*FLAGS). + Use yy* consistently. + * data/glr.c: Now that yyrhs no longer exists as a global + variable, rename local "rhs" variables into "yyrhs" for + consistency. -2008-11-07 Joel E. Denny +2008-11-25 Akim Demaille - Don't add a semicolon to actions for %skeleton or %language. - It breaks Java test cases as reported by Akim Demaille. - * src/scan-code.l: Implement. + Get rid of yyrhs and yyprhs in glr.c. + * data/glr.c (yyrhs, yyprhs): Remove. + Instead, use the state stack and yystos. -2008-11-07 Joel E. Denny +2008-11-25 Akim Demaille - Clean up %skeleton and %language priority implementation. - * src/getargs.c (skeleton_prio): Use default_prio rather than 2, and - remove static qualifier because others will soon need to see it. - (language_prio): Likewise. + Flag glr tests. + * tests/local.at (_AT_BISON_OPTION_PUSHDEFS): If glr, declare it + as an Autotest keyword. + +2008-11-25 Akim Demaille + + Prefer TESTSUITE_FLAGS. + TESTSUITEFLAGS is barely readable. + + * tests/local.mk (TESTSUITE_FLAGS): Default to $(TESTSUITEFLAGS) + for backward compatibility. + Use the former instead of the latter. + +2008-11-25 Akim Demaille + + Get rid of yyrhs and yyprhs in larl1.java. + * data/lalr1.java (yyrhs_, yyprhs_): Remove. + (yy_reduce_print): Rather, use yystos_ and the state stack. + +2008-11-25 Akim Demaille + + Formatting changes. + +2008-11-25 Akim Demaille + + Get rid of yyrhs and yyprhs in yacc.c. + They were used to get the symbol types, given a rule number, when + displaying the top of the stack before a reduction. But the + symbol type is available from the state stack. This has two be + benefits: two tables less in the parser (making it smaller), and a + more consistent use of the three stacks which will help to fuse + them. + + * data/yacc.c (yyprhs, yyrhs): Remove. + (YY_REDUCE_PRINT): Pass yyssp to yy_reduce_print. + (yy_reduce_print): Take yyssp as argument. + Use it, together with yystos, to get the symbol type. + * tests/regression.at (Web2c Report): Remove these tables from the + expected output. + +2008-11-25 Akim Demaille + + b4_tables_map. + The point is to factor the generation of the tables across skeletons. + This is language dependant. + + * data/c.m4 (b4_comment_): New. + Should be usable to define how to generate tables independently of + the language. + (b4_c_comment): New. + (b4_comment): Bounce to b4_c_comment. + Now support $2 = [PREFIX] for indentation. + * data/lalr1.cc (b4_table_declare): Don't output a comment if + there is no comment. + Indent it properly when there is one. + Output the ending semicolon. + (b4_table_define): Space changes. + Output the ending semicolon. + (b4_tables_map): New. + Use it twice instead of declaring and defining the (integral) + tables by hand. + +2008-11-25 Akim Demaille + + b4_table_declare. + * data/lalr1.cc (b4_table_declare): New. + Use it to declare the tables defined with b4_table_define. + (b4_table_define): Declare a third arg to match b4_table_declare + signature. + Move all the comments around invocations of b4_table_define into + the invocations itselves. + Move things around to have the order for declarations and + definitions. + +2008-11-25 Akim Demaille + + Formatting changes. + * data/lalr1.java: here. + +2008-11-25 Akim Demaille + + b4_args is more general than only C++. + * data/lalr1.cc (b4_args, _b4_args): Move to... + * data/bison.m4: here. + +2008-11-21 Di-an Jan + + Implement no-XXX arguments for --warnings, --report, --trace. + * src/getargs.c (flags_argmatch): Handles no-XXX. + Fix typo in doxygen comment. + +2008-11-21 Akim Demaille + + Display the changes in cross-options.texi. + * build-aux/cross-options.pl ($sep): New, to separate items. + * doc/local.mk ($(CROSS_OPTIONS_TEXI)): Use diff to display the + changes. + +2008-11-20 Di-an Jan + + Improves options in the manual. + * doc/bison.texinfo (-g, -x): Add space before argument. + (Option Cross Key): Implement FIXME: listing directives also. + * build-aux/cross-options.pl: Read from rather than <>. + (Short Option): Special case -d. Put arguments inside @option. + (Bison Directive): Add column, automatically extracted from + src/scan-gram.l (actual name passed as the first argument) + with special case for %define. + * doc/local.mk (doc/cross-options.texi): Pass src/scan-gram.l + to build-aux/cross-options.pl. + * src/getargs.c (usage): Document limitations of cross-options.pl. + * src/scan-gram.l: Likewise. + +2008-11-18 Joel E. Denny + + Fix unexpanded macros in GLR defines file. + Reported by Csaba Raduly at + . + * THANKS (Csaba Raduly): Add. + * data/glr.c: Fix overquoting on b4_prefix for yylval and yylloc. + * tests/calc.at (_AT_DATA_CALC_Y): If %defines is specified, generate + lexer in a separate module that includes the defines file. + (AT_CHECK_CALC): From AT_FULL_COMPILE, request compilation of lexer + source. + * tests/local.at (_AT_BISON_OPTION_PUSHDEFS): Push AT_DEFINES_IF. + Adjust AT_LOC and AT_VAL to use AT_NAME_PREFIX. + (AT_BISON_OPTION_POPDEFS): Pop AT_DEFINES_IF. + (AT_DATA_SOURCE_PROLOGUE): New. + (AT_DATA_GRAMMAR_PROLOGUE): Use AT_DATA_SOURCE_PROLOGUE. + (AT_DATA_SOURCE): New. + (AT_FULL_COMPILE): Extend to support an additional source file. + +2008-11-18 Akim Demaille + + More TODO. + * TODO: More short term issues. + +2008-11-18 Akim Demaille + + Regen. + * src/parse-gram.h, src/parse-gram.c: Regen. + +2008-11-18 Akim Demaille + + Use b4_subtract where possible. + * data/lalr1.cc (b4_subtract): Move to... + * data/bison.m4: here. + * data/glr.c (b4_rhs_data): Use it. + * data/yacc.c (b4_rhs_value, b4_rhs_location): Use it. + +2008-11-18 Akim Demaille + + Remove incorrect mode specification. + * data/glr.cc: Don't pretend it's C code. + +2008-11-17 Joel E. Denny + + Simplify last patch slightly. + * src/getargs.c (getargs): Here. + +2008-11-17 Joel E. Denny + + Fix last warning from --enable-gcc-warnings. + * src/getargs.c (getargs): Don't assign const address to non-const + pointer. + +2008-11-17 Joel E. Denny + + Don't let maintainer-*-check targets force a version update. + * cfg.mk (_is-dist-target): Implement. maintainer-check* was already + handled. + +2008-11-17 Di-an Jan + + * doc/bison.texinfo: Synchronize ``Detail Node Listing''. + Align menus. Adjust word wrapping. Use node names for menu names. + (Examples): Don't abbreviate node names. + (LocalWords): Remove abbreviations. + (Copying): Make description a sentence. + (Java Action Features): Remove period to match the rest of menu. + +2008-11-17 Di-an Jan + + Handles several --enable-gcc-warnings. + * src/getargs.c (command_line_location): Set parameters to void. + * src/output.c (symbol_type_name_cmp): Make static. + (symbols_by_type_name): Set parameters to void. + (symbol_definitions_output): Remove unused parameter. Rename as... + (prepare_symbol_definitions): this. + (muscles_output): Move symbol_definitions_output to... + (output): here as prepare_symbol_definitions. + * tests/c++.at (AT_CHECK_VARIANTS): Remove unused parameters of main. + (AT_CHECK_NAMESPACE): Make unused parameter lloc unnamed. + +2008-11-17 Di-an Jan + + * tests/c++.at (AT_CHECK_VARIANTS): Fixes tests 198-202. + Use AT_DATA_GRAMMAR instead of AT_DATA for compiled tests. + +2008-11-16 Akim Demaille + + Add missing $(EXEEXT). + * doc/local.mk ($(CROSS_OPTIONS_TEXI)): The target is + "src/bison$(EXEEXT)". + Reported by Di-an Jan. + +2008-11-15 Akim Demaille + + * TODO: Update. + +2008-11-15 Akim Demaille + + Formatting changes. + * tests/input.at: here. + +2008-11-15 Akim Demaille + + Remove duplicate header inclusion. + * src/LR0.c: here. + +2008-11-15 Akim Demaille + + * src/parse-gram.h, src/parse-gram.c: Regen. + +2008-11-15 Akim Demaille + + Support parametric types. + + There are two issues to handle: first scanning nested angle + bracket pairs to support types such as std::pair< std::string, + std::list > >. + + Another issue is to address idiosyncracies of C++: do not glue two + closing angle brackets together (otherwise it's operator>>), and + avoid sticking blindly a TYPE to the opening <, as it can result + in '<:' which is a digraph for '['. + + * src/scan-gram.l (brace_level): Rename as... + (nesting): this. + (SC_TAG): New. + Implement support for complex tags. + (tag): Accept + , but not <. + * data/lalr1.cc (b4_symbol_value, b4_symbol_value_template) + (b4_symbol_variant): Leave space around types as parameters. + * examples/variant.yy: Use nested template types and leading ::. + * src/parse-gram.y (TYPE, TYPE_TAG_ANY, TYPE_TAG_NONE, type.opt): + Rename as... + (TAG, TAG_ANY, TAG_NONE, tag.opt): these. + * tests/c++.at: Test parametric types. + +2008-11-15 Akim Demaille + + Test token.prefix. + This is not sufficient, but we test at least that the make_SYMBOL + interface is not affected by token.prefix. A more general test + will be implemented when the support of token.prefix is generalized + to more skeletons. + + * tests/c++.at: One more variant test, using token.prefix. + +2008-11-15 Akim Demaille + + Test the make_TOKEN interface. + * tests/c++.at (AT_CHECK_VARIANTS): Require and use locations. + Factor the common code in yylex. + Use it to test "%define lex_symbol". + +2008-11-15 Akim Demaille + + Formatting change. + +2008-11-15 Akim Demaille + + Simplify code for variants bench marks. + * etc/bench.pl.in (&generate_grammar_list): Define and use + location_type. + Factor the common code in yylex. + +2008-11-15 Akim Demaille + + Better error message. + * bootstrap (find_tool): Fix the error message. + +2008-11-15 Akim Demaille + + Update variant.yy to newest interface. + * examples/variant.yy: Define lex_symbol. + Adjust. + +2008-11-15 Akim Demaille + + Don't use locations in variant.yy. + * examples/variant.yy: Adjust to not using locations. + +2008-11-15 Akim Demaille + + Comment changes. + * data/local.mk, etc/local.mk, examples/local.mk: Use Automake + comments for the license. + +2008-11-15 Akim Demaille + + Remove tests/Makefile.am. + * tests/Makefile.am: Rename as... + * tests/local.mk: this. + * Makefile.am, configure.ac: Adjust. + * Makefile.am (DISTCLEANFILES): Define. + (maintainer-check, maintainer-xml-check, maintainer-push-check): + Remove, we no longer need to bounce to the real targets. + +2008-11-15 Akim Demaille + + Comment changes. + +2008-11-15 Akim Demaille + + djgpp/local.mk. + * Makefile.am (EXTRA_DIST): Move djgpp related part to... + * djgpp/local.mk: this new file. + +2008-11-15 Akim Demaille + + Remove doc/Makefile.am. + * doc/Makefile.am: Rename as... + * doc/local.mk: this. + Adjust paths + * Makefile.am, configure.ac: Adjust. + * Makefile.am (MOSTLYCLEANFILES): New. + * src/local.mk: Adjust. + +2008-11-15 Akim Demaille + + Move sc_tight_scope into maint.mk. + It does not work, and I don't know how it was supposed to work: it + seems to be looking for sources in the build tree. I just moved + it at a better place, fixing it is still required. + + * src/local.mk (echo): Remove. + (sc_tight_scope): Move to... + * maint.mk: here. + +2008-11-15 Akim Demaille + + Regen. + * src/parse-gram.h, src/parse-gram.h: Regen. + +2008-11-15 Akim Demaille + + Remove src/Makefile.am. + * src/Makefile.am: Rename as... + * src/local.mk: this. + Prefix all the paths with src/. + (AUTOMAKE_OPTIONS): Build object files in the sub dirs. + (AM_CPPFLAGS): Find find in builddir/src. + (YACC): Move the flags into... + (AM_YFLAGS): here. + * maint.mk (sc_tight_scope): Disable. + It used to bounce to the version in src/Makefile.am which is now + part of this very Makefile. + * Makefile.am, configure.ac: Adjust. + * src/scan-code-c.c, src/scan-code.l: We can no longer rely on + include "..." to find files "here": we are no longer in src/, so + qualify the includes with src/. + * doc/Makefile.am (PREPATH): No longer include the top_builddir + prefix. + (.x.1): Adjust to be able to create src/foo from the top level + Makefile, instead of going bounce to src/Makefile the creation of + foo. + +2008-11-15 Akim Demaille + + Remove useless variable. + * doc/Makefile.am (srcsrcdir): Remove. + +2008-11-15 Akim Demaille + + Remove data/Makefile.am. + * data/Makefile.am: Rename as... + * data/local.mk: this. + Adjust paths. + * Makefile.am, configure.ac: Adjust. + +2008-11-15 Akim Demaille + + Remove etc/Makefile.am. + * etc/Makefile.am: Rename as... + * etc/local.mk: this. + Adjust. + * Makefile.am, configure.ac: Adjust. + +2008-11-15 Akim Demaille + + Remove examples/local.mk. + examples/calc++/Makefile.am might be interesting to keep as is, since + it is an example in itself. + + * examples/Makefile.am: Rename as... + * examples/local.mk: this. + Adjust. + * Makefile.am, configure.ac: Adjust. + +2008-11-15 Akim Demaille + + Remove build-aux/Makefile.am. + Recursive Makefiles are really way too slow, let's get rid of some of + them. + + * build-aux/Makefile.am: Rename as... + * build-aux/local.mk: this. + Adjust paths. + * Makefile.am, configure.ac: Adjust. + +2008-11-15 Akim Demaille + + Provide convenience constructors for locations and positions. + * data/location.cc (position::position): Accept file, line and + column as arguments with default values. + Always qualify initial line and column literals as unsigned. + (location::location): Provide convenience constructors. + +2008-11-15 Akim Demaille + + Instead of using make_symbol, generate make_FOO for each + token type. + Using template buys us nothing, and makes it uselessly complex to + construct a symbol. Besides, it could not be generalized to other + languages, while make_FOO would work in C/Java etc. + + * data/lalr1.cc (b4_symbol_): New. + (b4_symbol): Use it. + (b4_symbol_constructor_declaration_) + (b4_symbol_constructor_definition_): Instead of generating + specializations of an overloaded template function, just generate + several functions whose names are forged from the token names + without the token.prefix. + (b4_symbol_constructor_declarations): Generate them for all the + symbols, not just by class of symbol type, now that instead of + specializing a function template by the token, we generate a + function named after the token. + (b4_symbol_constructor_specialization_) + (b4_symbol_constructor_specializations): Remove. + * etc/bench.pl.in: Adjust to this new API. + +2008-11-13 Akim Demaille + + %define token.prefix. + Provide a means to add a prefix to the name of the tokens as + output in the generated files. Because of name clashes, it is + good to have such a prefix such as TOK_ that protects from names + such as EOF, FILE etc. But it clutters the grammar itself. + + * data/bison.m4 (token.prefix): Empty by default. + * data/c.m4 (b4_token_enum, b4_token_define): Use it. + * data/lalr1.cc (b4_symbol): Ditto. + +2008-11-13 Akim Demaille + + Compute at M4 time some of the subtractions. + * data/lalr1.cc (b4_subtract): New. + (b4_rhs_data): Use it. + +2008-11-13 Akim Demaille + + symbol::token. + This allows the user to get the type of a token returned by yylex. + + * data/lalr1.cc (symbol::token): New. + (yytoknum_): Define when %define lex_symbol, independently of + %debug. + (yytoken_number_): Move into... + (symbol::token): here, since that's the only use. + The other one is YYPRINT which was not officially supported + by lalr1.cc, and anyway it did not work since YYPRINT uses this + array under a different name (yytoknum). + +2008-11-13 Akim Demaille + + YYERRCODE. + * TODO (YYERRCODE): Mention the case of $undef. + +2008-11-13 Akim Demaille + + TODO: YYPRINT. + * TODO (YYPRINT): New. + +2008-11-13 Akim Demaille + + Comment changes. + * data/lalr1.cc, data/yacc.c: Fix the description of the + yytranslate and yytoknum tables. + +2008-11-13 Akim Demaille + + Define make_symbol in the header. + To reach good performances these functions should be inlined (yet + this is to measure precisely). To this end they must be available + to the caller. + + * data/lalr1.cc (b4_symbol_constructor_definition_): Qualify + location_type with the class name. + Since will now be output in the header, declare "inline". + No longer use b4_symbol_constructor_specializations, but + b4_symbol_constructor_definitions in the header. + Don't call it in the *.cc file. + +2008-11-13 Akim Demaille + + Define yytranslate in the header for lex_symbol. + * data/lalr1.cc: Move the invocation of b4_yytranslate_definition + into the header file when using %define lex_symbol. + (yytranslate_): Declare inline. + +2008-11-13 Akim Demaille + + Define the constructors of symbol_type in + b4_symbol_constructor_definitions. + The constructors are called by the make_symbol functions, which a + forthcoming patch will move elsewhere. Hence the interest of + putting them together. + + The stack_symbol_type does not need to be moved, it is used only + by the parser. + + * data/lalr1.cc: Move symbol_type and symbol_base_type + constructors into... + (b4_symbol_constructor_definitions): here. + Adjust. + +2008-11-13 Akim Demaille + + Make it easier to move the definition of yytranslate_. + Forthcoming changes will make it possible to use yytranslate_ + from outside the parser implementation file. + + * data/lalr1.cc (b4_yytranslate_definition): New. + Use it. + +2008-11-13 Akim Demaille + + Remove useless class specification. + * data/lalr1.cc (b4_symbol_constructor_specialization_): No need + to refer to the class name to use a type defined by the class for + arguments of member functions. + +2008-11-13 Akim Demaille + + Finer input type for yytranslate. + This patch is debatable: the tradition expects yylex to return an int + which happens to correspond to token_number (which is an enum). This + allows for instance to return characters (such as '*' etc.). But this + goes against the stronger typing I am trying to have with the new + lex interface which return a symbol_type. So in this case, feed + yytranslate_ with a token_type. + + * data/lalr1.cc (yytranslate_): When in %define lex-symbol, + expect a token_type. + +2008-11-13 Akim Demaille + + Honor lex-params in %define lex_symbol mode. + * data/lalr1.cc: Use b4_lex_param. + +2008-11-13 Akim Demaille + + Simplify names. + * src/output.c (symbol_definitions_output): Rename symbol + attributes type_name and has_type_name as type and has_type. + * data/lalr1.cc: Adjust uses. + +2008-11-13 Akim Demaille + + Use b4_type_names for the union type. + The union used to compute the size of the variant used to iterate + over the type of all the symbols, with a lot of redundancy. Now + iterate over the lists of symbols having the same type-name. + + * data/lalr1.cc (b4_char_sizeof_): New. + (b4_char_sizeof): Use it. + Adjust to be called with a list of numbers instead of a single + number. + Adjust its caller for new-line issues. + +2008-11-13 Akim Demaille + + Define the "identifier" of a symbol. + Symbols may have several string representations, for instance if + they have an alias. What I call its "id" is a string that can be + used as an identifier. May not exist. + + Currently the symbols which have the "tag_is_id" flag set are + those that don't have an alias. Look harder for the id. + + * src/output.c (is_identifier): Move to... + * src/symtab.c (is_identifier): here. + * src/symtab.h, src/symtab.c (symbol_id_get): New. + * src/output.c (symbol_definitions_output): Use it to define "id" + and "has_id". + Remove the definition of "tag_is_id". + * data/lalr1.cc: Use the "id" and "has_id" whereever "tag" and + "tag_is_id" were used to produce code. + We still use "tag" for documentation. + +2008-11-11 Akim Demaille + + Locations are no longer required by lalr1.cc. + * data/lalr1.cc (_b4_args, b4_args): New. + Adjust all uses of locations to make them optional. + * tests/c++.at (AT_CHECK_VARIANTS): No longer use the locations. + (AT_CHECK_NAMESPACE): Check the use of locations. + * tests/calc.at (_AT_DATA_CALC_Y): Adjust to be usable with or + without locations with lalr1.cc. + Test these cases. + * tests/output.at: Check lalr1.cc with and without location + support. + * tests/regression.at (_AT_DATA_EXPECT2_Y, _AT_DATA_DANCER_Y): + Don't use locations. + +2008-11-11 Akim Demaille + + AT_FULL_COMPILE. + * tests/local.at (AT_FULL_COMPILE): New. + * tests/actions.at, tests/calc.at, tests/regression.at: Use it. + +2008-11-11 Akim Demaille + + Support parens in calc++. + * doc/bison.texinfo (Calc++ Scanner, Calc++ Parser): Support parens. + * examples/calc++/test (run): Check the expected output. + Adjust callers. + Check parens too. + +2008-11-11 Akim Demaille + + Simplify lalr1.cc since %defines is mandatory. + * data/lalr1.cc: Remove useless calls to b4_defines_if. + +2008-11-11 Akim Demaille + + TODO: yyfmt. + * TODO (yysyntax_error): New item. + +2008-11-11 Akim Demaille + + Prefer M4 to CPP. + * data/lalr1.cc: Use b4_error_verbose_if instead of #if + YYERROR_VERBOSE. + +2008-11-11 Akim Demaille + + Support i18n of the parse error messages. + * TODO (lalr1.cc/I18n): Remove. + * data/lalr1.cc (yysyntax_error_): Support the translation of the + error messages, as done in yacc.c. + Stay within the yy* pseudo namespace. + +2008-11-11 Akim Demaille + + More TODO. + * TODO (single stack, yysyntax_error): New. + +2008-11-11 Akim Demaille + + Make it possible to return a symbol_type from yylex. + * data/lalr1.cc (b4_lex_symbol_if): New. + (parse): When lex_symbol is defined, expected yylex to return the + complete lookahead. + * etc/bench.pl.in (generate_grammar_list): Extend to support this + yylex interface. + (bench_variant_parser): Exercise it. + +2008-11-11 Akim Demaille + + Remove useless bench case. + * etc/bench.pl.in (bench_variant_parser): VARIANT_DESTROY is + no longer used. + +2008-11-11 Akim Demaille + + Improve display of directives. + * etc/bench.pl.in (parse_term): Don't add useless eol. + +2008-11-11 Akim Demaille + + Use string_cast in the bench. + * etc/bench.pl.in (generate_grammar_list): Define and use + string_cast. + +2008-11-11 Akim Demaille + + Replace yychar with a Boolean. + * data/lalr1.cc (parse::yychar): Replace by... + (parse::yyempty): this. + +2008-11-11 Akim Demaille + + Factor the tables. + * TODO: New item. + +2008-11-11 Akim Demaille + + Let yytranslate handle the eof case. + * data/lalr1.cc (yytranslate_): Handle the EOF case. + Adjust callers. + No longer expect yychar to be equal to yyeof_, rather, test the + lookahead's (translated) kind. + +2008-11-11 Akim Demaille + + yychar cannot be empty in yyerrlab. + * TODO (yychar == yyempty_): New. + * data/lalr1.cc: Remove the handling of this case. + This eases forthcoming changes related to yychar and yytranslate. + +2008-11-11 Akim Demaille + + Bench: syntactic sugar for %define/#define. + * etc/bench.pl.in (parse_dirs): Support %d and #d with arguments. + (&bench_push_parser, bench_variant_parser): Use this feature. + (&eat): New. + Use it. + +2008-11-11 Akim Demaille + + Less memory pressure on the "list" bench. + * etc/bench.pl.in (generate_grammar_list): Do not accumulate all + the values, to limit memory pressure. + +2008-11-11 Akim Demaille + + Introduce make_symbol. + make_symbol provides a means to construct a full symbol (kind, + value, location) in a single shot. It is meant to be a Symbol + constructor, parameterized by the symbol kind so that overloading + would prevent incorrect kind/value pairs. Unfortunately + parameterized constructors do not work well in C++ (unless the + parameter also appears as an argument, which is not acceptable), + hence the use of a function instead of a constructor. + + * data/lalr1.cc (b4_symbol_constructor_declaration_) + (b4_symbol_constructor_declarations) + (b4_symbol_constructor_specialization_) + (b4_symbol_constructor_specializations) + (b4_symbol_constructor_definition_) + (b4_symbol_constructor_definitions): New. + Use them where appropriate to generate declaration, declaration of + the specializations, and implementations of the templated + overloaded function "make_symbol". + (variant::variant): Always define a default ctor. + Also provide a copy ctor. + (symbol_base_type, symbol_type): New ctor overloads for value-less + symbols. + (symbol_type): Now public, so that functions such as yylex can use + it. + +2008-11-11 Akim Demaille + + Inform m4 whether a tag is a valid id. + * src/output.c (is_identifier): New. + (symbol_definitions_output): Use it to define tag_is_id. + But maybe this should be done at m4 level? + +2008-11-11 Akim Demaille + + Test 214 was failing: it greps with a pattern containing [ ]* + which obviously meant to catch spaces and tabs, but contained only + spaces. Tabulations in sources are a nuisance, so to simplify the + matter, get rid of all the tabulations in the Java sources. The + other skeletons will be treated equally later. + + * data/java.m4, data/lalr1.java: Untabify. + * tests/java.at: Simplify AT_CHECK_JAVA_GREP invocations: + tabulations are no longer generated. + +2008-11-11 Paolo Bonzini + + * bootstrap.conf: Replace m4/warning.m4 with warnings module. + * configure.ac: Adjust usage. + * lib/Makefile.am: Replace $(WARNING_CFLAGS) with $(WARN_CFLAGS). + * src/Makefile.am: Replace $(WARNING_CFLAGS) with $(WARN_CFLAGS). + * tests/atlocal.in: Replace $(WARNING_*FLAGS) with $(WARN_*FLAGS). + +2008-11-10 Di-an Jan + + Workaround Java's ``code too large'' problem for parser tables + in most cases, by using one function per initialization. + * data/java.m4 (b4_typed_parser_table, b4_integral_parser_table): New. + * data/lalr1.java (yypact_, yydefact_, yypgoto_, yydefgoto_, + yytable_, yycheck_, yystos_, yytoken_number_, yyr1_, yyr2_, yyrhs_ + yyprhs_, yyrline_, yytranslate_table_): Use b4_integral_parser_table. + (yytname_): Use b4_typed_parser_table. + * doc/bison.texinfo (Java Bison Interface): Add note on Java's + ``code too large'' error. + +2008-11-10 Di-an Jan + + * NEWS: Document them. + + General Java skeleton improvements. + * configure.ac (gt_JAVACOMP): Request target of 1.4, which allows + using gcj < 4.3 in the testsuite, according to comments in + gnulib/m4/javacomp.m4. + * data/java.m4 (stype, parser_class_name, lex_throws, throws, + location_type, position_type): Remove extraneous brackets from + b4_percent_define_default. + (b4_lex_param, b4_parse_param): Remove extraneous brackets from + m4_define and m4_define_default. + * data/lalr1.java (b4_pre_prologue): Change to b4_user_post_prologue, + which marks the end of user code with appropriate syncline, like all + the other skeletons. + (b4_user_post_prologue): Add. Don't silently drop. + (yylex): Remove. + (parse): Inline yylex. + * doc/bison.texinfo (bisonVersion, bisonSkeleton): Document. + (%{...%}): Fix typo of %code imports. + * tests/java.at (AT_JAVA_COMPILE): Add "java" keyword. + + Support annotations on parser class with %define annotations. + * data/lalr1.java (annotations): Add to parser class modifier. + * doc/bison.texinfo (Java Parser Interface): Document + %define annotations. + (Java Declarations Summary): Document %define annotations. + * tests/java.at (Java parser class modifiers): Test annotations. + + Do not generate code for %error-verbose unless requested. + * data/lalr1.java (errorVerbose): Rename to yyErrorVerbose. + Make private. Make conditional on %error-verbose. + (getErrorVerbose, setErrorVerbose): New. + (yytnamerr_): Make conditional on %error-verbose. + (yysyntax_error): Make some code conditional on %error-verbose. + * doc/bison.texinfo (Java Bison Interface): Remove the parts + about %error-verbose having no effect. + (getErrorVerbose, setErrorVerbose): Document. + + Move constants for token names to Lexer interface. + * data/lalr1.java (Lexer): Move EOF, b4_token_enums(b4_tokens) here. + * data/java.m4 (b4_token_enum): Indent for move to Lexer interface. + (parse): Qualify EOF to Lexer.EOF. + * doc/bison.texinfo (Java Parser Interface): Move documentation of + EOF and token names to Java Lexer Interface. + * tests/java.at (_AT_DATA_JAVA_CALC_Y): Remove Calc qualifier. + + Make yyerror public. + * data/lalr1.java (Lexer.yyerror): Use longer parameter name. + (yyerror): Change to public. Add Javadoc comments. Use longer + parameter names. Make the body rather than the declarator + conditional on %locations. + * doc/bison.texinfo (yyerror): Document. Don't mark as protected. + + Allow user to add code to the constructor with %code init. + * data/java.m4 (b4_init_throws): New, for %define init_throws. + * data/lalr1.java (YYParser.YYParser): Add b4_init_throws. + Add %code init to the front of the constructor body. + * doc/bison.texinfo (YYParser.YYParser): Document %code init + and %define init_throws. + (Java Declarations Summary): Document %code init and + %define init_throws. + * tests/java.at (Java %parse-param and %lex-param): Adjust grep. + (Java constructor init and init_throws): Add tests. + +2008-11-10 Akim Demaille + + Update TODO. + * TODO (-D): is implemented. + (associativity): Same precedence must have the same associativity. + For instance, how can a * b / c be parsed if * is %left and / is + %right? + (YYERRORCODE, YYFAIL, YYBACKUP): New. + +2008-11-10 Akim Demaille + + Formatting changes. + +2008-11-10 Akim Demaille + + More information about the symbols. + * src/output.c (type_names_output): Document all the symbols, + including those that don't have a type-name. + (symbol_definitions_output): Define "is_token" and + "has_type_name". + * data/lalr1.cc (b4_type_action_): Skip symbols that have an empty + type-name, now that they are defined too in b4_type_names. + +2008-11-10 Akim Demaille + + Regen. + +2008-11-10 Akim Demaille + + Make parser::yytranslate static. + Small speedup (1%) on the list grammar. And makes yytranslate_ + available in non member functions. + + * data/lalr1.cc (yytranslate_): Does not need to be a instance + function. + +2008-11-10 Akim Demaille + + Avoid trailing spaces. + * data/c.m4: b4_comment(TEXT): Don't indent empty lines. + * data/lalr1.cc: Don't indent before rule and symbol actions, as + they can be empty, and anyway this incorrectly indents the first + action. + +2008-11-10 Akim Demaille + + Comment changes. + +2008-11-10 Akim Demaille + + Use "enum" for integral constants. + This is just nicer to read, I observed no speedup. + + * data/lalr1.cc (yyeof_, yylast_, yynnts_, yyempty_, yyfinal_) + (yterror_, yyerrcode_, yyntokens_): Define as members of an enum. + (yyuser_token_number_max_, yyundef_token_): Move into... + (yytranslate_): here. + +2008-11-10 Akim Demaille + + Shortcuts in bench directives. + * etc/bench.pl.in (parse_dirs): New. + Use it. + (bench_variant_parser, bench_fusion_parser): Use %s and %d. + Create the benches in "benches/". + +2008-11-10 Akim Demaille + + Formatting changes. + * data/lalr1.cc: here. + +2008-11-10 Akim Demaille + + Adjust verbose message to using emacs. + * etc/bench.pl.in: Inform compilation-mode when we change the + directory. + (generate_grammar_list): Recognize %define "variant" in addition + to %define variant. + +2008-11-10 Akim Demaille + + Classify symbols by type-name. + * src/uniqstr.h (UNIQSTR_CMP): New. + * src/output.c (symbol_type_name_cmp, symbols_by_type_name) + (type_names_output): New. + (muscles_output): Use it. + * data/lalr1.cc (b4_symbol_action_): Remove. + (b4_symbol_case_, b4_type_action_): New. + Adjust uses of b4_symbol_action_ to use b4_type_action_. + +2008-11-10 Akim Demaille + + Change the handling of the symbols in the skeletons. + Before we were using tables which lines were the symbols and which + columns were things like number, tag, type-name etc. It is was + difficult to extend: each time a column was added, all the numbers had + to be updated (you asked for colon $2, not for "tag"). Also, it was + hard to filter these tables when only a subset of the symbols (say the + tokens, or the nterms, or the tokens that have and external number + *and* a type-name) was of interest. + + Now instead of monolithic tables, we define one macro per cell. For + instance "b4_symbol(0, tag)" is a macro name which contents is + self-decriptive. The macro "b4_symbol" provides easier access to + these cells. + + * src/output.c (type_names_output): Remove. + (symbol_numbers_output, symbol_definitions_output): New. + (muscles_output): Call them. + (prepare_symbols): Define b4_symbols_number. + +2008-11-10 Akim Demaille + + --trace=muscles + * src/getargs.h, src/getargs.c (trace_muscle): New. + (trace_types, trace_args): Support it. + * src/output.c (output_skeleton): Use it. + +2008-11-10 Akim Demaille + + muscles_output. + * src/output.c (muscles_output): New, extracted from... + (output_skeleton): here. + Adjust. + +2008-11-10 Akim Demaille + + Formatting changes. + +2008-11-10 Akim Demaille + + Update the variant example. + * examples/variant.yy: Formatting changes. + One stage build. + +2008-11-10 Akim Demaille + + Support constructor with an argument. + This improves the "list" bench by 2%. + + * data/lalr1.cc (variant::build): Add an overloaded version with + an argument. + * tests/c++.at (AT_CHECK_VARIANT): Check it. + +2008-11-10 Akim Demaille + + Test variants. + * tests/c++.at (AT_CHECK_VARIANTS): New. + Use it with and without %define assert. + +2008-11-10 Akim Demaille + + Add %precedence support. + Unfortunately it is not possible to reuse the %prec directive. This + is because to please POSIX, we do not require to end the rules with a + semicolon. As a result, + + foo: bar %prec baz + + is ambiguous: either a rule which precedence is that of baz, or a rule, + and then a declaration of the precedence of the token baz. + + * doc/bison.texinfo: Document %precedence. + (Precedence Only): New. + * src/assoc.h, src/assoc.c (precedence_assoc): New. + * src/conflicts.c (resolve_sr_conflict): Support it. + * src/scan-gram.l, src/parse-gram.y (%precedence): New token. + Parse it. + * tests/calc.at: Use %precedence for NEG. + * tests/conflicts.at (%precedence does not suffice) + (%precedence suffices): New tests. + +2008-11-09 Akim Demaille + + Make benches in a sub dirs. + * etc/bench.pl.in ($dir): New. + Use it. + Check the use of constructors with an argument. + (bench_variant_parser): Fix. + +2008-11-09 Akim Demaille + + fix eof condition + +2008-11-09 Akim Demaille + + Fix --help. + +2008-11-09 Akim Demaille + + Require the generation of parse-gram.output. + * src/Makefile.am (YACC): Pass --report=all. + +2008-11-09 Akim Demaille + + Formatting changes. + +2008-11-09 Akim Demaille + + Update TODO. + * TODO: Remove obsolete items. + Update others. + +2008-11-09 Akim Demaille + + Enhance bench.pl. + * etc/bench.pl.in (parse, parse_expr, parse_term, parse_fact) + (@token, $grammar, $bench): New. + (generate_grammar_variant): Rename as... + (generate_grammar_list): this. + (generate_grammar): Adjust. + (bench_grammar): Rename as... + (bench): this. + Use it in the various bench-marking routines. + (-b, -g): New options. + +2008-11-09 Akim Demaille + + Use a static hierarchy for symbols in the C++ parser. + * data/lalr1.cc (symbol_base_type, symbol_type) + (stack_symbol_type): Make it a static hierarchy. + Adjust dependencies. + +2008-11-09 Akim Demaille + + bench.pl -d, --directive. + * etc/bench.pl.in (@directive): New. + (&bench_grammar): Use it. + (&bench_list_grammar): New, to provide access to the "variant" + grammar. + Use it. + (getopts): Support -d, --directive. + +2008-11-09 Akim Demaille + + Use inline for small operations. + * data/lalr1.cc (symbol_base_type, symbol_type) + (stack_symbol_type): Declare constructor and other operations as + inline. + (yy_destroy_): Inline. + +2008-11-09 Akim Demaille + + Introduce a hierarchy for symbols. + * data/lalr1.cc (symbol_base_type, symbol_type): New. + (data_type): Rename as... + (stack_symbol_type): this. + Derive from symbol_base_type. + (yy_symbol_value_print_): Merge into... + (yy_symbol_print_): this. + Rename as... + (yy_print_): this. + (yydestruct_): Rename as... + (yy_destroy_): this. + (b4_symbols_actions, YY_SYMBOL_PRINT): Adjust. + (parser::parse): yyla is now of symbol_type. + Use its type member instead of yytoken. + +2008-11-09 Akim Demaille + + Rename data_type and stack_symbol_type. + * data/lalr1.cc (data_type): Rename as... + (stack_symbol_type): this. + +2008-11-09 Akim Demaille + + Handle semantic value and location together. + * data/lalr1.cc (b4_symbol_actions): Bounce $$ and @$ to + yydata.value and yydata.location. + (yy_symbol_value_print_, yy_symbol_print_, yydestruct_) + (YY_SYMBOL_PRINT): Now take semantic value and location as a + single arg. + Adjust all callers. + (yydestruct_): New overload for a stack symbol. + +2008-11-09 Akim Demaille + + Push a complete symbol, not connected parts. + * data/lalr1.cc (yypush_): Take a data_type&, not disconnected + state, value and location. + Adjust callers. + +2008-11-09 Akim Demaille + + Agregate yylval and yylloc. + * data/lalr1.cc (parser::yylval, parser::yylloc): Replace by... + (parser::yyla): this. + +2008-11-09 Akim Demaille + + Rely on the state stack to display reduction traces. + To display rhs symbols before a reduction, we used information + about the rule reduced, which required the tables yyrhs and + yyprhs. Now use rely only on the state stack to get the same + information. + + * data/lalr1.cc (b4_rhs_data, b4_rhs_state): New. + Use them. + (parser::yyrhs_, parser::yyprhs_): Remove. + (parser::yy_reduce_print_): Use the state stack. + +2008-11-09 Akim Demaille + + Fuse yyval and yyloc into yylhs. + * data/lalr1.cc (b4_lhs_value, b4_lhs_location): Adjust to using + yylhs. + (parse): Replace yyval and yyloc with yylhs.value and + yylhs.location. + After a user action, compute yylhs.state earlier. + (yyerrlab1): Do not play tricks with yylhs.location, rather, use a + fresh error_token. + +2008-11-09 Di-an Jan + + Remove unused variable. + * src/output.c (type_names_output): Remove unused variable sep. + +2008-11-09 Paolo Bonzini + + Change tests/output.at quoting. + * tests/output.at (AT_CHECK_OUTPUT): Use conventional m4 quoting when + expanding arguments. + +2008-11-07 Joel E. Denny + + Don't add a semicolon to actions for %skeleton or %language. + It breaks Java test cases as reported by Akim Demaille. + * src/scan-code.l: Implement. + +2008-11-07 Joel E. Denny + + Clean up %skeleton and %language priority implementation. + * src/getargs.c (skeleton_prio): Use default_prio rather than 2, and + remove static qualifier because others will soon need to see it. + (language_prio): Likewise. (getargs): Use command_line_prio rather than 0. * src/getargs.h (command_line_prio, grammar_prio, default_prio): New enum fields. @@ -3278,15 +5258,119 @@ (language_prio): Extern it. * src/parse-gram.y: Use grammar_prio rather than 1. -2008-11-04 Akim Demaille +2008-11-07 Akim Demaille - * NEWS: Mention the trailing semicolon in action. + Moving push traces into yypush_. + * data/lalr1.cc (yypush_): Now takes a optional trace message. + Adjust all uses. -2008-11-04 Akim Demaille +2008-11-07 Akim Demaille - Reformat NEWS. - * NEWS: Use more outline-mode markup. - Suggested by Jim Meyering. + The single-stack C++ parser is now the standard one. + * data/lalr1.cc: Rename as... + * data/lalr1-split.cc: this. + * data/lalr1-fusion.cc: Rename as... + * data/lalr1.cc: this. + * etc/bench.pl.in: Adjust. + +2008-11-07 Akim Demaille + + Avoid empty-if warnings. + Reported by Quentin Hocquet. + + * data/lalr1-fusion.cc (YY_SYMBOL_PRINT, YY_REDUCE_PRINT) + (YY_STACK_PRINT): Provide some contents even when !YYDEBUG. + +2008-11-07 Akim Demaille + + Pass command line location to skeleton_arg and language_argmatch. + * src/getargs.h, src/getargs.c (skeleton_arg, language_argmatch): + The location argument is now mandatory. + Adjust all dependencies. + (getargs): Use command_line_location. + +2008-11-07 Akim Demaille + + -D, --define. + * src/getargs.c (usage): Document -D. + Fix help string for --locations. + (command_line_location): New. + (short_options, long_options, getargs): Support -D, --define. + (getargs): Move -d support at the right place. + * doc/bison.texinfo (Bison Options): Update. + * tests/input.at (%define, --define): New. + +2008-11-07 Akim Demaille + + Initialize the muscle table before parsing the command line. + * src/getargs.c (quotearg.h, muscle_tab.h): Include. + (getargs): Define file_name. + * src/main.c (main): Initialize muscle_tab before calling + getargs. + * src/muscle_tab.c (muscle_init): No longer define file_name, as + its value is not available yet. + +2008-11-07 Akim Demaille + + Locations without columns for command line arguments. + * src/location.c (location_print): Don't display negative columns. + * src/location.h: Document this. + +2008-11-07 Akim Demaille + + Fix --help. + * src/getargs.c (usage): Fix help string for -W. + +2008-11-07 Akim Demaille + + Handle more general types of option arguments. + * build-aux/cross-options.pl: The argument ends at the first + space, not the first non-symbol character. + Use @var for each word appearing the argument description. + +2008-11-07 Akim Demaille + + Destroy the variants that remain on the stack in case of error. + * data/lalr1-fusion.cc (yydestruct_): Invoke the variant's + destructor. + Display the value only if yymsg is nonnull. + (yyreduce): Invoke yydestruct_ when popping lhs symbols. + +2008-11-07 Akim Demaille + + Add "%define assert" to variants. + This is used to help the user catch cases where some value gets + ovewritten by a new one. This should not happen, as this will + probably leak. + + Unfortunately this uncovered a bug in the C++ parser itself: the + lookahead value was not destroyed between two calls to yylex. For + instance if the previous lookahead was a std::string, and then an int, + then the value of the std::string was correctly taken (i.e., the + lookahead was now an empty string), but std::string structure itself + was not reclaimed. + + This is now done in variant::build(other&) (which is used to take the + value of the lookahead): other is not only stolen from its value, it + is also destroyed. This incurs a new performance penalty of a few + percent, and union becomes faster again. + + * data/lalr1-fusion.cc (variant::build(other&)): Destroy other. + (b4_variant_if): New. + (variant::built): New. + Use it whereever the status of the variant changes. + * etc/bench.pl.in: Check the penalty of %define assert. + +2008-11-07 Akim Demaille + + Use "%define variant" in bench.pl. + * etc/bench.pl.in: No longer use the pseudo directive %variants, + just use %define variants. + +2008-11-07 Akim Demaille + + Regen. + * src/parse-gram.h, src/parse-gram.c: Regen. 2008-11-04 Joel E. Denny @@ -3298,6 +5382,369 @@ * tests/regression.at (Fix user actions without a trailing semicolon): New test case. +2008-11-04 Akim Demaille + + Use b4_copyright_years. + * data/yacc.c (b4_copyright_years): New. + Fix its value according to the comments in the file. + Use it and undefine it. + +2008-11-04 Akim Demaille + + Formatting changes. + * data/lalr1-fusion.cc, src/parse-gram.y: here. + +2008-11-04 Akim Demaille + + Formatting changes. + * data/lalr1-fusion.cc: here. + +2008-11-04 Akim Demaille + + Use strict on bench.pl. + * etc/bench.pl.in (&run, &generate_grammar): New. + Rename the grammar generating functions for consistency. + Change the interface so that the list of benches to run is passed + as (optionless) arguments. + (&compile): Use &run. + +2008-11-04 Akim Demaille + + Remove spurious initial empty lines. + * data/glr.c, data/glr.cc, data/lalr1.cc, data/lalr1.java, + * data/yacc.c: End the @output lines with an @. + +2008-11-04 Akim Demaille + + Improve the display of sizes. + * etc/bench.p.in: Higher precision. + Sort by decreasing size. + +2008-11-04 Akim Demaille + + Don't memcpy C++ structures. + * data/lalr1-fusion.cc (b4_symbol_variant): Adjust additional + arguments. + (variant::build): New overload for + copy-construction-that-destroys. + (variant::swap): New. + (parser::yypush_): Use it in variant mode. + +2008-11-04 Akim Demaille + + Better defaults for bench.pl. + * etc/bench.pl.in ($verbose, $cflags, $iterations): Change the + default values. + Adjust &verbose uses. + (-q, --quiet): New. + +2008-11-04 Akim Demaille + + Make variant.yy more complex. + std::list cannot be copied via memcpy, they are more demanding than + std::string. Use one std::list to strengthen the test. + + * examples/variant.yy: Use lalr1-fusion.cc, not lalr1.cc. + Adjust. + Create a list of strings, instead of a single large string. + +2008-11-04 Akim Demaille + + bench.pl --bench. + * etc/bench.pl.in (--bench, $bench): New. + +2008-11-04 Akim Demaille + + Sort methods. + * data/lalr1-fusion.cc (destroy): Use as() in its definition. + Define it after as(). + +2008-11-04 Akim Demaille + + Useless parens. + * data/lalr1-fusion.cc (b4_rhs_location): Remove useless parens. + +2008-11-04 Akim Demaille + + Issue missing synclines after user actions. + * data/c.m4 (b4_case): Issue synclines on the output file. + +2008-11-04 Akim Demaille + + Remove trailing empty line. + * data/lalr1-fusion.cc: Don't add an empty line after the user's + epilogue. + +2008-11-04 Akim Demaille + + Fix output of copyright years. + * data/bison.m4 (b4_copyright): Fix the indentation of the + copyright year paragraph. + Use b4_copyright_years when no years are given. + * data/lalr1.cc, data/lalr1-fusion.cc, data/location.cc + (b4_copyright_years): New. + Use it. + +2008-11-04 Akim Demaille + + Avoid the spurious initial empty line. + * data/lalr1-fusion.cc, data/location.cc: Put a trailing "@" at + the end of @output request to suppress the empty line that + results. + +2008-11-04 Akim Demaille + + Remove parser::rhs_number_type. + * data/lalr1-fusion.cc (rhs_number_type): No longer define it. + (yyrhs_): Use b4_table_define. + +2008-11-04 Akim Demaille + + Fix iteration type. + * data/lalr1-fusion.cc: Use an int to iterate up to an int. + +2008-11-04 Akim Demaille + + Factor the declaration of the integer tables. + * data/lalr1-fusion.cc (b4_table_define): New. + Use it. + +2008-11-03 Akim Demaille + + Fix indentation of tables in lalr1.cc + * data/lalr1-fusion.cc: Fix the indentation. + +2008-11-03 Akim Demaille + + Destroy the lhs symbols after reduction. + * data/lalr1-fusion.cc (parse): After the user action, when in + variant mode, destroy the lhs symbols. + +2008-11-03 Akim Demaille + + Simplify yysyntax_error_ use. + * data/lalr1-fusion.cc (yysyntax_error_): Always pass it the token + type, but make it unnamed in the declaration when it is not used. + +2008-11-03 Akim Demaille + + Let yy::variant::build return an lvalue. + * data/lalr1-fusion.cc (variant::build): Return a reference to the + object. + +2008-11-03 Akim Demaille + + Define yy::variant only when needed. + * data/lalr1-fusion.cc (yy::variant): Define only if variants are + used. + +2008-11-03 Akim Demaille + + Bench the three-stack lalr1.cc. + * etc/bench.pl.in: Bench the three-stack lalr1.cc vs. the + one-stack one. + +2008-11-03 Akim Demaille + + Fail on parse error in calc++. + * doc/bison.texinfo (calc++.cc): Propagate failures to the exit + status. + * examples/calc++/test ($me, $number, $exit, run): New. + Use them to propagate errors to the exit status. + +2008-11-03 Akim Demaille + + Don't specify the skeleton twice in the example. + * examples/calc++/Makefile.am: Don't pass -S to Bison, the grammar + file does what is needed. + +2008-11-03 Akim Demaille + + bench: Improve output. + * etc/bench.pl.in (bench_grammar): Tune the printf format. + +2008-11-03 Akim Demaille + + bench: check impact of %debug on variants. + * etc/bench.pl.in (variant_grammar): Fix the computation of + $variant. + Generate a grammar file that can work with or without %debug. + Do use the @directive. + (bench_variant_parser): Check impact of %debug. + (@directives): Rename all the occurrences to... + (@directive): this, for consistency. + +2008-11-03 Akim Demaille + + bench: report the size too. + * etc/bench.pl.in ($iterations): Defaults to -3. + (&bench_grammar): Require hireswallclock. + Compute and display the size of the result. + More comments. + +2008-11-03 Akim Demaille + + bench: More use of the verbosity level. + * etc/bench.pl.in ($verbose, &verbose): New. + Use them. + More POD documentation. + +2008-11-03 Akim Demaille + + bench.pl: a command line interface + * etc/bench.pl.in: More doc. + Some fixes in the documentation. + ($cflags, $iterations, &help, &getopt): New. + Use them. + (&variant_grammar): Let the number of stages be 10 times what is + specified. + +2008-11-03 Akim Demaille + + Bench the use of Boost.Variants. + * etc/bench.pl.in ($cxx, &variant_grammar, &bench_variant_parser): + New. + (&compile): Be ready to compile C++ parsers. + (&bench_push_parser): Move debug information to the outermost + level. + * THANKS: Add Michiel De Wilde. + +2008-11-03 Akim Demaille + + bench.pl: Pass directives as a list instead of as a string. + * etc/bench.pl.in (&directives): New. + (&triangular_grammar, &calc_grammar): Use it to format the Bison + directives. + (&triangular_grammar): Do use the directives (were ignored). + (&bench_grammar, &bench_push_parser): Adjust to pass lists of + directives. + +2008-11-03 Akim Demaille + + Improve genericity of bench.pl. + * etc/bench.pl.in (&bench_grammar): Take the set of benches as + argument. + (&bench_push_parser): New. + Call it. + +2008-11-03 Akim Demaille + + Add documentation to bench.pl. + * etc/bench.pl.in: Comment changes. + +2008-11-03 Akim Demaille + + Fuse the three stacks into a single one. + + In order to make it easy to perform benchmarks to ensure that + there are no performance loss, lalr1.cc is forked into + lalr1-fusion.cc. Eventually, lalr1-fusion.cc will replace + lalr1.cc. + + Meanwhile, to make sure that lalr1-fusion.cc is correctly + exercized by the test suite, the user must install a symbolic link + from lalr1.cc to it. + + Instead of having three stacks (state, value, location), use a + stack of triples. This considerably simplifies the code (and it + will be easier not to require locations as currently does the C++ + parser), and also gives a 10% speedup according to + etc/bench (probably mainly since memory allocation is done once + instead of three times). + + Another motivation is to make it easier to destruct properly + semantic values: now that they are bound to their state (hence + symbol type) it will be easier to call the appropriate destructor. + + These changes should probably benefit the C parser too. + + * data/lalr1.cc: Copy as... + * data/lalr1-fusion.cc: this new file. + (b4_rhs_value, b4_rhs_location): New definitions overriding those + from c++.m4. + (state_stack_type, semantic_stack_type, location_stack_type) + (yystate_stack_, yysemantic_stack_, yylocation_stack_): Remove. + (data_type, stack_type, yystack_): New. + (YYLLOC_DEFAULT, yypush_): Adjust. + (yyerror_range): Now based on data_type, not location_type. + +2008-11-03 Akim Demaille + + Push the state, value, and location at the same time. + This is needed to prepare a forthcoming patch that fuses the three + stacks into one. + + * data/lalr1.cc (parser::yypush_): New. + (parser::yynewstate): Change the semantics: instead of arriving to + this label when value and location have been pushed, but yystate + is to be pushed on the state stack, now the three of them must + have been pushed before. yystate still must be the new state. + This allows to use yypush_ everywhere instead of individual + handling of the stacks. + +2008-11-03 Akim Demaille + + Prefer references to pointers. + * data/lalr1.cc (b4_symbol_actions): New, overrides the default C + definition to use references instead of pointers. + (yy_symbol_value_print_, yy_symbol_print_, yydestruct_): + Take the value and location as references. + Adjust callers. + +2008-11-03 Akim Demaille + + stack::size instead of stack::height. + * data/lalr1.cc (stack::height): Rename as... + (stack::size): this. + Fix the output type. + Comment changes. + +2008-11-03 Akim Demaille + + Use variants to support objects as semantic values. + This patch was inspired by work by Michiel De Wilde. But he used + Boost variants which (i) requires Boost on the user side, (ii) is + slow, and (iii) has useless overhead (the parser knows the type of + the semantic value there is no reason to duplicate this + information as Boost.Variants do). + + This implementation reserves a buffer large enough to store the + largest objects. yy::variant implements this buffer. It was + implemented with Quentin Hocquet. + + * src/output.c (type_names_output): New. + (output_skeleton): Invoke it. + * data/c++.m4 (b4_variant_if): New. + (b4_symbol_value): If needed, provide a definition for variants. + * data/lalr1.cc (b4_symbol_value, b4_symbol_action_) + (b4_symbol_variant, _b4_char_sizeof_counter, _b4_char_sizeof_dummy) + (b4_char_sizeof, yy::variant): New. + (parser::parse): If variants are requested, define + parser::union_type, parser::variant, change the definition of + semantic_type, construct $$ before running the user action instead + of performing a default $$ = $1. + * examples/variant.yy: New. + Based on an example by Michiel De Wilde. + +2008-11-03 Akim Demaille + + Parameterize the extraction of semantic values. + To make future changes easier, no longer rely on ".TYPE" being the + way to get a semantic value. + + * data/c.m4 (b4_symbol_value): New. + Use it. + * data/c++.m4, data/yacc.c: Use it. + * data/glr.c: Use b4_symbol_value. + (b4_rhs_data): New. + Use it. + +2008-11-03 Akim Demaille + + Prepare easier M4 changes. + * data/lalr1.cc: Use escaped [] instead of literals to prepare + future changes. + 2008-11-02 Joel E. Denny Initiate further development. diff --git a/Makefile.am b/Makefile.am index aed166e6..a9861190 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ -## Process this file with automake to produce Makefile.in -*-Makefile-*- - -## Copyright (C) 2001-2012 Free Software Foundation, Inc. +## Process this file with automake to produce Makefile.in. +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or @@ -15,29 +15,51 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +AUTOMAKE_OPTIONS = subdir-objects ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = build-aux po runtime-po lib data src doc examples tests etc +SUBDIRS = po runtime-po . # Files installed for use by Automake. aclocaldir = @aclocaldir@ aclocal_DATA = m4/bison-i18n.m4 EXTRA_DIST = .prev-version .version \ - cfg.mk ChangeLog-1998 ChangeLog-2012 PACKAGING \ - djgpp/Makefile.maint djgpp/README.in djgpp/config.bat \ - djgpp/config.sed djgpp/config.site djgpp/config_h.sed \ - djgpp/subpipe.c djgpp/subpipe.h djgpp/djunpack.bat \ - djgpp/fnchange.lst djgpp/testsuite.sed + cfg.mk ChangeLog-1998 ChangeLog-2012 PACKAGING + +## Running the bison from this tarball. To generate our own parser, +## but also to run the tests. Of course, you ought to keep a sane +## version of Bison nearby... +BISON = $(top_builddir)/tests/bison +BISON_IN = $(top_srcdir)/tests/bison.in +YACC = $(BISON) -y +AM_YFLAGS = -d -v --warnings=all,error --report=all + +# Initialization before completion by local.mk's. +AM_CFLAGS = $(WARN_CFLAGS) +# Find builddir/src/scan-code.c etc. +AM_CPPFLAGS = -I. -Ilib -I$(top_srcdir) -I$(top_srcdir)/lib +BUILT_SOURCES = +CLEANFILES = +DISTCLEANFILES = +EXTRA_DIST += $(dist_TESTS) +MOSTLYCLEANDIRS = +MOSTLYCLEANFILES = +SUFFIXES = +TESTS = $(dist_TESTS) +check_PROGRAMS = +dist_TESTS = +noinst_LIBRARIES = -MAINTAINER_CHECKS = \ - maintainer-check \ - maintainer-push-check \ - maintainer-xml-check \ - maintainer-release-check -.PHONY: $(MAINTAINER_CHECKS) -$(MAINTAINER_CHECKS): - $(AM_V_GEN)cd tests && $(MAKE) $(AM_MAKEFLAGS) $@ +include build-aux/local.mk +include data/local.mk +include djgpp/local.mk +include doc/local.mk +include etc/local.mk +include examples/local.mk +include lib/local.mk +include src/local.mk +include tests/local.mk # See comments in build-aux/git-version-gen. However, we make .version depend # on configure so that .version and VERSION/PACKAGE_VERSION stay in sync in the @@ -48,20 +70,20 @@ $(MAINTAINER_CHECKS): # a developer might naively reference .version in a test case while the bison # executable still compiles with VERSION, and so the test case might fail or # pass incorrectly. -BUILT_SOURCES = $(top_srcdir)/.version +BUILT_SOURCES += $(top_srcdir)/.version $(top_srcdir)/.version: configure - $(AM_V_GEN)echo $(VERSION) > $@-t && mv $@-t $@ + echo $(VERSION) > $@-t && mv $@-t $@ dist-hook: gen-ChangeLog - $(AM_V_GEN)echo $(VERSION) > $(distdir)/.tarball-version + echo $(VERSION) > $(distdir)/.tarball-version .PHONY: update-b4-copyright update-package-copyright-year update-b4-copyright: - $(AM_V_GEN) find data -type f \ - | grep -v -E '^data/bison.m4$$' \ + find data -type f \ + | grep -v -E '^data/bison.m4$$' \ | xargs $(build_aux)/$@ @echo 'warning: src/parse-gram.[hc] may need to be regenerated.' update-package-copyright-year: - $(AM_V_GEN)$(build_aux)/$@ configure.ac + $(build_aux)/$@ configure.ac gen_start_date = 2012-01-16 .PHONY: gen-ChangeLog diff --git a/NEWS b/NEWS index f940d8ed..bd47608b 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,145 @@ GNU Bison NEWS * Noteworthy changes in release ?.? (????-??-??) [?] +** Incompatible changes + +*** Obsolete features + + Support for YYFAIL is removed, as announced since Bison 2.4.2. + Support for yystype and yyltype (instead of YYSTYPE and YYLTYPE) + is removed, as announced in Bison 1.875. + +** Warnings + +*** Warning categories are now displayed + + For instance: + + foo.y:4.6: warning: type clash on default action: != [-Wother] + +*** Useless semantic types + + Bison now warns about useless (uninhabited) semantic types. Since + semantic types are not declared to Bison (they are defined in the opaque + %union structure), it is %printer/%destructor directives about useless + types that trigger the warning: + + %token term + %type nterm + %printer {} + %destructor {} + %% + nterm: term { $$ = $1; }; + + 3.28-34: warning: type is used, but is not associated to any symbol + 4.28-34: warning: type is used, but is not associated to any symbol + +*** Undeclared symbols + + Bison used to raise an error for %printer and %destructor directives for + undefined symbols. + + %printer {} symbol1 + %destructor {} symbol2 + %% + exp: "a"; + + This is now only a warning. + +*** Useless destructors or printers + + Bison now warns about useless destructors or printers. In the following + example, the printer for , and the destructor for are + useless: all symbols of (token1) already have a printer, and all + symbols of type (token2) already have a destructor. + + %token token1 + token2 + token3 + token4 + %printer {} token1 + %destructor {} token2 + +** Additional yylex/yyparse arguments + + The new directive %param declares additional arguments to both yylex and + yyparse. The %lex-param, %parse-param, and %param directives support one + or more arguments. Instead of + + %lex-param {arg1_type *arg1} + %lex-param {arg2_type *arg2} + %parse-param {arg1_type *arg1} + %parse-param {arg2_type *arg2} + + one may now declare + + %param {arg1_type *arg1} {arg2_type *arg2} + +** Java skeleton improvements + + The constants for token names were moved to the Lexer interface. + Also, it is possible to add code to the parser's constructors using + "%code init" and "%define init_throws". + +** C++ skeletons improvements + +*** parser header (%defines) is no longer mandatory (lalr1.cc) + + In which case, if needed, the support classes are defined in the generated + parser, instead of additional files (location.hh, position.hh and + stack.hh). + +*** locations are no longer mandatory (lalr1.cc, glr.cc) + + Both lalr1.cc and glr.cc no longer require %location. + +*** syntax_error exception (lalr1.cc) + + The C++ parser features a syntax_error exception, which can be + thrown from the scanner or from user rules to raise syntax errors. + This facilitates reporting errors caught in sub-functions (e.g., + rejecting too large integral literals from a conversion function + used by the scanner, or rejecting invalid combinations from a + factory invoked by the user actions). + +** Variable api.tokens.prefix + + The variable api.tokens.prefix changes the way tokens are identified in + the generated files. This is especially useful to avoid collisions + with identifiers in the target language. For instance + + %token FILE for ERROR + %define api.tokens.prefix "TOK_" + %% + start: FILE for ERROR; + + will generate the definition of the symbols TOK_FILE, TOK_for, and + TOK_ERROR in the generated sources. In particular, the scanner must + use these prefixed token names, although the grammar itself still + uses the short names (as in the sample rule given above). + +** Variable api.namespace + + The "namespace" variable is renamed "api.namespace". Backward + compatibility is ensured, but upgrading is recommended. + +** Variable parse.error + + The variable error controls the verbosity of error messages. The + use of the %error-verbose directive is deprecated in favor of + %define parse.error "verbose". + +** Semantic predicates + + The new, experimental, semantic-predicate feature allows actions of + the form %?{ BOOLEAN-EXPRESSION }, which cause syntax errors (as for + YYERROR) if the expression evaluates to 0, and are evaluated immediately + in GLR parsers, rather than being deferred. The result is that they + allow the programmer to prune possible parses based on the values of + run-time expressions. + +* Noteworthy changes in release ?.? (????-??-??) [?] + * Noteworthy changes in release 2.6.1 (2012-07-30) [stable] @@ -43,7 +182,7 @@ GNU Bison NEWS * Noteworthy changes in release 2.6 (2012-07-19) [stable] -** Future Changes +** Future changes: The next major release of Bison will drop support for the following deprecated features. Please report disagreements to bug-bison@gnu.org. @@ -1844,7 +1983,8 @@ along with this program. If not, see . LocalWords: namespaces strerror const autoconfiguration Dconst Autoconf's FDL LocalWords: Automake TMPDIR LESSEQ ylwrap endif yydebug YYTOKEN YYLSP ival hh LocalWords: extern YYTOKENTYPE TOKENTYPE yytokentype tokentype STYPE lval pdf - LocalWords: lang yyoutput dvi html ps POSIX lvalp llocp + LocalWords: lang yyoutput dvi html ps POSIX lvalp llocp Wother nterm arg init + LocalWords: TOK Local Variables: mode: outline diff --git a/README-hacking b/README-hacking index bb91ac06..2b92edcf 100644 --- a/README-hacking +++ b/README-hacking @@ -35,6 +35,13 @@ of the .output file etc. This excludes impossible error messages (comparable to assert/abort), and all the --trace output which is meant for the maintainers only. +** Horizontal tabs +Do not add horizontal tab characters to any file in Bison's repository +except where required. For example, do not use tabs to format C code. +However, make files, ChangeLog, and some regular expressions require +tabs. Also, test cases might need to contain tabs to check that Bison +properly processes tabs in its input. + * Working from the repository @@ -226,6 +233,9 @@ release: that it does not make sense for glr.c, which should be ANSI, but currently is actually GNU C, nor for lalr1.cc. +- Test with a very recent version of GCC for both C and C++. Testing + with older versions that are still in use is nice too. + * Release Procedure This section needs to be updated to take into account features from diff --git a/REFERENCES b/REFERENCES index 23084822..d55cdae8 100644 --- a/REFERENCES +++ b/REFERENCES @@ -25,8 +25,8 @@ LALR(1) Look-Ahead Sets", ACM Transactions on Programming Languages and Systems (TOPLAS) 4, 4 (October 1982), 615-649. Their technique is the standard one now.) - paul rubin - free software foundation + paul rubin + free software foundation [DeRemer-Pennello reference corrected by Paul Eggert , diff --git a/THANKS b/THANKS index 75037b1f..5e76b1d1 100644 --- a/THANKS +++ b/THANKS @@ -71,6 +71,7 @@ Matt Kraai kraai@alumni.cmu.edu Matt Rosing rosing@peakfive.com Michael Hayes m.hayes@elec.canterbury.ac.nz Michael Raskin 7c6f434c@mail.ru +Michiel De Wilde mdewilde.agilent@gmail.com Mickael Labau labau_m@epita.fr Mike Castle dalgoda@ix.netcom.com Neil Booth NeilB@earthling.net @@ -88,6 +89,7 @@ Per Allansson per@appgate.com Peter Fales psfales@lucent.com Peter Hamorsky hamo@upjs.sk Piotr Gackiewicz gacek@intertel.com.pl +Quentin Hocquet hocquet@gostai.com Quoc Peyrot chojin@lrde.epita.fr R Blake blakers@mac.com Raja R Harinath harinath@cs.umn.edu diff --git a/TODO b/TODO index 4f628a20..1c5d3585 100644 --- a/TODO +++ b/TODO @@ -1,13 +1,22 @@ * Short term -** Variable names. -What should we name `variant' and `lex_symbol'? +** scan-code.l +Avoid variables for format strings, as then GCC cannot check them. +show_sub_messages should call show_sub_message. + +** m4 names +b4_shared_declarations is no longer what it is. Make it +b4_parser_declaration for instance. + +** glr.cc: %defines +it should not be mandatory. -** Use b4_symbol in all the skeleton -Move its definition in the more standard places and deploy it in other -skeletons. Then remove the older system, including the tables -generated by output.c +** stack.hh +Get rid of it. The original idea is nice, but actually it makes +the code harder to follow, and uselessly different from the other +skeletons. -** Update the documentation on gnu.org +** Variable names. +What should we name `variant' and `lex_symbol'? ** Get rid of fake #lines [Bison: ...] Possibly as simple as checking whether the column number is nonnegative. @@ -39,10 +48,6 @@ as lr0.cc, why upper case? Enhance bench.pl with %b to run different bisons. * Various -** Warnings -Warnings about type tags that are used in printer and dtors, but not -for symbols? - ** YYERRCODE Defined to 256, but not used, not documented. Probably the token number for the error token, which POSIX wants to be 256, but which @@ -88,9 +93,6 @@ so both 256 and 257 are "mysterious". "\"end of command\"", "error", "$undefined", "\"=\"", "\"break\"", -** YYFAIL -It is seems to be *really* obsolete now, shall we remove it? - ** yychar == yyempty_ The code in yyerrlab reads: diff --git a/bootstrap.conf b/bootstrap.conf index 165d5e7d..e90cf12d 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -23,7 +23,7 @@ gnulib_modules=' error extensions fdl fopen-safer getopt-gnu gettext git-version-gen gitlog-to-changelog gpl-3.0 hash inttypes isnan javacomp-script - javaexec-script ldexpl malloc-gnu mbschr mbsrchr + javaexec-script ldexpl malloc-gnu mbswidth obstack obstack-printf @@ -34,7 +34,11 @@ gnulib_modules=' spawn-pipe stdbool stpcpy strdup-posix strerror strtoul strverscmp unistd unistd-safer unlocked-io update-copyright unsetenv verify warnings - xalloc xalloc-die xmemdup0 xstrndup + xalloc + xalloc-die + xconcat-filename + xmemdup0 + xstrndup fprintf-posix printf-posix snprintf-posix sprintf-posix vsnprintf-posix vsprintf-posix @@ -44,9 +48,9 @@ gnulib_modules=' XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\ --from-code=UTF-8\\\ --flag=asprintf:2:c-format\\\ - --flag=complain:1:c-format --flag=complain_at:2:c-format\\\ - --flag=fatal:1:c-format --flag=fatal_at:2:c-format\\\ - --flag=warn:1:c-format --flag=warn_at:2:c-format\\\ + --flag=complain:2:c-format\\\ + --flag=complain_at:3:c-format\\\ + --flag=complain_at_indent:4:c-format\\\ --flag=unexpected_end:2:c-format\\\ ' XGETTEXT_OPTIONS_RUNTIME=$XGETTEXT_OPTIONS'\\\ @@ -74,6 +78,9 @@ gnulib_tool_option_extras='--symlink --makefile-name=gnulib.mk' bootstrap_post_import_hook() { + # Massage lib/gnulib.mk before using it later in the bootstrapping process. + etc/prefix-gnulib-mk --lib-name=$gnulib_name lib/$gnulib_mk + # Ensure that ChangeLog exists, for automake. test -f ChangeLog || touch ChangeLog } diff --git a/build-aux/.gitignore b/build-aux/.gitignore index 17aa5451..e2c69c38 100644 --- a/build-aux/.gitignore +++ b/build-aux/.gitignore @@ -1,11 +1,10 @@ -/Makefile -/Makefile.in /announce-gen /arg-nonnull.h /c++defs.h /compile /config.guess /config.rpath +/config.rpath~ /config.sub /depcomp /do-release-commit-and-tag @@ -20,6 +19,7 @@ /link-warning.h /mdate-sh /missing +/test-driver /texinfo.tex /update-copyright /useless-if-before-free diff --git a/build-aux/Makefile.am b/build-aux/Makefile.am deleted file mode 100644 index 5b077b8d..00000000 --- a/build-aux/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -## Copyright (C) 2006, 2009-2012 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -EXTRA_DIST = \ - cross-options.pl \ - darwin11.4.0.valgrind \ - prev-version.txt \ - update-b4-copyright diff --git a/build-aux/cross-options.pl b/build-aux/cross-options.pl index 7762e276..0f5009ce 100755 --- a/build-aux/cross-options.pl +++ b/build-aux/cross-options.pl @@ -18,50 +18,50 @@ while () \s # Spaces. /x) { - my ($short, $long, $opt, $arg) = ($1, $2, $3, $4); - $short = '' if ! defined $short; - $short = '-d' if $long eq '--defines' && ! $short; - my $dir = '%' . substr($long, 2); - if (index ($scanner, "\"$dir\"") < 0) - { - if ($long eq '--force-define') { $dir = '%define'; } - else { $dir = ''; } - } - if ($arg) - { + my ($short, $long, $opt, $arg) = ($1, $2, $3, $4); + $short = '' if ! defined $short; + $short = '-d' if $long eq '--defines' && ! $short; + my $dir = '%' . substr($long, 2); + if (index ($scanner, "\"$dir\"") < 0) + { + if ($long eq '--force-define') { $dir = '%define'; } + else { $dir = ''; } + } + if ($arg) + { # if $opt, $arg contains the closing ]. substr ($arg, -1) = '' if $opt eq '['; - $arg =~ s/^=//; + $arg =~ s/^=//; $arg = lc ($arg); - my $dir_arg = $arg; + my $dir_arg = $arg; # If the argument is compite (e.g., for --define[=NAME[=VALUE]]), # put each word in @var, to build @var{name}[=@var{value}], not # @var{name[=value]}]. - $arg =~ s/(\w+)/\@var{$1}/g; - my $long_arg = "=$arg"; - if ($opt eq '[') { - $long_arg = "[$long_arg]"; - $arg = "[$arg]"; - } - # For arguments of directives: this only works if all arguments - # are strings and have the same syntax as on the command line. - if ($dir_arg eq 'name[=value]') - { - $dir_arg = '@var{name} ["@var{value}"]'; - } - else - { - $dir_arg =~ s/(\w+)/\@var{"$1"}/g; - $dir_arg = '[' . $dir_arg . ']' - if $opt eq '['; - } - $long = "$long$long_arg"; - $short = "$short $arg" if $short && $short ne '-d'; - $dir = "$dir $dir_arg" if $dir; - } - $option{$long} = $short; - $directive{$long} = $dir; + $arg =~ s/(\w+)/\@var{$1}/g; + my $long_arg = "=$arg"; + if ($opt eq '[') { + $long_arg = "[$long_arg]"; + $arg = "[$arg]"; + } + # For arguments of directives: this only works if all arguments + # are strings and have the same syntax as on the command line. + if ($dir_arg eq 'name[=value]') + { + $dir_arg = '@var{name} ["@var{value}"]'; + } + else + { + $dir_arg =~ s/(\w+)/\@var{"$1"}/g; + $dir_arg = '[' . $dir_arg . ']' + if $opt eq '['; + } + $long = "$long$long_arg"; + $short = "$short $arg" if $short && $short ne '-d'; + $dir = "$dir $dir_arg" if $dir; + } + $option{$long} = $short; + $directive{$long} = $dir; } } diff --git a/build-aux/local.mk b/build-aux/local.mk new file mode 100644 index 00000000..7daf6cf7 --- /dev/null +++ b/build-aux/local.mk @@ -0,0 +1,23 @@ +## Makefile for Bison testsuite. + +# Copyright (C) 2000-2012 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +EXTRA_DIST += \ + build-aux/cross-options.pl \ + build-aux/darwin11.4.0.valgrind \ + build-aux/move-if-change \ + build-aux/prev-version.txt \ + build-aux/update-b4-copyright diff --git a/build-aux/move-if-change b/build-aux/move-if-change new file mode 120000 index 00000000..2df61a60 --- /dev/null +++ b/build-aux/move-if-change @@ -0,0 +1 @@ +../gnulib/build-aux/move-if-change \ No newline at end of file diff --git a/cfg.mk b/cfg.mk index 53855aef..af1e09e8 100644 --- a/cfg.mk +++ b/cfg.mk @@ -36,15 +36,9 @@ url_dir_list = \ ftp://$(gnu_rel_host)/gnu/bison # Tests not to run as part of "make distcheck". -# Exclude changelog-check here so that there's less churn in ChangeLog -# files -- otherwise, you'd need to have the upcoming version number -# at the top of the file for each `make distcheck' run. -local-checks-to-skip = \ - changelog-check \ +local-checks-to-skip = \ sc_immutable_NEWS \ - sc_prohibit_always_true_header_tests \ - sc_prohibit_atoi_atof \ - sc_prohibit_strcmp + sc_prohibit_atoi_atof # The local directory containing the checked-out copy of gnulib used in # this release. Used solely to get a date for the "announcement" target. @@ -70,11 +64,11 @@ $(call exclude, \ prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$ \ prohibit_always-defined_macros+=?|^tests/regression.at$$ \ prohibit_defined_have_decl_tests=?|^lib/timevar.c$$ \ - prohibit_empty_lines_at_EOF=^src/parse-gram.[ch]$$ \ + prohibit_empty_lines_at_EOF=^src/parse-gram.h$$ \ prohibit_magic_number_exit=^doc/bison.texi$$ \ prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$ \ + prohibit_strcmp=^doc/bison\.texi$$ \ require_config_h_first=^(lib/yyerror|data/(glr|yacc))\.c$$ \ space_tab=^tests/(input|c\+\+)\.at$$ \ - trailing_blank=^src/parse-gram.[ch]$$ \ unmarked_diagnostics=^(djgpp/|doc/bison.texi$$) \ ) diff --git a/configure.ac b/configure.ac index b9d2ea69..328d9294 100644 --- a/configure.ac +++ b/configure.ac @@ -45,7 +45,9 @@ AC_CONFIG_MACRO_DIR([m4]) # releases, we want to be able run make dist without being required to # add a bogus NEWS entry. In that case, the version string # automatically contains a dash, which we also let disable gnits. -AM_INIT_AUTOMAKE([1.11.1 dist-xz silent-rules] +AM_INIT_AUTOMAKE([1.11.1 dist-xz nostdinc + color-tests parallel-tests + silent-rules] m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]], [gnu], [gnits])) AM_SILENT_RULES([yes]) @@ -71,6 +73,7 @@ if test "$enable_gcc_warnings" = yes; then warn_c='-Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wshadow -Wstrict-prototypes' warn_cxx='-Wnoexcept' + AC_LANG_PUSH([C]) for i in $warn_common $warn_c; do @@ -87,7 +90,7 @@ if test "$enable_gcc_warnings" = yes; then do gl_WARN_ADD([$i], [WARN_CXXFLAGS]) done - gl_WARN_ADD([ -Wzero-as-null-pointer-constant], [WARN_CXXFLAGS], + gl_WARN_ADD([-Wzero-as-null-pointer-constant], [WARN_CXXFLAGS], [AC_LANG_PROGRAM([], [nullptr])]) gl_WARN_ADD([-Werror], [WERROR_CXXFLAGS]) # Warnings for the test suite only. @@ -105,8 +108,8 @@ AC_ARG_ENABLE([yacc], , [enable_yacc=yes]) case $enable_yacc in yes) - YACC_SCRIPT=yacc - YACC_LIBRARY=liby.a;; + YACC_SCRIPT=src/yacc + YACC_LIBRARY=lib/liby.a;; *) YACC_SCRIPT= YACC_LIBRARY=;; @@ -123,6 +126,10 @@ AC_PROG_GNU_M4 AC_DEFINE_UNQUOTED([M4], ["$M4"], [Define to the GNU M4 executable name.]) AC_DEFINE_UNQUOTED([M4_GNU_OPTION], ["$M4_GNU"], [Define to "-g" if GNU M4 supports -g, otherwise to "".]) +AC_PATH_PROG([PERL], [perl]) +if test -z "$PERL"; then + AC_MSG_ERROR([perl not found]) +fi AM_MISSING_PROG([HELP2MAN], [help2man]) AC_PATH_PROG([XSLTPROC], [xsltproc]) AC_SUBST([XSLTPROC]) @@ -160,7 +167,7 @@ AC_CONFIG_FILES([etc/bench.pl], [chmod +x etc/bench.pl]) # Initialize the test suite. AC_CONFIG_TESTDIR(tests) -AC_CONFIG_FILES([tests/Makefile tests/atlocal]) +AC_CONFIG_FILES([tests/atlocal]) AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison]) AC_CHECK_PROGS([VALGRIND], [valgrind]) case $VALGRIND:$host_os in @@ -177,17 +184,23 @@ AM_MISSING_PROG([AUTOM4TE], [autom4te]) # Needed by tests/atlocal.in. AC_SUBST([GCC]) -gt_JAVACOMP([1.3]) +gt_JAVACOMP([1.3], [1.4]) gt_JAVAEXEC +# We use gnulib, but from lib/local.mk instead of lib/Makefile.am. +# So prefix paths with lib/. See also etc/prefix-gnulib-mk. +gl_LIBOBJS=`echo "$gl_LIBOBJS" | sed -e 's, , lib/,g'` +# Listing the names of the variables to prefix is error-prone. +# Rather, adjust all the AC_SUBST variables whose name ends in '_H', +# and whose content ends in '.h'. +for ac_var in $ac_subst_vars +do + eval "ac_val=\$$ac_var" + case $ac_var=$ac_val in + (*_H=*.h) eval "$ac_var=lib/\$$ac_var";; + esac +done AC_CONFIG_FILES([Makefile - build-aux/Makefile - po/Makefile.in - data/Makefile - etc/Makefile - examples/Makefile - examples/calc++/Makefile - lib/Makefile src/Makefile - doc/Makefile - doc/yacc.1]) + po/Makefile.in + doc/yacc.1]) AC_OUTPUT diff --git a/data/.cvsignore b/data/.cvsignore deleted file mode 100644 index 3dda7298..00000000 --- a/data/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile.in -Makefile diff --git a/data/.gitignore b/data/.gitignore deleted file mode 100644 index 9ee64540..00000000 --- a/data/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/Makefile.in -/Makefile diff --git a/data/Makefile.am b/data/Makefile.am deleted file mode 100644 index 1fd10b4a..00000000 --- a/data/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -## Copyright (C) 2002, 2005-2012 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -dist_pkgdata_DATA = README bison.m4 \ - c-like.m4 \ - c-skel.m4 c.m4 yacc.c glr.c \ - c++-skel.m4 c++.m4 location.cc lalr1.cc glr.cc stack.hh \ - java-skel.m4 java.m4 lalr1.java - -m4sugardir = $(pkgdatadir)/m4sugar -dist_m4sugar_DATA = m4sugar/m4sugar.m4 m4sugar/foreach.m4 - -xsltdir = $(pkgdatadir)/xslt -dist_xslt_DATA = \ - xslt/bison.xsl \ - xslt/xml2dot.xsl \ - xslt/xml2text.xsl \ - xslt/xml2xhtml.xsl diff --git a/data/bison.m4 b/data/bison.m4 index fac86f2a..f2126ef4 100644 --- a/data/bison.m4 +++ b/data/bison.m4 @@ -22,14 +22,17 @@ ## Identification. ## ## ---------------- ## -# b4_copyright(TITLE, YEARS) -# -------------------------- +# b4_copyright(TITLE, [YEARS]) +# ---------------------------- +# If YEARS are not defined, use b4_copyright_years. m4_define([b4_copyright], [b4_comment([A Bison parser, made by GNU Bison b4_version.]) b4_comment([$1 -m4_text_wrap([Copyright (C) $2 Free Software Foundation, Inc.], [ ]) +]m4_dquote(m4_text_wrap([Copyright (C) +]m4_ifval([$2], [[$2]], [m4_defn([b4_copyright_years])])[ +Free Software Foundation, Inc.]))[ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -194,6 +197,87 @@ m4_define([b4_ints_in], [m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])]) +# b4_subtract(LHS, RHS) +# --------------------- +# Evaluate LHS - RHS if they are integer literals, otherwise expand +# to (LHS) - (RHS). +m4_define([b4_subtract], +[m4_bmatch([$1$2], [^[0123456789]*$], + [m4_eval([$1 - $2])], + [($1) - ($2)])]) + +# b4_args(ARG1, ...) +# _b4_args(ARG1, ...) +# ------------------- +# Join with comma, skipping empty arguments. +# b4_args calls itself recursively until it sees the first non-empty +# argument, then calls _b4_args which prepends each non-empty argument +# with a comma. +m4_define([b4_args], +[m4_if([$#$1], + [1], [], + [m4_ifval([$1], + [$1[]_$0(m4_shift($@))], + [$0(m4_shift($@))])])]) + +# _b4_args(ARGS1, ...) +# -------------------- +m4_define([_b4_args], +[m4_if([$#$1], + [1], [], + [m4_ifval([$1], [, $1])[]$0(m4_shift($@))])]) + + + + +# b4_integral_parser_tables_map(MACRO) +# ------------------------------------- +# Map MACRO on all the integral tables. MACRO is expected to have +# the signature MACRO(TABLE-NAME, CONTENT, COMMENT). +m4_define([b4_integral_parser_tables_map], +[$1([pact], [b4_pact], + [[YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +STATE-NUM.]]) + +$1([defact], [b4_defact], + [[YYDEFACT[S] -- default reduction number in state S. Performed when +YYTABLE does not specify something else to do. Zero means the default +is an error.]]) + +$1([pgoto], [b4_pgoto], [[YYPGOTO[NTERM-NUM].]]) + +$1([defgoto], [b4_defgoto], [[YYDEFGOTO[NTERM-NUM].]]) + +$1([table], [b4_table], + [[YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If +positive, shift that token. If negative, reduce the rule which +number is the opposite. If YYTABLE_NINF, syntax error.]]) + +$1([check], [b4_check]) + +$1([stos], [b4_stos], + [[STOS_[STATE-NUM] -- The (internal number of the) accessing +symbol of state STATE-NUM.]]) + +$1([r1], [b4_r1], + [[YYR1[YYN] -- Symbol number of symbol that rule YYN derives.]]) + +$1([r2], [b4_r2], + [[YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.]]) +]) + + +# b4_parser_tables_declare +# b4_parser_tables_define +# ------------------------ +# Define/declare the (deterministic) parser tables. +m4_define([b4_parser_tables_declare], +[b4_integral_parser_tables_map([b4_integral_parser_table_declare])]) + +m4_define([b4_parser_tables_define], +[b4_integral_parser_tables_map([b4_integral_parser_table_define])]) + + ## ------------------ ## ## Decoding options. ## @@ -205,8 +289,8 @@ m4_define([b4_ints_in], m4_define([b4_flag_if], [m4_case(b4_$1_flag, [0], [$3], - [1], [$2], - [m4_fatal([invalid $1 value: ]$1)])]) + [1], [$2], + [m4_fatal([invalid $1 value: ]$1)])]) # b4_define_flag_if(FLAG) @@ -232,15 +316,164 @@ m4_define([b4_$3_if], # ----------------------------- # Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise. b4_define_flag_if([defines]) # Whether headers are requested. -b4_define_flag_if([error_verbose]) # Whether error are verbose. b4_define_flag_if([glr]) # Whether a GLR parser is requested. -b4_define_flag_if([locations]) # Whether locations are tracked. b4_define_flag_if([nondeterministic]) # Whether conflicts should be handled. b4_define_flag_if([token_table]) # Whether yytoken_table is demanded. b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated. -# yytoken_table is needed to support verbose errors. -b4_error_verbose_if([m4_define([b4_token_table_flag], [1])]) + +## --------- ## +## Symbols. ## +## --------- ## + +# In order to unify the handling of the various aspects of symbols +# (tag, type_name, whether terminal, etc.), bison.exe defines one +# macro per (token, field), where field can has_id, id, etc.: see +# src/output.c:prepare_symbols_definitions(). +# +# The following macros provide access to these values. + +# b4_symbol_(NUM, FIELD) +# ---------------------- +# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if +# undefined. +m4_define([b4_symbol_], +[m4_indir([b4_symbol($1, $2)])]) + + +# b4_symbol(NUM, FIELD) +# --------------------- +# Recover a FIELD about symbol #NUM. Thanks to m4_indir, fails if +# undefined. If FIELD = id, prepend the prefix. +m4_define([b4_symbol], +[m4_case([$2], + [id], [m4_do([b4_percent_define_get([api.tokens.prefix])], + [b4_symbol_([$1], [id])])], + [b4_symbol_($@)])]) + + +# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE) +# ------------------------------------------- +# If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE. +# Otherwise an error. +m4_define([b4_symbol_if], +[m4_case(b4_symbol([$1], [$2]), + [1], [$3], + [0], [$4], + [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])]) + + +# b4_symbol_action_location(SYMBOL-NUM, KIND) +# ------------------------------------------- +# Report the location of the KIND action as FILE:LINE. +m4_define([b4_symbol_action_location], +[b4_symbol([$1], [$2_file]):b4_syncline([b4_symbol([$1], [$2_line])])]) + + +# b4_symbol_action(SYMBOL-NUM, KIND) +# ---------------------------------- +# Run the action KIND (destructor or printer) for SYMBOL-NUM. +# Same as in C, but using references instead of pointers. +m4_define([b4_symbol_action], +[b4_symbol_if([$1], [has_$2], +[b4_dollar_pushdef([(*yyvaluep)], + b4_symbol_if([$1], [has_type], + [m4_dquote(b4_symbol([$1], [type]))]), + [(*yylocationp)])dnl + b4_symbol_case_([$1])[]dnl +b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"]) + b4_symbol([$1], [$2]) +b4_syncline([@oline@], [@ofile@]) + break; + +b4_dollar_popdef[]dnl +])]) + + +# b4_symbol_destructor(SYMBOL-NUM) +# b4_symbol_printer(SYMBOL-NUM) +# -------------------------------- +m4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])]) +m4_define([b4_symbol_printer], [b4_symbol_action([$1], [printer])]) + + +# b4_symbol_case_(SYMBOL-NUM) +# --------------------------- +# Issue a "case NUM" for SYMBOL-NUM. +m4_define([b4_symbol_case_], +[ case b4_symbol([$1], [number]): // b4_symbol([$1], [tag]) +]) + + +# b4_symbol_foreach(MACRO) +# ------------------------ +# Invoke MACRO(SYMBOL-NUM) for each SYMBOL-NUM. +m4_define([b4_symbol_foreach], + [m4_map([$1], m4_defn([b4_symbol_numbers]))]) + +# b4_symbol_map(MACRO) +# -------------------- +# Return a list (possibly empty elements) of MACRO invoked for each +# SYMBOL-NUM. +m4_define([b4_symbol_map], +[m4_map_args_sep([$1(], [)], [,], b4_symbol_numbers)]) + + +# b4_token_visible_if(NUM, IF-TRUE, IF-FALSE) +# ------------------------------------------- +# Whether NUM denotes a token that has an exported definition (i.e., +# shows in enum yytokentype). +m4_define([b4_token_visible_if], +[b4_symbol_if([$1], [is_token], + [b4_symbol_if([$1], [has_id], [$2], [$3])], + [$3])]) + +# b4_token_has_definition(NUM) +# ---------------------------- +# 1 if NUM is visible, nothing otherwise. +m4_define([b4_token_has_definition], +[b4_token_visible_if([$1], [1])]) + +# b4_any_token_visible_if([IF-TRUE], [IF-FALSE]) +# ---------------------------------------------- +# Whether there is a token that needs to be defined. +m4_define([b4_any_token_visible_if], +[m4_ifval(b4_symbol_foreach([b4_token_has_definition]), + [$1], [$2])]) + + +# b4_token_format(FORMAT, NUM) +# ---------------------------- +m4_define([b4_token_format], +[b4_token_visible_if([$2], +[m4_quote(m4_format([$1], + [b4_symbol([$2], [id])], + [b4_symbol([$2], [user_number])]))])]) + + +## ------- ## +## Types. ## +## ------- ## + +# b4_type_action_(NUMS) +# --------------------- +# Run actions for the symbol NUMS that all have the same type-name. +# Skip NUMS that have no type-name. +m4_define([b4_type_action_], +[b4_symbol_if([$1], [has_type], +[m4_map([b4_symbol_case_], [$@])[]dnl + b4_dollar_dollar([b4_symbol([$1], [number])], + [b4_symbol([$1], [tag])], + [b4_symbol([$1], [type])]); + break; + +])]) + +# b4_type_foreach(MACRO) +# ---------------------- +# Invoke MACRO(SYMBOL-NUMS) for each set of SYMBOL-NUMS for each type set. +m4_define([b4_type_foreach], + [m4_map([$1], m4_defn([b4_type_names]))]) @@ -349,7 +582,6 @@ m4_popdef([b4_end])dnl - ## --------------------- ## ## b4_percent_define_*. ## ## --------------------- ## @@ -379,7 +611,6 @@ m4_ifdef([b4_percent_define(]$1[)], [m4_indir([b4_percent_define(]$1[)])], [$2])]) - # b4_percent_define_get_loc(VARIABLE) # ----------------------------------- # Mimic muscle_percent_define_get_loc in ../src/muscle-tab.h exactly. That is, @@ -428,8 +659,14 @@ m4_define([b4_percent_define_get_syncline], # b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]]) m4_define([b4_percent_define_ifdef], [m4_ifdef([b4_percent_define(]$1[)], - [m4_define([b4_percent_define_bison_variables(]$1[)])$2], - [$3])]) + [b4_percent_define_use([$1])$2], + [$3])]) + + +## --------- ## +## Options. ## +## --------- ## + # b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE]) # -------------------------------------------------------- @@ -454,6 +691,7 @@ m4_define([b4_percent_define_flag_if], [[b4_percent_define_flag_if($1)]])])], [b4_fatal([[b4_percent_define_flag_if: undefined %%define variable '%s']], [$1])])]) + # b4_percent_define_default(VARIABLE, DEFAULT) # -------------------------------------------- # Mimic muscle_percent_define_default in ../src/muscle-tab.h exactly. That is, @@ -472,6 +710,20 @@ m4_define([b4_percent_define_default], [[:-1.-1]]]])dnl m4_define([b4_percent_define_syncline(]$1[)], [[]])])]) + +# b4_percent_define_if_define(VARIABLE) +# ------------------------------------- +# Define b4_VARIABLE_if that executes its $1 or $2 depending whether +# VARIABLE was %defined. The characters `.' and `-' in VARIABLE are mapped +# to `_'. +m4_define([b4_percent_define_if_define_], +[m4_define(m4_bpatsubst([b4_$1_if], [[-.]], [_]), + [b4_percent_define_flag_if([$1], [$2], [$3])])]) +m4_define([b4_percent_define_if_define], +[b4_percent_define_default([[$1]], [[false]]) +b4_percent_define_if_define_([$1], $[1], $[2])]) + + # b4_percent_define_check_values(VALUES) # -------------------------------------- # Mimic muscle_percent_define_check_values in ../src/muscle-tab.h exactly @@ -543,7 +795,45 @@ m4_popdef([b4_macro_name])]) m4_define([b4_percent_code_ifdef], [m4_ifdef([b4_percent_code(]$1[)], [m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])$2], - [$3])]) + [$3])]) + + +## ------------------ ## +## Common variables. ## +## ------------------ ## + +# Default values for %define. +# --------------------------- +# If the api.tokens.prefix, it is empty. +m4_percent_define_default([[api.tokens.prefix]], [[]]) + +# b4_parse_assert_if([IF-ASSERTIONS-ARE-USED], [IF-NOT]) +# b4_parse_trace_if([IF-DEBUG-TRACES-ARE-ENABLED], [IF-NOT]) +# b4_lex_symbol_if([IF-YYLEX-RETURNS-A-COMPLETE-SYMBOL], [IF-NOT]) +# b4_variant_if([IF-VARIANT-ARE-USED], [IF-NOT]) +# ---------------------------------------------- +b4_percent_define_if_define([lex_symbol]) +b4_percent_define_if_define([locations]) # Whether locations are tracked. +b4_percent_define_if_define([parse.assert]) +b4_percent_define_if_define([parse.trace]) +b4_percent_define_if_define([variant]) + + +# b4_error_verbose_if([IF-ERRORS-ARE-VERBOSE], [IF-NOT]) +# ------------------------------------------------------ +# Map %define parse.error "(simple|verbose)" to b4_error_verbose_if and +# b4_error_verbose_flag. +b4_percent_define_default([[parse.error]], [[simple]]) +b4_percent_define_check_values([[[[parse.error]], + [[simple]], [[verbose]]]]) +m4_define([b4_error_verbose_flag], + [m4_case(b4_percent_define_get([[parse.error]]), + [simple], [[0]], + [verbose], [[1]])]) +b4_define_flag_if([error_verbose]) + +# yytoken_table is needed to support verbose errors. +b4_error_verbose_if([m4_define([b4_token_table_flag], [1])]) ## ----------------------------------------------------------- ## diff --git a/data/c++.m4 b/data/c++.m4 index 45c4ddaf..62374be1 100644 --- a/data/c++.m4 +++ b/data/c++.m4 @@ -23,7 +23,6 @@ m4_include(b4_pkgdatadir/[c.m4]) ## Default values. ## ## ---------------- ## -# Default parser class name. b4_percent_define_default([[parser_class_name]], [[parser]]) # Don't do that so that we remember whether we're using a user @@ -32,18 +31,21 @@ b4_percent_define_default([[parser_class_name]], [[parser]]) # b4_percent_define_default([[location_type]], [[location]]) b4_percent_define_default([[filename_type]], [[std::string]]) -b4_percent_define_default([[namespace]], m4_defn([b4_prefix])) +b4_percent_define_default([[api.namespace]], m4_defn([b4_prefix])) + b4_percent_define_default([[global_tokens_and_yystype]], [[false]]) b4_percent_define_default([[define_location_comparison]], [m4_if(b4_percent_define_get([[filename_type]]), [std::string], [[true]], [[false]])]) + ## ----------- ## ## Namespace. ## ## ----------- ## -m4_define([b4_namespace_ref], [b4_percent_define_get([[namespace]])]) +m4_define([b4_namespace_ref], [b4_percent_define_get([[api.namespace]])]) + # Don't permit an empty b4_namespace_ref. Any `::parser::foo' appended to it # would compile as an absolute reference with `parser' in the global namespace. @@ -53,7 +55,7 @@ m4_define([b4_namespace_ref], [b4_percent_define_get([[namespace]])]) # include the header, which is always generated. If we ever need to permit # internal linkage somehow, surely we can find a cleaner approach. m4_if(m4_bregexp(b4_namespace_ref, [^[ ]*$]), [-1], [], -[b4_complain_at(b4_percent_define_get_loc([[namespace]]), +[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]), [[namespace reference is empty]])]) # Instead of assuming the C++ compiler will do it, Bison should reject any @@ -64,36 +66,36 @@ m4_if(m4_bregexp(b4_namespace_ref, [^[ ]*$]), [-1], [], # Specifically, don't allow empty names as b4_namespace_open would just convert # those into anonymous namespaces, and that might tempt some users. m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*::]), [-1], [], -[b4_complain_at(b4_percent_define_get_loc([[namespace]]), +[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]), [[namespace reference has consecutive "::"]])]) m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*$]), [-1], [], -[b4_complain_at(b4_percent_define_get_loc([[namespace]]), +[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]), [[namespace reference has a trailing "::"]])]) m4_define([b4_namespace_open], -[b4_user_code([b4_percent_define_get_syncline([[namespace]]) +[b4_user_code([b4_percent_define_get_syncline([[api.namespace]]) [namespace ]m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref), [^\(.\)[ ]*::], [\1])), [::], [ { namespace ])[ {]])]) m4_define([b4_namespace_close], -[b4_user_code([b4_percent_define_get_syncline([[namespace]]) +[b4_user_code([b4_percent_define_get_syncline([[api.namespace]]) m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]), [^\(.\)[ ]*\(::\)?\([^][:]\|:[^:]\)*], [\1])), [::\([^][:]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])]) -# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) -# ----------------------------------------------------- +# b4_token_enums +# -------------- # Output the definition of the tokens as enums. m4_define([b4_token_enums], -[/* Tokens. */ - enum yytokentype { -m4_map_sep([ b4_token_enum], [, -], - [$@]) - }; +[[enum yytokentype + { + ]m4_join([, + ], + b4_symbol_map([b4_token_enum]))[ + };]dnl ]) @@ -103,12 +105,263 @@ m4_map_sep([ b4_token_enum], [, ## Semantic Values. ## ## ----------------- ## +# b4_semantic_type_declare +# ------------------------ +# Declare semantic_type. +m4_define([b4_semantic_type_declare], +[ /// Symbol semantic values. +m4_ifdef([b4_stype], +[ union semantic_type + {b4_user_stype + };], +[m4_if(b4_tag_seen_flag, 0, +[[ typedef int semantic_type;]], +[[ typedef ]b4_api_PREFIX[STYPE semantic_type;]])])]) + + +# b4_public_types_declare +# ----------------------- +# Define the public types: token, semantic value, location, and so forth. +# Depending on %define token_lex, may be output in the header or source file. +m4_define([b4_public_types_declare], +[[#ifndef ]b4_api_PREFIX[STYPE +]b4_semantic_type_declare[ +#else + typedef ]b4_api_PREFIX[STYPE semantic_type; +#endif]b4_locations_if([ + /// Symbol locations. + typedef b4_percent_define_get([[location_type]], + [[location]]) location_type;])[ + + /// Syntax errors thrown from user actions. + struct syntax_error : std::runtime_error + { + syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m);]b4_locations_if([ + location_type location;])[ + }; + + /// Tokens. + struct token + { + ]b4_token_enums[ + }; + + /// Token type. + typedef token::yytokentype token_type; + + /// A complete symbol, with its type. + template + struct symbol_base_type + { + /// Default constructor. + inline symbol_base_type (); + + /// Constructor.]b4_locations_if([ + inline symbol_base_type (const location_type& l)])[; + inline symbol_base_type (]b4_args( + [const semantic_type& v], + b4_locations_if([const location_type& l]))[); + + /// Return this with its exact type. + const Exact& self () const; + Exact& self (); + + /// Return the type of this symbol. + int type_get () const; + + /// The semantic value. + semantic_type value;]b4_locations_if([ + + /// The location. + location_type location;])[ + }; + + /// External form of a symbol: its type and attributes. + struct symbol_type : symbol_base_type + { + /// The parent class. + typedef symbol_base_type super_type; + + /// Default constructor. + inline symbol_type (); + + /// Constructor for tokens with semantic value. + inline symbol_type (]b4_args([token_type t], + [const semantic_type& v], + b4_locations_if([const location_type& l]))[); + + /// Constructor for valueless tokens. + inline symbol_type (]b4_args([token_type t], + b4_locations_if([const location_type& l]))[); + + /// The symbol type. + int type; + + /// The symbol type. + inline int type_get_ () const; + + /// The token. + inline token_type token () const; + }; +]b4_symbol_constructor_declare]) + + +# b4_public_types_define +# ---------------------- +# Provide the implementation needed by the public types. +m4_define([b4_public_types_define], +[[ inline + ]b4_parser_class_name[::syntax_error::syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m) + : std::runtime_error (m)]b4_locations_if([ + , location (l)])[ + {} + + // symbol_base_type. + template + inline + ]b4_parser_class_name[::symbol_base_type::symbol_base_type () + : value()]b4_locations_if([ + , location()])[ + { + }]b4_locations_if([[ + + template + inline + ]b4_parser_class_name[::symbol_base_type::symbol_base_type (const location_type& l) + : value() + , location(l) + { + }]])[ + + template + inline + ]b4_parser_class_name[::symbol_base_type::symbol_base_type (]b4_args( + [const semantic_type& v], + b4_locations_if([const location_type& l]))[) + : value(v)]b4_locations_if([ + , location(l)])[ + { + } + + template + inline + const Exact& + ]b4_parser_class_name[::symbol_base_type::self () const + { + return static_cast(*this); + } + + template + inline + Exact& + ]b4_parser_class_name[::symbol_base_type::self () + { + return static_cast(*this); + } + + template + inline + int + ]b4_parser_class_name[::symbol_base_type::type_get () const + { + return self ().type_get_ (); + } + + // symbol_type. + inline + ]b4_parser_class_name[::symbol_type::symbol_type () + : super_type () + , type () + { + } + + inline + ]b4_parser_class_name[::symbol_type::symbol_type (]b4_args( + [token_type t], + b4_locations_if([const location_type& l]))[) + : super_type (]b4_locations_if([l])[) + , type (yytranslate_ (t)) + { + } + + inline + ]b4_parser_class_name[::symbol_type::symbol_type (]b4_args( + [token_type t], + [const semantic_type& v], + b4_locations_if([const location_type& l]))[) + : super_type (v]b4_locations_if([, l])[) + , type (yytranslate_ (t)) + { + } + + inline + int + ]b4_parser_class_name[::symbol_type::type_get_ () const + { + return type; + } +]b4_lex_symbol_if([[ + inline + ]b4_parser_class_name[::token_type + ]b4_parser_class_name[::symbol_type::token () const + { + // YYTOKNUM[NUM] -- (External) token number corresponding to the + // (internal) symbol number NUM (which must be that of a token). */ + static + const ]b4_int_type_for([b4_toknum])[ + yytoken_number_[] = + { + ]b4_toknum[ + }; + return static_cast (yytoken_number_[type]); + } +]])[]dnl +b4_symbol_constructor_define]) + + +# b4_symbol_constructor_declare +# b4_symbol_constructor_define +# ----------------------------- +# Declare/define symbol constructors for all the value types. +# Use at class-level. Redefined in variant.hh. +m4_define([b4_symbol_constructor_declare], []) +m4_define([b4_symbol_constructor_define], []) + + +# b4_yytranslate_define +# --------------------- +# Define yytranslate_. Sometimes used in the header file, +# sometimes in the cc file. +m4_define([b4_yytranslate_define], +[[ // Symbol number corresponding to token number t. + ]b4_parser_class_name[::token_number_type + ]b4_parser_class_name[::yytranslate_ (]b4_lex_symbol_if([token_type], + [int])[ t) + { + static + const token_number_type + translate_table[] = + { +]b4_translate[ + }; + const unsigned int user_token_number_max_ = ]b4_user_token_number_max[; + const token_number_type undef_token_ = ]b4_undef_token_number[; + + if (static_cast(t) <= yyeof_) + return yyeof_; + else if (static_cast (t) <= user_token_number_max_) + return translate_table[t]; + else + return undef_token_; + } +]]) + # b4_lhs_value([TYPE]) # -------------------- # Expansion of $$. m4_define([b4_lhs_value], -[(yyval[]m4_ifval([$1], [.$1]))]) +[b4_symbol_value([yyval], [$1])]) # b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) @@ -116,7 +369,8 @@ m4_define([b4_lhs_value], # Expansion of $NUM, where the current rule has RULE-LENGTH # symbols on RHS. m4_define([b4_rhs_value], -[(yysemantic_stack_@{($1) - ($2)@}m4_ifval([$3], [.$3]))]) +[b4_symbol_value([yysemantic_stack_@{($1) - ($2)@}], [$3])]) + # b4_lhs_location() # ----------------- @@ -153,27 +407,27 @@ m4_define([b4_parse_param_decl_1], # Extra initialisations of the constructor. m4_define([b4_parse_param_cons], [m4_ifset([b4_parse_param], - [ + [ b4_cc_constructor_calls(b4_parse_param)])]) m4_define([b4_cc_constructor_calls], - [m4_map_sep([b4_cc_constructor_call], [, + [m4_map_sep([b4_cc_constructor_call], [, ], [$@])]) m4_define([b4_cc_constructor_call], - [$2 ($2_yyarg)]) + [$2 ($2_yyarg)]) # b4_parse_param_vars # ------------------- # Extra instance variables. m4_define([b4_parse_param_vars], [m4_ifset([b4_parse_param], - [ + [ /* User arguments. */ b4_cc_var_decls(b4_parse_param)])]) m4_define([b4_cc_var_decls], - [m4_map_sep([b4_cc_var_decl], [ + [m4_map_sep([b4_cc_var_decl], [ ], [$@])]) m4_define([b4_cc_var_decl], - [ $1;]) + [ $1;]) ## ---------## diff --git a/data/c-like.m4 b/data/c-like.m4 index c2abce7e..732d18d4 100644 --- a/data/c-like.m4 +++ b/data/c-like.m4 @@ -23,10 +23,9 @@ # otherwise just VALUE. Be sure to pass "(VALUE)" is VALUE is a # pointer. m4_define([b4_dollar_dollar_], -[m4_if([$2], [[]], - [m4_ifval([$3], [($1.$3)], - [$1])], - [($1.$2)])]) +[b4_symbol_value([$1], + m4_if([$2], [[]], + [[$3]], [[$2]]))]) # b4_dollar_pushdef(VALUE-POINTER, DEFAULT-FIELD, LOCATION) # b4_dollar_popdef diff --git a/data/c.m4 b/data/c.m4 index 45468e3c..a07422d1 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -49,11 +49,34 @@ m4_define([b4_cpp_guard_close], ## Identification. ## ## ---------------- ## -# b4_comment(TEXT) -# ---------------- -m4_define([b4_comment], [/* m4_bpatsubst([$1], [ -], [ - ]) */]) +# b4_comment_(TEXT, OPEN, CONTINUE, END) +# ------------------------------------- +# Put TEXT in comment. Avoid trailing spaces: don't indent empty lines. +# Avoid adding indentation to the first line, as the indentation comes +# from OPEN. That's why we don't patsubst([$1], [^\(.\)], [ \1]). +# +# Prefix all the output lines with PREFIX. +m4_define([b4_comment_], [$2[]m4_bpatsubst([$1], [ +\(.\)], [ +$3\1])$4]) + + +# b4_c_comment(TEXT, [PREFIX]) +# ---------------------------- +# Put TEXT in comment. Avoid trailing spaces: don't indent empty lines. +# Avoid adding indentation to the first line, as the indentation comes +# from "/*". That's why we don't patsubst([$1], [^\(.\)], [ \1]). +# +# Prefix all the output lines with PREFIX. +m4_define([b4_c_comment], +[b4_comment_([$1], [$2/* ], [$2 ], [$2 */])]) + + +# b4_comment(TEXT, [PREFIX]) +# -------------------------- +# By default, C comments. +m4_define([b4_comment], [b4_c_comment($@)]) + # b4_identification # ----------------- @@ -135,11 +158,13 @@ m4_popdef([$2])dnl m4_popdef([$1])dnl ])]) -# b4_parse_param_use -# ------------------ -# `YYUSE' all the parse-params. +# b4_parse_param_use([VAL], [LOC]) +# -------------------------------- +# `YYUSE' VAL, LOC if locations are enabled, and all the parse-params. m4_define([b4_parse_param_use], -[b4_parse_param_for([Decl], [Formal], [ YYUSE (Formal); +[m4_ifvaln([$1], [ YYUSE([$1]);])dnl +b4_locations_if([m4_ifvaln([$2], [ YYUSE ([$2]);])])dnl +b4_parse_param_for([Decl], [Formal], [ YYUSE (Formal); ])dnl ]) @@ -161,7 +186,7 @@ m4_define([b4_int_type], m4_eval([0 <= $1]), [1], [unsigned int], - [int])]) + [int])]) # b4_int_type_for(NAME) @@ -210,63 +235,85 @@ m4_define([b4_null_define], # Return a null pointer constant. m4_define([b4_null], [YY_NULL]) +# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT) +# ------------------------------------------------------------- +# Define "yy" which contents is CONTENT. +m4_define([b4_integral_parser_table_define], +[m4_ifvaln([$3], [b4_c_comment([$3], [ ])])dnl +static const b4_int_type_for([$2]) yy$1[[]] = +{ + $2 +};dnl +]) ## ------------------------- ## ## Assigning token numbers. ## ## ------------------------- ## -# b4_token_define(TOKEN-NAME, TOKEN-NUMBER) -# ----------------------------------------- +# b4_token_define(TOKEN-NUM) +# -------------------------- # Output the definition of this token as #define. m4_define([b4_token_define], -[#define $1 $2 -]) +[b4_token_format([#define %s %s], [$1])]) - -# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) -# ------------------------------------------------------- -# Output the definition of the tokens (if there are) as #defines. +# b4_token_defines +# ---------------- +# Output the definition of the tokens. m4_define([b4_token_defines], -[m4_if([$#$1], [1], [], -[/* Tokens. */ -m4_map([b4_token_define], [$@])]) -]) +[b4_any_token_visible_if([/* Tokens. */ +m4_join([ +], b4_symbol_map([b4_token_define])) +])]) -# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER) -# --------------------------------------- +# b4_token_enum(TOKEN-NUM) +# ------------------------ # Output the definition of this token as an enum. m4_define([b4_token_enum], -[$1 = $2]) +[b4_token_format([%s = %s], [$1])]) -# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) -# ----------------------------------------------------- +# b4_token_enums +# -------------- # Output the definition of the tokens (if there are) as enums. m4_define([b4_token_enums], -[m4_if([$#$1], [1], [], -[[/* Tokens. */ +[b4_any_token_visible_if([[/* Tokens. */ #ifndef ]b4_api_PREFIX[TOKENTYPE # define ]b4_api_PREFIX[TOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum ]b4_api_prefix[tokentype { -]m4_map_sep([ b4_token_enum], [, -], - [$@])[ - }; + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum ]b4_api_prefix[tokentype + { + ]m4_join([, + ], + b4_symbol_map([b4_token_enum]))[ + }; #endif ]])]) -# b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) -# ------------------------------------------------------------- -# Output the definition of the tokens (if there are any) as enums and, if POSIX -# Yacc is enabled, as #defines. +# b4_token_enums_defines +# ---------------------- +# Output the definition of the tokens (if there are any) as enums and, +# if POSIX Yacc is enabled, as #defines. m4_define([b4_token_enums_defines], -[b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], []) -]) +[b4_token_enums[]b4_yacc_if([b4_token_defines])]) + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + +# b4_symbol_value(VAL, [TYPE]) +# ---------------------------- +# Given a semantic value VAL ($$, $1 etc.), extract its value of type +# TYPE if TYPE is given, otherwise just return VAL. The result can be +# used safetly, it is put in parens to avoid nasty precedence issues. +# TYPE is *not* put in braces, provide some if needed. +m4_define([b4_symbol_value], +[($1[]m4_ifval([$2], [.$2]))]) @@ -318,7 +365,7 @@ $1 (b4_c_ansi_formals(m4_shift2($@)))[]dnl m4_define([b4_c_ansi_formals], [m4_if([$#], [0], [void], [$#$1], [1], [void], - [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])]) + [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])]) m4_define([b4_c_ansi_formal], [$1]) @@ -339,9 +386,9 @@ m4_define([b4_c_knr_formal_name], # Output the K&R argument declarations. m4_define([b4_c_knr_formal_decls], [m4_map_sep([b4_c_knr_formal_decl], - [ + [ ], - [$@])]) + [$@])]) m4_define([b4_c_knr_formal_decl], [ $1;]) @@ -357,7 +404,7 @@ m4_define([b4_c_knr_formal_decl], # ----------------------------------------------------------- # Declare the function NAME. m4_define([b4_c_function_decl], -[#if defined __STDC__ || defined __cplusplus +[#if b4_c_modern b4_c_ansi_function_decl($@) #else $2 $1 (); @@ -416,25 +463,17 @@ m4_define([b4_sync_start], [[#]line $1 $2]) m4_define([b4_case], [ case $1: $2 +b4_syncline([@oline@], [@ofile@]) break;]) -# b4_symbol_actions(FILENAME, LINENO, -# SYMBOL-TAG, SYMBOL-NUM, -# SYMBOL-ACTION, SYMBOL-TYPENAME) -# ------------------------------------------------- -# Issue the code for a symbol action (e.g., %printer). -# -# Define b4_dollar_dollar([TYPE-NAME]), and b4_at_dollar, which are -# invoked where $$ and @$ were specified by the user. -m4_define([b4_symbol_actions], -[b4_dollar_pushdef([(*yyvaluep)], [$6], [(*yylocationp)])dnl - case $4: /* $3 */ -b4_syncline([$2], [$1]) - $5; + +# b4_predicate_case(LABEL, CONDITIONS) +# ------------------------------------ +m4_define([b4_predicate_case], +[ case $1: + if (! ($2)) YYERROR; b4_syncline([@oline@], [@ofile@]) - break; -b4_dollar_popdef[]dnl -]) + break;]) # b4_yydestruct_generate(FUNCTION-DECLARATOR) @@ -456,20 +495,16 @@ m4_define_default([b4_yydestruct_generate], b4_locations_if( [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl m4_ifset([b4_parse_param], [, b4_parse_param]))[ { - YYUSE (yyvaluep); -]b4_locations_if([ YYUSE (yylocationp); -])dnl -b4_parse_param_use[]dnl -[ - if (!yymsg) +]b4_parse_param_use([yyvaluep], [yylocationp])dnl +[ if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ - default: - break; +]b4_symbol_foreach([b4_symbol_destructor])dnl +[ default: + break; } }]dnl ]) @@ -489,30 +524,28 @@ m4_define_default([b4_yy_symbol_print_generate], /*ARGSUSED*/ ]$1([yy_symbol_value_print], [static void], - [[FILE *yyoutput], [yyoutput]], - [[int yytype], [yytype]], - [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl + [[FILE *yyoutput], [yyoutput]], + [[int yytype], [yytype]], + [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl m4_ifset([b4_parse_param], [, b4_parse_param]))[ { FILE *yyo = yyoutput; - YYUSE (yyo); - if (!yyvaluep) - return; -]b4_locations_if([ YYUSE (yylocationp); -])dnl -b4_parse_param_use[]dnl -[# ifdef YYPRINT +]b4_parse_param_use([yyo], [yylocationp])dnl +[ if (!yyvaluep) + return;] +dnl glr.c does not feature yytoknum. +m4_if(b4_skeleton, ["yacc.c"], +[[# ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); # endif - switch (yytype) +]])dnl +[ switch (yytype) { -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl +]b4_symbol_foreach([b4_symbol_printer])dnl [ default: - break; + break; } } @@ -523,9 +556,9 @@ b4_parse_param_use[]dnl ]$1([yy_symbol_print], [static void], - [[FILE *yyoutput], [yyoutput]], - [[int yytype], [yytype]], - [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl + [[FILE *yyoutput], [yyoutput]], + [[int yytype], [yytype]], + [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl m4_ifset([b4_parse_param], [, b4_parse_param]))[ { @@ -562,7 +595,6 @@ m4_define([b4_declare_yylstype], [m4_if(b4_tag_seen_flag, 0, [[typedef int ]b4_api_PREFIX[STYPE; # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[ -# define ]b4_api_prefix[stype ]b4_api_PREFIX[STYPE /* obsolescent; will be withdrawn */ # define ]b4_api_PREFIX[STYPE_IS_DECLARED 1 #endif]b4_locations_if([[ @@ -574,7 +606,6 @@ typedef struct ]b4_api_PREFIX[LTYPE int last_line; int last_column; } ]b4_api_PREFIX[LTYPE; -# define ]b4_api_prefix[ltype ]b4_api_PREFIX[LTYPE /* obsolescent; will be withdrawn */ # define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1 # define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1 #endif]]) @@ -589,17 +620,17 @@ m4_define([b4_YYDEBUG_define], [[/* Enabling traces. */ ]m4_if(b4_api_prefix, [yy], [[#ifndef YYDEBUG -# define YYDEBUG ]b4_debug_flag[ +# define YYDEBUG ]b4_parse_trace_if([1], [0])[ #endif]], [[#ifndef ]b4_api_PREFIX[DEBUG # if defined YYDEBUG -# if YYDEBUG +#if YYDEBUG # define ]b4_api_PREFIX[DEBUG 1 # else # define ]b4_api_PREFIX[DEBUG 0 # endif # else /* ! defined YYDEBUG */ -# define ]b4_api_PREFIX[DEBUG ]b4_debug_flag[ +# define ]b4_api_PREFIX[DEBUG ]b4_parse_trace_if([1], [0])[ # endif /* ! defined ]b4_api_PREFIX[DEBUG */ #endif /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl ]) diff --git a/data/glr.c b/data/glr.c index 08f6cd8d..6a12cfbd 100644 --- a/data/glr.c +++ b/data/glr.c @@ -126,7 +126,15 @@ m4_define([b4_locuser_args], # -------------------- # Expansion of $$. m4_define([b4_lhs_value], -[((*yyvalp)[]m4_ifval([$1], [.$1]))]) +[b4_symbol_value([(*yyvalp)], [$1])]) + + +# b4_rhs_data(RULE-LENGTH, NUM) +# ----------------------------- +# Expand to the semantic stack place that contains value and location +# of symbol number NUM in a rule of length RULE-LENGTH. +m4_define([b4_rhs_data], +[((yyGLRStackItem const *)yyvsp)@{YYFILL (b4_subtract([$2], [$1]))@}.yystate]) # b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) @@ -134,7 +142,7 @@ m4_define([b4_lhs_value], # Expansion of $NUM, where the current rule has RULE-LENGTH # symbols on RHS. m4_define([b4_rhs_value], -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3]))]) +[b4_symbol_value([b4_rhs_data([$1], [$2]).yysemantics.yysval], [$3])]) @@ -154,7 +162,7 @@ m4_define([b4_lhs_location], # Expansion of @NUM, where the current rule has RULE-LENGTH symbols # on RHS. m4_define([b4_rhs_location], -[(((yyGLRStackItem const *)yyvsp)@{YYFILL (($2) - ($1))@}.yystate.yyloc)]) +[(b4_rhs_data([$1], [$2]).yyloc)]) ## -------------- ## @@ -168,7 +176,7 @@ m4_define([b4_rhs_location], m4_define([b4_shared_declarations], [b4_declare_yydebug[ ]b4_percent_code_get([[requires]])[ -]b4_token_enums(b4_tokens)[ +]b4_token_enums[ ]b4_declare_yylstype[ ]b4_c_ansi_function_decl(b4_prefix[parse], [int], b4_parse_param)[ ]b4_percent_code_get([[provides]])[]dnl @@ -206,7 +214,7 @@ b4_percent_code_get([[top]])[ #define yynerrs ]b4_prefix[nerrs]b4_locations_if([[ #define yylloc ]b4_prefix[lloc]])])[ -/* Copy the first part of user declarations. */ +/* First part of user declarations. */ ]b4_user_pre_prologue[ ]b4_null_define[ @@ -219,7 +227,7 @@ b4_percent_code_get([[top]])[ # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else -# define YYERROR_VERBOSE ]b4_error_verbose_flag[ +# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ #endif /* Default (constant) value used for initialization for null @@ -349,19 +357,6 @@ static const ]b4_int_type_for([b4_translate])[ yytranslate[] = }; #if ]b4_api_PREFIX[DEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const ]b4_int_type_for([b4_prhs])[ yyprhs[] = -{ - ]b4_prhs[ -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const ]b4_int_type_for([b4_rhs])[ yyrhs[] = -{ - ]b4_rhs[ -}; - /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const ]b4_int_type_for([b4_rline])[ yyrline[] = { @@ -378,17 +373,10 @@ static const char *const yytname[] = }; #endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const ]b4_int_type_for([b4_r1])[ yyr1[] = -{ - ]b4_r1[ -}; +#define YYPACT_NINF ]b4_pact_ninf[ +#define YYTABLE_NINF ]b4_table_ninf[ -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const ]b4_int_type_for([b4_r2])[ yyr2[] = -{ - ]b4_r2[ -}; +]b4_parser_tables_define[ /* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */ static const ]b4_int_type_for([b4_dprec])[ yydprec[] = @@ -402,41 +390,11 @@ static const ]b4_int_type_for([b4_merger])[ yymerger[] = ]b4_merger[ }; -/* YYDEFACT[S] -- default reduction number in state S. Performed when - YYTABLE doesn't specify something else to do. Zero means the default - is an error. */ -static const ]b4_int_type_for([b4_defact])[ yydefact[] = +/* YYIMMEDIATE[RULE-NUM] -- True iff rule #RULE-NUM is not to be deferred, as + in the case of predicates. */ +static const yybool yyimmediate[] = { - ]b4_defact[ -}; - -/* YYPDEFGOTO[NTERM-NUM]. */ -static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] = -{ - ]b4_defgoto[ -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF ]b4_pact_ninf[ -static const ]b4_int_type_for([b4_pact])[ yypact[] = -{ - ]b4_pact[ -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] = -{ - ]b4_pgoto[ -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF ]b4_table_ninf[ -static const ]b4_int_type_for([b4_table])[ yytable[] = -{ - ]b4_table[ + ]b4_immediate[ }; /* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of @@ -457,19 +415,7 @@ dnl We probably ought to introduce a type for confl. { ]b4_conflicting_rules[ }; - -static const ]b4_int_type_for([b4_check])[ yycheck[] = -{ - ]b4_check[ -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const ]b4_int_type_for([b4_stos])[ yystos[] = -{ - ]b4_stos[ -}; - + /* Error token number */ #define YYTERROR 1 @@ -526,9 +472,12 @@ static const int YYEMPTY = -2; typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; -#define YYCHK(YYE) \ - do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; } \ - while (YYID (0)) +#define YYCHK(YYE) \ + do { \ + YYRESULTTAG yychk_flag = YYE; \ + if (yychk_flag != yyok) \ + return yychk_flag; \ + } while (YYID (0)) #if ]b4_api_PREFIX[DEBUG @@ -537,22 +486,22 @@ typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; # endif # define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) + do { \ + if (yydebug) \ + YYFPRINTF Args; \ + } while (YYID (0)) ]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[ -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ + do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, Type, Value]b4_locuser_args([Location])[); \ + YYFPRINTF (stderr, "\n"); \ + } \ + } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ @@ -589,13 +538,7 @@ int yydebug; #define YYHEADROOM 2 #ifndef YYSTACKEXPANDABLE -# if (! defined __cplusplus \ - || (]b4_locations_if([[defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL \ - && ]])[defined ]b4_api_PREFIX[STYPE_IS_TRIVIAL && ]b4_api_PREFIX[STYPE_IS_TRIVIAL)) # define YYSTACKEXPANDABLE 1 -# else -# define YYSTACKEXPANDABLE 0 -# endif #endif #if YYSTACKEXPANDABLE @@ -692,7 +635,7 @@ typedef int yyStateNum; typedef int yyRuleNum; /** Grammar symbol */ -typedef short int yySymbol; +typedef int yySymbol; /** Item references, as in LALR(1) machine */ typedef short int yyItemNum; @@ -713,7 +656,7 @@ struct yyGLRState { yyStateNum yylrState; /** Preceding state in this stack */ yyGLRState* yypred; - /** Source position of the first token produced by my symbol */ + /** Source position of the last token produced by my symbol */ size_t yyposn; union { /** First in a chain of alternative reductions producing the @@ -825,9 +768,16 @@ yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) yyGLRState *s = yyvsp[yylow0].yystate.yypred; for (i = yylow0-1; i >= yylow1; i -= 1) { - YYASSERT (s->yyresolved); - yyvsp[i].yystate.yyresolved = yytrue; - yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval;]b4_locations_if([[ +#if ]b4_api_PREFIX[DEBUG + yyvsp[i].yystate.yylrState = s->yylrState; +#endif + yyvsp[i].yystate.yyresolved = s->yyresolved; + if (s->yyresolved) + yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval; + else + /* The effect of using yysval or yyloc (in an immediate rule) is + * undefined. */ + yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULL;]b4_locations_if([[ yyvsp[i].yystate.yyloc = s->yyloc;]])[ s = yyvsp[i].yystate.yypred = s->yypred; } @@ -862,7 +812,7 @@ yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, yybool yynormal __attribute__ ((__unused__)) = (yystackp->yysplitPoint == YY_NULL); int yylow; -]b4_parse_param_use[]dnl +]b4_parse_param_use([yyvalp], [yylocp])dnl [# undef yyerrok # define yyerrok (yystackp->yyerrState = 0) # undef YYACCEPT @@ -965,7 +915,7 @@ yydestroyGLRState (char const *yymsg, yyGLRState *yys]b4_user_formals[) } } -/** Left-hand-side symbol for rule #RULE. */ +/** Left-hand-side symbol for rule #YYRULE. */ static inline yySymbol yylhsNonterm (yyRuleNum yyrule) { @@ -975,7 +925,7 @@ yylhsNonterm (yyRuleNum yyrule) #define yypact_value_is_default(yystate) \ ]b4_table_value_equals([[pact]], [[yystate]], [b4_pact_ninf])[ -/** True iff LR state STATE has only a default reduction (regardless +/** True iff LR state YYSTATE has only a default reduction (regardless * of token). */ static inline yybool yyisDefaultedState (yyStateNum yystate) @@ -983,7 +933,7 @@ yyisDefaultedState (yyStateNum yystate) return yypact_value_is_default (yypact[yystate]); } -/** The default reduction for STATE, assuming it has one. */ +/** The default reduction for YYSTATE, assuming it has one. */ static inline yyRuleNum yydefaultAction (yyStateNum yystate) { @@ -998,8 +948,8 @@ yydefaultAction (yyStateNum yystate) * R < 0: Reduce on rule -R. * R = 0: Error. * R > 0: Shift to state R. - * Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of - * conflicting reductions. + * Set *YYCONFLICTS to a pointer into yyconfl to a 0-terminated list + * of conflicting reductions. */ static inline void yygetLRActions (yyStateNum yystate, int yytoken, @@ -1027,8 +977,7 @@ yygetLRActions (yyStateNum yystate, int yytoken, static inline yyStateNum yyLRgotoState (yyStateNum yystate, yySymbol yylhs) { - int yyr; - yyr = yypgoto[yylhs - YYNTOKENS] + yystate; + int yyr = yypgoto[yylhs - YYNTOKENS] + yystate; if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate) return yytable[yyr]; else @@ -1049,9 +998,10 @@ yyisErrorAction (int yyaction) /* GLRStates */ -/** Return a fresh GLRStackItem. Callers should call - * YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient - * headroom. */ +/** Return a fresh GLRStackItem in YYSTACKP. The item is an LR state + * if YYISSTATE, and otherwise a semantic option. Callers should call + * YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient + * headroom. */ static inline yyGLRStackItem* yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState) @@ -1064,16 +1014,16 @@ yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState) } /** Add a new semantic action that will execute the action for rule - * RULENUM on the semantic values in RHS to the list of - * alternative actions for STATE. Assumes that RHS comes from - * stack #K of *STACKP. */ + * YYRULE on the semantic values in YYRHS to the list of + * alternative actions for YYSTATE. Assumes that YYRHS comes from + * stack #YYK of *YYSTACKP. */ static void yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate, - yyGLRState* rhs, yyRuleNum yyrule) + yyGLRState* yyrhs, yyRuleNum yyrule) { yySemanticOption* yynewOption = &yynewGLRStackItem (yystackp, yyfalse)->yyoption; - yynewOption->yystate = rhs; + yynewOption->yystate = yyrhs; yynewOption->yyrule = yyrule; if (yystackp->yytops.yylookaheadNeeds[yyk]) { @@ -1091,7 +1041,7 @@ yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate, /* GLRStacks */ -/** Initialize SET to a singleton set containing an empty stack. */ +/** Initialize YYSET to a singleton set containing an empty stack. */ static yybool yyinitStateSet (yyGLRStateSet* yyset) { @@ -1117,8 +1067,8 @@ static void yyfreeStateSet (yyGLRStateSet* yyset) YYFREE (yyset->yylookaheadNeeds); } -/** Initialize STACK to a single empty stack, with total maximum - * capacity for all stacks of SIZE. */ +/** Initialize *YYSTACKP to a single empty stack, with total maximum + * capacity for all stacks of YYSIZE. */ static yybool yyinitGLRStack (yyGLRStack* yystackp, size_t yysize) { @@ -1140,7 +1090,7 @@ yyinitGLRStack (yyGLRStack* yystackp, size_t yysize) # define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \ &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE -/** If STACK is expandable, extend it. WARNING: Pointers into the +/** If *YYSTACKP is expandable, extend it. WARNING: Pointers into the stack from outside should be considered invalid after this call. We always expand when there are 1 or fewer items left AFTER an allocation, so that we can avoid having external pointers exist @@ -1210,9 +1160,9 @@ yyfreeGLRStack (yyGLRStack* yystackp) yyfreeStateSet (&yystackp->yytops); } -/** Assuming that S is a GLRState somewhere on STACK, update the - * splitpoint of STACK, if needed, so that it is at least as deep as - * S. */ +/** Assuming that YYS is a GLRState somewhere on *YYSTACKP, update the + * splitpoint of *YYSTACKP, if needed, so that it is at least as deep as + * YYS. */ static inline void yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys) { @@ -1220,7 +1170,7 @@ yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys) yystackp->yysplitPoint = yys; } -/** Invalidate stack #K in STACK. */ +/** Invalidate stack #YYK in *YYSTACKP. */ static inline void yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk) { @@ -1229,8 +1179,8 @@ yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk) yystackp->yytops.yystates[yyk] = YY_NULL; } -/** Undelete the last stack that was marked as deleted. Can only be - done once after a deletion, and only when all other stacks have +/** Undelete the last stack in *YYSTACKP that was marked as deleted. Can + only be done once after a deletion, and only when all other stacks have been deleted. */ static void yyundeleteLastStack (yyGLRStack* yystackp) @@ -1279,8 +1229,9 @@ yyremoveDeletes (yyGLRStack* yystackp) } } -/** Shift to a new state on stack #K of STACK, corresponding to LR state - * LRSTATE, at input position POSN, with (resolved) semantic value SVAL. */ +/** Shift to a new state on stack #YYK of *YYSTACKP, corresponding to LR + * state YYLRSTATE, at input position YYPOSN, with (resolved) semantic + * value *YYVALP and source location *YYLOCP. */ static inline void yyglrShift (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState, size_t yyposn, @@ -1299,12 +1250,12 @@ yyglrShift (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState, YY_RESERVE_GLRSTACK (yystackp); } -/** Shift stack #K of YYSTACK, to a new state corresponding to LR +/** Shift stack #YYK of *YYSTACKP, to a new state corresponding to LR * state YYLRSTATE, at input position YYPOSN, with the (unresolved) * semantic value of YYRHS under the action for YYRULE. */ static inline void yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState, - size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule) + size_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule) { yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate; @@ -1316,14 +1267,55 @@ yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState, yystackp->yytops.yystates[yyk] = yynewState; /* Invokes YY_RESERVE_GLRSTACK. */ - yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule); + yyaddDeferredAction (yystackp, yyk, yynewState, yyrhs, yyrule); +} + +#if !]b4_api_PREFIX[DEBUG +# define YY_REDUCE_PRINT(Args) +#else +# define YY_REDUCE_PRINT(Args) \ +do { \ + if (yydebug) \ + yy_reduce_print Args; \ +} while (YYID (0)) + +/*----------------------------------------------------------------------. +| Report that stack #YYK of *YYSTACKP is going to be reduced by YYRULE. | +`----------------------------------------------------------------------*/ + +/*ARGSUSED*/ static inline void +yy_reduce_print (int yynormal, yyGLRStackItem* yyvsp, size_t yyk, + yyRuleNum yyrule]b4_user_formals[) +{ + int yynrhs = yyrhsLength (yyrule);]b4_locations_if([ + int yylow = 1;])[ + int yyi; + YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n", + (unsigned long int) yyk, yyrule - 1, + (unsigned long int) yyrline[yyrule]); + if (! yynormal) + yyfillin (yyvsp, 1, -yynrhs); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + yystos[yyvsp[yyi - yynrhs + 1].yystate.yylrState], + &yyvsp[yyi - yynrhs + 1].yystate.yysemantics.yysval + ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl + b4_user_args[); + if (!yyvsp[yyi - yynrhs + 1].yystate.yyresolved) + YYFPRINTF (stderr, " (unresolved)"); + YYFPRINTF (stderr, "\n"); + } } +#endif -/** Pop the symbols consumed by reduction #RULE from the top of stack - * #K of STACK, and perform the appropriate semantic action on their +/** Pop the symbols consumed by reduction #YYRULE from the top of stack + * #YYK of *YYSTACKP, and perform the appropriate semantic action on their * semantic values. Assumes that all ambiguities in semantic values - * have been previously resolved. Set *VALP to the resulting value, - * and *LOCP to the computed location (if any). Return value is as + * have been previously resolved. Set *YYVALP to the resulting value, + * and *YYLOCP to the computed location (if any). Return value is as * for userAction. */ static inline YYRESULTTAG yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, @@ -1334,20 +1326,17 @@ yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, if (yystackp->yysplitPoint == YY_NULL) { /* Standard special case: single stack. */ - yyGLRStackItem* rhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; + yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; YYASSERT (yyk == 0); yystackp->yynextFree -= yynrhs; yystackp->yyspaceLeft += yynrhs; yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate; - return yyuserAction (yyrule, yynrhs, rhs, yystackp, + YY_REDUCE_PRINT ((1, yyrhs, yyk, yyrule]b4_user_args[)); + return yyuserAction (yyrule, yynrhs, yyrhs, yystackp, yyvalp]b4_locuser_args[); } else { - /* At present, doAction is never called in nondeterministic - * mode, so this branch is never taken. It is here in - * anticipation of a future feature that will allow immediate - * evaluation of selected actions in nondeterministic mode. */ int yyi; yyGLRState* yys; yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; @@ -1363,62 +1352,21 @@ yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, } yyupdateSplit (yystackp, yys); yystackp->yytops.yystates[yyk] = yys; + YY_REDUCE_PRINT ((0, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yyk, yyrule]b4_user_args[)); return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, yystackp, yyvalp]b4_locuser_args[); } } -#if !]b4_api_PREFIX[DEBUG -# define YY_REDUCE_PRINT(Args) -#else -# define YY_REDUCE_PRINT(Args) \ -do { \ - if (yydebug) \ - yy_reduce_print Args; \ -} while (YYID (0)) - -/*----------------------------------------------------------. -| Report that the RULE is going to be reduced on stack #K. | -`----------------------------------------------------------*/ - -/*ARGSUSED*/ static inline void -yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, - YYSTYPE* yyvalp]b4_locuser_formals[) -{ - int yynrhs = yyrhsLength (yyrule); - yybool yynormal __attribute__ ((__unused__)) = - (yystackp->yysplitPoint == YY_NULL); - yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; - int yylow = 1; - int yyi; - YYUSE (yyvalp);]b4_locations_if([ - YYUSE (yylocp);])[ -]b4_parse_param_use[]dnl -[ YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n", - (unsigned long int) yyk, yyrule - 1, - (unsigned long int) yyrline[yyrule]); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &]b4_rhs_value(yynrhs, yyi + 1)[ - ]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl - b4_user_args[); - YYFPRINTF (stderr, "\n"); - } -} -#endif - -/** Pop items off stack #K of STACK according to grammar rule RULE, +/** Pop items off stack #YYK of *YYSTACKP according to grammar rule YYRULE, * and push back on the resulting nonterminal symbol. Perform the - * semantic action associated with RULE and store its value with the - * newly pushed state, if FORCEEVAL or if STACK is currently + * semantic action associated with YYRULE and store its value with the + * newly pushed state, if YYFORCEEVAL or if *YYSTACKP is currently * unambiguous. Otherwise, store the deferred semantic action with * the new state. If the new state would have an identical input * position, LR state, and predecessor to an existing state on the stack, - * it is identified with that existing state, eliminating stack #K from - * the STACK. In this case, the (necessarily deferred) semantic value is + * it is identified with that existing state, eliminating stack #YYK from + * *YYSTACKP. In this case, the semantic value is * added to the options for the existing state's semantic value. */ static inline YYRESULTTAG @@ -1429,11 +1377,18 @@ yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, if (yyforceEval || yystackp->yysplitPoint == YY_NULL) { + YYRESULTTAG yyflag; YYSTYPE yysval;]b4_locations_if([ YYLTYPE yyloc;])[ - YY_REDUCE_PRINT ((yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[)); - YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[)); + yyflag = yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[); + if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULL) + { + YYDPRINTF ((stderr, "Parse on stack %lu rejected by rule #%d.\n", + (unsigned long int) yyk, yyrule - 1)); + } + if (yyflag != yyok) + return yyflag; YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc); yyglrShift (yystackp, yyk, yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState, @@ -1456,7 +1411,8 @@ yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule, yyupdateSplit (yystackp, yys); yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule)); YYDPRINTF ((stderr, - "Reduced stack %lu by rule #%d; action deferred. Now in state %d.\n", + "Reduced stack %lu by rule #%d; action deferred. " + "Now in state %d.\n", (unsigned long int) yyk, yyrule - 1, yynewLRState)); for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1) if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL) @@ -1527,7 +1483,7 @@ yysplitStack (yyGLRStack* yystackp, size_t yyk) return yystackp->yytops.yysize-1; } -/** True iff Y0 and Y1 represent identical options at the top level. +/** True iff YYY0 and YYY1 represent identical options at the top level. * That is, they represent the same rule applied to RHS symbols * that produce the same terminal symbols. */ static yybool @@ -1549,8 +1505,8 @@ yyidenticalOptions (yySemanticOption* yyy0, yySemanticOption* yyy1) return yyfalse; } -/** Assuming identicalOptions (Y0,Y1), destructively merge the - * alternative semantic values for the RHS-symbols of Y1 and Y0. */ +/** Assuming identicalOptions (YYY0,YYY1), destructively merge the + * alternative semantic values for the RHS-symbols of YYY1 and YYY0. */ static void yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1) { @@ -1629,11 +1585,11 @@ static YYRESULTTAG yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[); -/** Resolve the previous N states starting at and including state S. If result - * != yyok, some states may have been left unresolved possibly with empty - * semantic option chains. Regardless of whether result = yyok, each state - * has been left with consistent data so that yydestroyGLRState can be invoked - * if necessary. */ +/** Resolve the previous YYN states starting at and including state YYS + * on *YYSTACKP. If result != yyok, some states may have been left + * unresolved possibly with empty semantic option chains. Regardless + * of whether result = yyok, each state has been left with consistent + * data so that yydestroyGLRState can be invoked if necessary. */ static YYRESULTTAG yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystackp]b4_user_formals[) @@ -1648,9 +1604,10 @@ yyresolveStates (yyGLRState* yys, int yyn, return yyok; } -/** Resolve the states for the RHS of OPT, perform its user action, and return - * the semantic value and location. Regardless of whether result = yyok, all - * RHS states have been destroyed (assuming the user action destroys all RHS +/** Resolve the states for the RHS of YYOPT on *YYSTACKP, perform its + * user action, and return the semantic value and location in *YYVALP + * and *YYLOCP. Regardless of whether result = yyok, all RHS states + * have been destroyed (assuming the user action destroys all RHS * semantic values if invoked). */ static YYRESULTTAG yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystackp, @@ -1724,11 +1681,11 @@ yyreportTree (yySemanticOption* yyx, int yyindent) { if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn) YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", - yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1])); + yytokenName (yystos[yystates[yyi]->yylrState])); else YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", - yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]), - (unsigned long int) (yystates[yyi - 1]->yyposn + 1), + yytokenName (yystos[yystates[yyi]->yylrState]), + (unsigned long int) (yystates[yyi-1]->yyposn + 1), (unsigned long int) yystates[yyi]->yyposn); } else @@ -1757,9 +1714,9 @@ yyreportAmbiguity (yySemanticOption* yyx0, return yyabort; }]b4_locations_if([[ -/** Starting at and including state S1, resolve the location for each of the - * previous N1 states that is unresolved. The first semantic option of a state - * is always chosen. */ +/** Resolve the locations for each of the YYN1 states in *YYSTACKP, + * ending at YYS1. Has no effect on previously resolved states. + * The first semantic option of a state is always chosen. */ static void yyresolveLocations (yyGLRState* yys1, int yyn1, yyGLRStack *yystackp]b4_user_formals[) @@ -1813,11 +1770,12 @@ yyresolveLocations (yyGLRState* yys1, int yyn1, } }]])[ -/** Resolve the ambiguity represented in state S, perform the indicated - * actions, and set the semantic value of S. If result != yyok, the chain of - * semantic options in S has been cleared instead or it has been left - * unmodified except that redundant options may have been removed. Regardless - * of whether result = yyok, S has been left with consistent data so that +/** Resolve the ambiguity represented in state YYS in *YYSTACKP, + * perform the indicated actions, and set the semantic value of YYS. + * If result != yyok, the chain of semantic options in YYS has been + * cleared instead or it has been left unmodified except that + * redundant options may have been removed. Regardless of whether + * result = yyok, YYS has been left with consistent data so that * yydestroyGLRState can be invoked if necessary. */ static YYRESULTTAG yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[) @@ -1955,10 +1913,6 @@ static YYRESULTTAG yyprocessOneStack (yyGLRStack* yystackp, size_t yyk, size_t yyposn]b4_pure_formals[) { - int yyaction; - const short int* yyconflicts; - yyRuleNum yyrule; - while (yystackp->yytops.yystates[yyk] != YY_NULL) { yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState; @@ -1969,7 +1923,8 @@ yyprocessOneStack (yyGLRStack* yystackp, size_t yyk, if (yyisDefaultedState (yystate)) { - yyrule = yydefaultAction (yystate); + YYRESULTTAG yyflag; + yyRuleNum yyrule = yydefaultAction (yystate); if (yyrule == 0) { YYDPRINTF ((stderr, "Stack %lu dies.\n", @@ -1977,11 +1932,25 @@ yyprocessOneStack (yyGLRStack* yystackp, size_t yyk, yymarkStackDeleted (yystackp, yyk); return yyok; } - YYCHK (yyglrReduce (yystackp, yyk, yyrule, yyfalse]b4_user_args[)); + yyflag = yyglrReduce (yystackp, yyk, yyrule, yyimmediate[yyrule]]b4_user_args[); + if (yyflag == yyerr) + { + YYDPRINTF ((stderr, + "Stack %lu dies " + "(predicate failure or explicit user error).\n", + (unsigned long int) yyk)); + yymarkStackDeleted (yystackp, yyk); + return yyok; + } + if (yyflag != yyok) + return yyflag; } else { yySymbol yytoken; + int yyaction; + const short int* yyconflicts; + yystackp->yytops.yylookaheadNeeds[yyk] = yytrue; if (yychar == YYEMPTY) { @@ -2004,14 +1973,25 @@ yyprocessOneStack (yyGLRStack* yystackp, size_t yyk, while (*yyconflicts != 0) { + YYRESULTTAG yyflag; size_t yynewStack = yysplitStack (yystackp, yyk); YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n", (unsigned long int) yynewStack, (unsigned long int) yyk)); - YYCHK (yyglrReduce (yystackp, yynewStack, - *yyconflicts, yyfalse]b4_user_args[)); - YYCHK (yyprocessOneStack (yystackp, yynewStack, - yyposn]b4_pure_args[)); + yyflag = yyglrReduce (yystackp, yynewStack, + *yyconflicts, + yyimmediate[*yyconflicts]]b4_user_args[); + if (yyflag == yyok) + YYCHK (yyprocessOneStack (yystackp, yynewStack, + yyposn]b4_pure_args[)); + else if (yyflag == yyerr) + { + YYDPRINTF ((stderr, "Stack %lu dies.\n", + (unsigned long int) yynewStack)); + yymarkStackDeleted (yystackp, yynewStack); + } + else + return yyflag; yyconflicts += 1; } @@ -2025,8 +2005,21 @@ yyprocessOneStack (yyGLRStack* yystackp, size_t yyk, break; } else - YYCHK (yyglrReduce (yystackp, yyk, -yyaction, - yyfalse]b4_user_args[)); + { + YYRESULTTAG yyflag = yyglrReduce (yystackp, yyk, -yyaction, + yyimmediate[-yyaction]]b4_user_args[); + if (yyflag == yyerr) + { + YYDPRINTF ((stderr, + "Stack %lu dies " + "(predicate failure or explicit user error).\n", + (unsigned long int) yyk)); + yymarkStackDeleted (yystackp, yyk); + break; + } + else if (yyflag != yyok) + return yyflag; + } } } return yyok; @@ -2279,7 +2272,6 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[) } \ } while (YYID (0)) - /*----------. | yyparse. | `----------*/ @@ -2303,8 +2295,8 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[) ]) m4_ifdef([b4_initial_action], [ b4_dollar_pushdef([yylval], [], [yylloc])dnl -/* User initialization code. */ -b4_user_initial_action + /* User initialization code. */ + b4_user_initial_action b4_dollar_popdef])[]dnl [ if (! yyinitGLRStack (yystackp, YYINITDEPTH)) @@ -2599,9 +2591,7 @@ yypdumpstack (yyGLRStack* yystackp) YYFPRINTF (stderr, "\n"); } #endif -] - -b4_epilogue +]b4_epilogue[]dnl dnl dnl glr.cc produces its own header. dnl diff --git a/data/glr.cc b/data/glr.cc index 78a7ae51..e1826da9 100644 --- a/data/glr.cc +++ b/data/glr.cc @@ -1,5 +1,3 @@ - -*- C -*- - # C++ GLR skeleton for Bison # Copyright (C) 2002-2012 Free Software Foundation, Inc. @@ -29,7 +27,7 @@ # # The additional arguments are stored as members of the parser # object, yyparser. The C routines need to carry yyparser -# throughout the C parser; that easy: just let yyparser become an +# throughout the C parser; that's easy: make yyparser an # additional parse-param. But because the C++ skeleton needs to # know the "real" original parse-param, we save them # (b4_parse_param_orig). Note that b4_parse_param is overquoted @@ -39,14 +37,13 @@ # The locations # # We use location.cc just like lalr1.cc, but because glr.c stores -# the locations in a (C++) union, the position and location classes +# the locations in a union, the position and location classes # must not have a constructor. Therefore, contrary to lalr1.cc, we # must not define "b4_location_constructors". As a consequence the # user must initialize the first positions (in particular the # filename member). -# We require a pure interface using locations. -m4_define([b4_locations_flag], [1]) +# We require a pure interface. m4_define([b4_pure_flag], [1]) # The header is mandatory. @@ -76,12 +73,13 @@ m4_define([b4_yy_symbol_print_generate], ]b4_c_ansi_function_def([yy_symbol_print], [static void], - [[FILE *], []], - [[int yytype], [yytype]], + [[FILE *], []], + [[int yytype], [yytype]], [[const ]b4_namespace_ref::b4_parser_class_name[::semantic_type *yyvaluep], - [yyvaluep]], + [yyvaluep]][]dnl +b4_locations_if([, [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp], - [yylocationp]], + [yylocationp]]]), b4_parse_param)[ { ]b4_parse_param_use[]dnl @@ -97,9 +95,9 @@ m4_append([b4_post_prologue], ]b4_yylloc_default_define[ #define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc) ]b4_c_ansi_function_decl([yyerror], - [static void], + [static void],b4_locations_if([ [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp], - [yylocationp]], + [yylocationp]],]) b4_parse_param, [[const char* msg], [msg]])]) @@ -113,14 +111,14 @@ m4_append([b4_epilogue], `------------------*/ ]b4_c_ansi_function_def([yyerror], - [static void], + [static void],b4_locations_if([ [[const ]b4_namespace_ref::b4_parser_class_name[::location_type *yylocationp], - [yylocationp]], + [yylocationp]],]) b4_parse_param, [[const char* msg], [msg]])[ { ]b4_parse_param_use[]dnl -[ yyparser.error (*yylocationp, msg); +[ yyparser.error (]b4_locations_if([[*yylocationp, ]])[msg); } @@ -131,8 +129,7 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl ]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [ :])[ #if ]b4_api_PREFIX[DEBUG - ]m4_ifset([b4_parse_param], [ ], [ :])[ - yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[ + ]m4_ifset([b4_parse_param], [ ], [ :])[yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[ #endif]b4_parse_param_cons[ { } @@ -154,17 +151,17 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl inline void ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype, - const semantic_type* yyvaluep, - const location_type* yylocationp) - { - YYUSE (yylocationp); + const semantic_type* yyvaluep]b4_locations_if([[, + const location_type* yylocationp]])[) + {]b4_locations_if([[ + YYUSE (yylocationp);]])[ YYUSE (yyvaluep); std::ostream& yyoutput = debug_stream (); std::ostream& yyo = yyoutput; YYUSE (yyo); switch (yytype) { - ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl +]b4_symbol_foreach([b4_symbol_printer])dnl [ default: break; } @@ -173,13 +170,13 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl void ]b4_parser_class_name[::yy_symbol_print_ (int yytype, - const semantic_type* yyvaluep, - const location_type* yylocationp) + const semantic_type* yyvaluep]b4_locations_if([[, + const location_type* yylocationp]])[) { *yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm") - << ' ' << yytname[yytype] << " (" - << *yylocationp << ": "; - yy_symbol_value_print_ (yytype, yyvaluep, yylocationp); + << ' ' << yytname[yytype] << " ("]b4_locations_if([[ + << *yylocationp << ": "]])[; + yy_symbol_value_print_ (yytype, yyvaluep]b4_locations_if([[, yylocationp]])[); *yycdebug_ << ')'; } @@ -212,7 +209,6 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl #endif ]m4_popdef([b4_parse_param])dnl b4_namespace_close[ - ]]) @@ -227,21 +223,19 @@ m4_defn([b4_parse_param]))], m4_include(b4_pkgdatadir/[glr.c]) m4_popdef([b4_parse_param]) -m4_divert_push(0) -@output(b4_spec_defines_file@)@ -b4_copyright([Skeleton interface for Bison GLR parsers in C++], - [2002-2006, 2009-2012])[ - -/* C++ GLR parser skeleton written by Akim Demaille. */ -]b4_cpp_guard_open([b4_spec_defines_file])[ - -]b4_percent_code_get([[requires]])[ +# b4_shared_declarations +# ---------------------- +# Declaration that might either go into the header (if --defines) +# or open coded in the parser body. +m4_define([b4_shared_declarations], +[b4_percent_code_get([[requires]])[ -# include -# include +#include +#include +#include ]b4_percent_define_ifdef([[location_type]], [], - [[# include "location.hh"]])[ + [[#include "location.hh"]])[ ]b4_YYDEBUG_define[ @@ -250,29 +244,7 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++], class ]b4_parser_class_name[ { public: - /// Symbol semantic values. -# ifndef ]b4_api_PREFIX[STYPE -]m4_ifdef([b4_stype], -[ union semantic_type - { -b4_user_stype - };], -[m4_if(b4_tag_seen_flag, 0, -[[ typedef int semantic_type;]], -[[ typedef ]b4_api_PREFIX[STYPE semantic_type;]])])[ -# else - typedef ]b4_api_PREFIX[STYPE semantic_type; -# endif - /// Symbol locations. - typedef ]b4_percent_define_get([[location_type]], - [[location]])[ location_type; - /// Tokens. - struct token - { - ]b4_token_enums(b4_tokens)[ - }; - /// Token type. - typedef token::yytokentype token_type; +]b4_public_types_declare[ /// Build a parser object. ]b4_parser_class_name[ (]b4_parse_param_decl[); @@ -294,42 +266,39 @@ b4_user_stype /// Set the current debugging level. void set_debug_level (debug_level_type l); - private: - public: - /// Report a syntax error. - /// \param loc where the syntax error is found. + /// Report a syntax error.]b4_locations_if([[ + /// \param loc where the syntax error is found.]])[ /// \param msg a description of the syntax error. - virtual void error (const location_type& loc, const std::string& msg); - private: + virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg); # if ]b4_api_PREFIX[DEBUG public: /// \brief Report a symbol value on the debug stream. /// \param yytype The token type. - /// \param yyvaluep Its semantic value. - /// \param yylocationp Its location. + /// \param yyvaluep Its semantic value.]b4_locations_if([[ + /// \param yylocationp Its location.]])[ virtual void yy_symbol_value_print_ (int yytype, - const semantic_type* yyvaluep, - const location_type* yylocationp); + const semantic_type* yyvaluep]b4_locations_if([[, + const location_type* yylocationp]])[); /// \brief Report a symbol on the debug stream. /// \param yytype The token type. - /// \param yyvaluep Its semantic value. - /// \param yylocationp Its location. + /// \param yyvaluep Its semantic value.]b4_locations_if([[ + /// \param yylocationp Its location.]])[ virtual void yy_symbol_print_ (int yytype, - const semantic_type* yyvaluep, - const location_type* yylocationp); + const semantic_type* yyvaluep]b4_locations_if([[, + const location_type* yylocationp]])[); private: /* Debugging. */ std::ostream* yycdebug_; -# endif +#endif ]b4_parse_param_vars[ }; ]dnl Redirections for glr.c. b4_percent_define_flag_if([[global_tokens_and_yystype]], -[b4_token_defines(b4_tokens)]) +[b4_token_defines]) [ #ifndef ]b4_api_PREFIX[STYPE # define ]b4_api_PREFIX[STYPE ]b4_namespace_ref[::]b4_parser_class_name[::semantic_type @@ -340,5 +309,16 @@ b4_percent_define_flag_if([[global_tokens_and_yystype]], ]b4_namespace_close[ ]b4_percent_code_get([[provides]])[ +]]) + +m4_divert_push(0) +@output(b4_spec_defines_file@)@ +b4_copyright([Skeleton interface for Bison GLR parsers in C++], + [2002-2012])[ + +/* C++ GLR parser skeleton written by Akim Demaille. */ + +]b4_cpp_guard_open([b4_spec_defines_file])[ +]b4_shared_declarations[ ]b4_cpp_guard_close([b4_spec_defines_file])[ ]m4_divert_pop(0) diff --git a/data/java.m4 b/data/java.m4 index 18ea30b5..988ac39a 100644 --- a/data/java.m4 +++ b/data/java.m4 @@ -30,7 +30,7 @@ m4_define([b4_comment], [/* m4_bpatsubst([$1], [ # -------------------------- # Join two lists with a comma if necessary. m4_define([b4_list2], - [$1[]m4_ifval(m4_quote($1), [m4_ifval(m4_quote($2), [[, ]])])[]$2]) + [$1[]m4_ifval(m4_quote($1), [m4_ifval(m4_quote($2), [[, ]])])[]$2]) # b4_percent_define_get3(DEF, PRE, POST, NOT) @@ -38,8 +38,8 @@ m4_define([b4_list2], # Expand to the value of DEF surrounded by PRE and POST if it's %define'ed, # otherwise NOT. m4_define([b4_percent_define_get3], - [m4_ifval(m4_quote(b4_percent_define_get([$1])), - [$2[]b4_percent_define_get([$1])[]$3], [$4])]) + [m4_ifval(m4_quote(b4_percent_define_get([$1])), + [$2[]b4_percent_define_get([$1])[]$3], [$4])]) @@ -104,7 +104,7 @@ m4_define([b4_identification], m4_define([b4_int_type], [m4_if(b4_ints_in($@, [-128], [127]), [1], [byte], b4_ints_in($@, [-32768], [32767]), [1], [short], - [int])]) + [int])]) # b4_int_type_for(NAME) # --------------------- @@ -118,27 +118,45 @@ m4_define([b4_int_type_for], m4_define([b4_null], [null]) +# b4_typed_parser_table_define(TYPE, NAME, DATA, COMMENT) +# ------------------------------------------------------- +m4_define([b4_typed_parser_table_define], +[m4_ifval([$4], [b4_comment([$4]) + ])dnl +[private static final ]$1[ yy$2_[] = yy$2_init(); + private static final ]$1[[] yy$2_init() + { + return new ]$1[[] + { + ]$3[ + }; + }]]) + + +# b4_integral_parser_table_define(NAME, DATA, COMMENT) +#----------------------------------------------------- +m4_define([b4_integral_parser_table_define], +[b4_typed_parser_table_define([b4_int_type_for([$2])], [$1], [$2], [$3])]) + + ## ------------------------- ## ## Assigning token numbers. ## ## ------------------------- ## -# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER) -# --------------------------------------- +# b4_token_enum(TOKEN-NUM) +# ------------------------ # Output the definition of this token as an enum. m4_define([b4_token_enum], -[ /** Token number, to be returned by the scanner. */ - public static final int $1 = $2; -]) +[b4_token_format([ /** Token number, to be returned by the scanner. */ + static final int %s = %s; +], [$1])]) - -# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) -# ----------------------------------------------------- +# b4_token_enums +# -------------- # Output the definition of the tokens (if there are) as enums. m4_define([b4_token_enums], -[m4_if([$#$1], [1], [], -[/* Tokens. */ -m4_map([b4_token_enum], [$@])]) -]) +[b4_any_token_visible_if([/* Tokens. */ +b4_symbol_foreach([b4_token_enum])])]) # b4-case(ID, CODE) # ----------------- @@ -149,30 +167,40 @@ m4_define([b4_case], [ case $1: break; ]) +# b4_predicate_case(LABEL, CONDITIONS) +# ------------------------------------ +m4_define([b4_predicate_case], [ case $1: + if (! ($2)) YYERROR; + break; + ]) + ## ---------------- ## ## Default values. ## ## ---------------- ## m4_define([b4_yystype], [b4_percent_define_get([[stype]])]) -b4_percent_define_default([[stype]], [[Object]])]) +b4_percent_define_default([[stype]], [[Object]]) # %name-prefix m4_define_default([b4_prefix], [[YY]]) -b4_percent_define_default([[parser_class_name]], [b4_prefix[]Parser])]) +b4_percent_define_default([[parser_class_name]], [b4_prefix[]Parser]) m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) -b4_percent_define_default([[lex_throws]], [[java.io.IOException]])]) +b4_percent_define_default([[lex_throws]], [[java.io.IOException]]) m4_define([b4_lex_throws], [b4_percent_define_get([[lex_throws]])]) -b4_percent_define_default([[throws]], [])]) +b4_percent_define_default([[throws]], []) m4_define([b4_throws], [b4_percent_define_get([[throws]])]) -b4_percent_define_default([[location_type]], [Location])]) +b4_percent_define_default([[init_throws]], []) +m4_define([b4_init_throws], [b4_percent_define_get([[init_throws]])]) + +b4_percent_define_default([[location_type]], [Location]) m4_define([b4_location_type], [b4_percent_define_get([[location_type]])]) -b4_percent_define_default([[position_type]], [Position])]) +b4_percent_define_default([[position_type]], [Position]) m4_define([b4_position_type], [b4_percent_define_get([[position_type]])]) @@ -219,21 +247,21 @@ m4_define([b4_rhs_location], # it to be single quoted. Same for b4_parse_param. # TODO: should be in bison.m4 -m4_define_default([b4_lex_param], [[]])) -m4_define([b4_lex_param], b4_lex_param)) -m4_define([b4_parse_param], b4_parse_param)) +m4_define_default([b4_lex_param], [[]]) +m4_define([b4_lex_param], b4_lex_param) +m4_define([b4_parse_param], b4_parse_param) # b4_lex_param_decl -# ------------------- +# ----------------- # Extra formal arguments of the constructor. m4_define([b4_lex_param_decl], [m4_ifset([b4_lex_param], [b4_remove_comma([$1], - b4_param_decls(b4_lex_param))], - [$1])]) + b4_param_decls(b4_lex_param))], + [$1])]) m4_define([b4_param_decls], - [m4_map([b4_param_decl], [$@])]) + [m4_map([b4_param_decl], [$@])]) m4_define([b4_param_decl], [, $1]) m4_define([b4_remove_comma], [m4_ifval(m4_quote($1), [$1, ], [])m4_shift2($@)]) @@ -246,21 +274,21 @@ m4_define([b4_remove_comma], [m4_ifval(m4_quote($1), [$1, ], [])m4_shift2($@)]) m4_define([b4_parse_param_decl], [m4_ifset([b4_parse_param], [b4_remove_comma([$1], - b4_param_decls(b4_parse_param))], - [$1])]) + b4_param_decls(b4_parse_param))], + [$1])]) # b4_lex_param_call -# ------------------- +# ----------------- # Delegating the lexer parameters to the lexer constructor. m4_define([b4_lex_param_call], [m4_ifset([b4_lex_param], - [b4_remove_comma([$1], - b4_param_calls(b4_lex_param))], - [$1])]) + [b4_remove_comma([$1], + b4_param_calls(b4_lex_param))], + [$1])]) m4_define([b4_param_calls], - [m4_map([b4_param_call], [$@])]) + [m4_map([b4_param_call], [$@])]) m4_define([b4_param_call], [, $2]) @@ -270,13 +298,13 @@ m4_define([b4_param_call], [, $2]) # Extra initialisations of the constructor. m4_define([b4_parse_param_cons], [m4_ifset([b4_parse_param], - [b4_constructor_calls(b4_parse_param)])]) + [b4_constructor_calls(b4_parse_param)])]) m4_define([b4_constructor_calls], - [m4_map([b4_constructor_call], [$@])]) + [m4_map([b4_constructor_call], [$@])]) m4_define([b4_constructor_call], - [this.$2 = $2; - ]) + [this.$2 = $2; + ]) @@ -285,15 +313,15 @@ m4_define([b4_constructor_call], # Extra instance variables. m4_define([b4_parse_param_vars], [m4_ifset([b4_parse_param], - [ + [ /* User arguments. */ b4_var_decls(b4_parse_param)])]) m4_define([b4_var_decls], - [m4_map_sep([b4_var_decl], [ + [m4_map_sep([b4_var_decl], [ ], [$@])]) m4_define([b4_var_decl], - [ protected final $1;]) + [ protected final $1;]) @@ -301,4 +329,4 @@ m4_define([b4_var_decl], # ----------------------- # Expand to either an empty string or "throws THROWS". m4_define([b4_maybe_throws], - [m4_ifval($1, [throws $1])]) + [m4_ifval($1, [throws $1])]) diff --git a/data/lalr1.cc b/data/lalr1.cc index c1639033..8cf20430 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -17,76 +17,148 @@ m4_include(b4_pkgdatadir/[c++.m4]) -m4_define([b4_parser_class_name], - [b4_percent_define_get([[parser_class_name]])]) -# The header is mandatory. -b4_defines_if([], - [b4_fatal([b4_skeleton[: using %%defines is mandatory]])]) +# b4_integral_parser_table_declare(TABLE-NAME, CONTENT, COMMENT) +# -------------------------------------------------------------- +# Declare "parser::yy_" which contents is CONTENT. +m4_define([b4_integral_parser_table_declare], +[m4_ifval([$3], [b4_c_comment([$3], [ ]) +])dnl + static const b4_int_type_for([$2]) yy$1_[[]];dnl +]) + +# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT) +# ------------------------------------------------------------- +# Define "parser::yy_" which contents is CONTENT. +m4_define([b4_integral_parser_table_define], +[ const b4_int_type_for([$2]) + b4_parser_class_name::yy$1_[[]] = + { + $2 + };dnl +]) -b4_percent_define_ifdef([[location_type]], [], - [# Backward compatibility. - m4_define([b4_location_constructors]) - m4_include(b4_pkgdatadir/[location.cc])]) -m4_include(b4_pkgdatadir/[stack.hh]) -# We do want M4 expansion after # for CPP macros. -m4_changecom() -m4_divert_push(0)dnl -b4_defines_if( -[@output(b4_spec_defines_file@)@ -b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++], - [2002-2012]) -[ -/** - ** \file ]b4_spec_defines_file[ - ** Define the ]b4_namespace_ref[::parser class. - */ +# b4_symbol_value_template(VAL, [TYPE]) +# ------------------------------------- +# Same as b4_symbol_value, but used in a template method. It makes +# a difference when using variants. +m4_copy([b4_symbol_value], [b4_symbol_value_template]) -/* C++ LALR(1) parser skeleton written by Akim Demaille. */ -]b4_cpp_guard_open([b4_spec_defines_file])[ +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], + [b4_symbol_value([yylhs.value], [$1])]) + + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], + [yylhs.location]) + + +# b4_rhs_data(RULE-LENGTH, NUM) +# ----------------------------- +# Return the data corresponding to the symbol #NUM, where the current +# rule has RULE-LENGTH symbols on RHS. +m4_define([b4_rhs_data], + [yystack_@{b4_subtract($@)@}]) + + +# b4_rhs_state(RULE-LENGTH, NUM) +# ------------------------------ +# The state corresponding to the symbol #NUM, where the current +# rule has RULE-LENGTH symbols on RHS. +m4_define([b4_rhs_state], + [b4_rhs_data([$1], [$2]).state]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +m4_define([b4_rhs_value], + [b4_symbol_value([b4_rhs_data([$1], [$2]).value], [$3])]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], + [b4_rhs_data([$1], [$2]).location]) + + +# b4_symbol_action(SYMBOL-NUM, KIND) +# ---------------------------------- +# Run the action KIND (destructor or printer) for SYMBOL-NUM. +# Same as in C, but using references instead of pointers. +m4_define([b4_symbol_action], +[b4_symbol_if([$1], [has_$2], +[m4_pushdef([b4_symbol_value], m4_defn([b4_symbol_value_template]))[]dnl +b4_dollar_pushdef([yysym.value], + b4_symbol_if([$1], [has_type], + [m4_dquote(b4_symbol([$1], [type]))]), + [yysym.location])dnl + b4_symbol_case_([$1]) +b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"]) + b4_symbol([$1], [$2]) +b4_syncline([@oline@], [@ofile@]) + break; + +m4_popdef([b4_symbol_value])[]dnl +b4_dollar_popdef[]dnl +])]) -]b4_percent_code_get([[requires]])[ -#include -#include -#include "stack.hh" -]b4_percent_define_ifdef([[location_type]], [], - [[#include "location.hh"]])[ +m4_pushdef([b4_copyright_years], + [2002-2012]) + +m4_define([b4_parser_class_name], + [b4_percent_define_get([[parser_class_name]])]) + +b4_locations_if([b4_percent_define_ifdef([[location_type]], [], + [# Backward compatibility. + m4_define([b4_location_constructors]) + m4_include(b4_pkgdatadir/[location.cc])])]) +m4_include(b4_pkgdatadir/[stack.hh]) +b4_variant_if([m4_include(b4_pkgdatadir/[variant.hh])]) + +# b4_shared_declarations +# ---------------------- +# Declaration that might either go into the header (if --defines) +# or open coded in the parser body. +m4_define([b4_shared_declarations], +[b4_percent_code_get([[requires]])[ +]b4_parse_assert_if([# include ])[ +# include +# include +# include +# include ]b4_defines_if([[ +# include "stack.hh" +]b4_locations_if([b4_percent_define_ifdef([[location_type]], [], + [[# include "location.hh"]])])])[ ]b4_YYDEBUG_define[ ]b4_namespace_open[ +]b4_defines_if([], +[b4_stack_define +b4_locations_if([b4_percent_define_ifdef([[location_type]], [], + [b4_position_define +b4_location_define])])])[ + +]b4_variant_if([b4_variant_define])[ + /// A Bison parser. class ]b4_parser_class_name[ { public: - /// Symbol semantic values. -#ifndef ]b4_api_PREFIX[STYPE -]m4_ifdef([b4_stype], -[ union semantic_type - { -b4_user_stype - };], -[m4_if(b4_tag_seen_flag, 0, -[[ typedef int semantic_type;]], -[[ typedef ]b4_api_PREFIX[STYPE semantic_type;]])])[ -#else - typedef ]b4_api_PREFIX[STYPE semantic_type; -#endif - /// Symbol locations. - typedef ]b4_percent_define_get([[location_type]], - [[location]])[ location_type; - /// Tokens. - struct token - { - ]b4_token_enums(b4_tokens)[ - }; - /// Token type. - typedef token::yytokentype token_type; - +]b4_public_types_declare[ /// Build a parser object. ]b4_parser_class_name[ (]b4_parse_param_decl[); virtual ~]b4_parser_class_name[ (); @@ -109,50 +181,27 @@ b4_user_stype void set_debug_level (debug_level_type l); #endif - private: - /// Report a syntax error. - /// \param loc where the syntax error is found. + /// Report a syntax error.]b4_locations_if([[ + /// \param loc where the syntax error is found.]])[ /// \param msg a description of the syntax error. - virtual void error (const location_type& loc, const std::string& msg); - - /// Generate an error message. - /// \param state the state where the error occurred. - /// \param tok the lookahead token. - virtual std::string yysyntax_error_ (int yystate, int tok); - -#if ]b4_api_PREFIX[DEBUG - /// \brief Report a symbol value on the debug stream. - /// \param yytype The token type. - /// \param yyvaluep Its semantic value. - /// \param yylocationp Its location. - virtual void yy_symbol_value_print_ (int yytype, - const semantic_type* yyvaluep, - const location_type* yylocationp); - /// \brief Report a symbol on the debug stream. - /// \param yytype The token type. - /// \param yyvaluep Its semantic value. - /// \param yylocationp Its location. - virtual void yy_symbol_print_ (int yytype, - const semantic_type* yyvaluep, - const location_type* yylocationp); -#endif + virtual void error (]b4_locations_if([[const location_type& loc, ]])[const std::string& msg); + /// Report a syntax error. + void error (const syntax_error& err); + private: /// State numbers. typedef int state_type; - /// State stack type. - typedef stack state_stack_type; - /// Semantic value stack type. - typedef stack semantic_stack_type; - /// location stack type. - typedef stack location_stack_type; - - /// The state stack. - state_stack_type yystate_stack_; - /// The semantic value stack. - semantic_stack_type yysemantic_stack_; - /// The location stack. - location_stack_type yylocation_stack_; + + /// Generate an error message. + /// \param yystate the state where the error occurred. + /// \param yytoken the lookahead token. + virtual std::string yysyntax_error_ (state_type yystate, int yytoken); + + /// Compute post-reduction state. + /// \param yystate the current state + /// \param yylhs the nonterminal to push on the stack + state_type yy_lr_goto_state_ (state_type yystate, int yylhs); /// Whether the given \c yypact_ value indicates a defaulted state. /// \param yyvalue the value to check @@ -164,36 +213,11 @@ b4_user_stype /// Internal symbol numbers. typedef ]b4_int_type_for([b4_translate])[ token_number_type; - /* Tables. */ - /// For a state, the index in \a yytable_ of its portion. - static const ]b4_int_type_for([b4_pact])[ yypact_[]; static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_; - - /// For a state, default reduction number. - /// Unless\a yytable_ specifies something else to do. - /// Zero means the default is an error. - static const ]b4_int_type_for([b4_defact])[ yydefact_[]; - - static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[]; - static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[]; - - /// What to do in a state. - /// \a yytable_[yypact_[s]]: what to do in state \a s. - /// - if positive, shift that token. - /// - if negative, reduce the rule which number is the opposite. - /// - if zero, do what YYDEFACT says. - static const ]b4_int_type_for([b4_table])[ yytable_[]; static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_; - static const ]b4_int_type_for([b4_check])[ yycheck_[]; - - /// For a state, its accessing symbol. - static const ]b4_int_type_for([b4_stos])[ yystos_[]; - - /// For a rule, its LHS. - static const ]b4_int_type_for([b4_r1])[ yyr1_[]; - /// For a rule, its RHS length. - static const ]b4_int_type_for([b4_r2])[ yyr2_[]; ]b4_error_verbose_if([ + // Tables. +]b4_parser_tables_declare[]b4_error_verbose_if([ /// Convert the symbol name \a n to a form suitable for a diagnostic. static std::string yytnamerr_ (const char *n);])[ @@ -202,60 +226,106 @@ b4_user_stype /// For a symbol, its name in clear. static const char* const yytname_[]; ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[ - /// A type to store symbol numbers and -1. - typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type; - /// A `-1'-separated list of the rules' RHS. - static const rhs_number_type yyrhs_[]; - /// For each rule, the index of the first RHS symbol in \a yyrhs_. - static const ]b4_int_type_for([b4_prhs])[ yyprhs_[]; - /// For each rule, its source line number. - static const ]b4_int_type_for([b4_rline])[ yyrline_[]; - /// For each scanner token number, its symbol number. - static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[]; +]b4_integral_parser_table_declare([rline], [b4_rline], + [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[ /// Report on the debug stream that the rule \a r is going to be reduced. virtual void yy_reduce_print_ (int r); /// Print the state stack on the debug stream. virtual void yystack_print_ (); - /* Debugging. */ + // Debugging. int yydebug_; std::ostream* yycdebug_; -#endif +#endif // ]b4_api_PREFIX[DEBUG /// Convert a scanner token number \a t to a symbol number. - token_number_type yytranslate_ (int t); + static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t); + +#if ]b4_api_PREFIX[DEBUG + /// \brief Display a symbol type, value and location. + /// \param yyo The output stream. + /// \param yysym The symbol. + template + void yy_print_ (std::ostream& yyo, + const symbol_base_type& yysym) const; +#endif /// \brief Reclaim the memory associated to a symbol. - /// \param yymsg Why this token is reclaimed. - /// \param yytype The symbol type. - /// \param yyvaluep Its semantic value. - /// \param yylocationp Its location. - inline void yydestruct_ (const char* yymsg, - int yytype, - semantic_type* yyvaluep, - location_type* yylocationp); + /// \param yymsg Why this token is reclaimed. + /// If null, print nothing. + /// \param s The symbol. + template + inline void yy_destroy_ (const char* yymsg, + symbol_base_type& yysym) const; + + private: + /// Element of the stack: a state and its attributes. + struct stack_symbol_type : symbol_base_type + { + /// The parent class. + typedef symbol_base_type super_type; + + /// Default constructor. + inline stack_symbol_type (); + + /// Constructor. + inline stack_symbol_type (]b4_args([state_type s], + [const semantic_type& v], + b4_locations_if([const location_type& l]))[); + + /// The state. + state_type state; + + /// The type (corresponding to \a state). + inline int type_get_ () const; + }; + + /// Stack type. + typedef stack stack_type; + + /// The stack. + stack_type yystack_; + + /// Push a new state on the stack. + /// \param m a debug message to display + /// if null, no trace is output. + /// \param s the symbol + /// \warning the contents of \a s.value is stolen. + inline void yypush_ (const char* m, stack_symbol_type& s); + + /// Push a new look ahead token on the state on the stack. + /// \param m a debug message to display + /// if null, no trace is output. + /// \param s the state + /// \param sym the symbol (for its value and location). + /// \warning the contents of \a s.value is stolen. + inline void yypush_ (const char* m, state_type s, symbol_type& sym); /// Pop \a n symbols the three stacks. inline void yypop_ (unsigned int n = 1); /* Constants. */ - static const int yyeof_; - /* LAST_ -- Last index in TABLE_. */ - static const int yylast_; - static const int yynnts_; - static const int yyempty_; - static const int yyfinal_; - static const int yyterror_; - static const int yyerrcode_; - static const int yyntokens_; - static const unsigned int yyuser_token_number_max_; - static const token_number_type yyundef_token_; + enum + { + yyeof_ = 0, + yylast_ = ]b4_last[, //< Last index in yytable_. + yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols. + yyempty_ = -2, + yyfinal_ = ]b4_final_state_number[, //< Termination state number. + yyterror_ = 1, + yyerrcode_ = 256, + yyntokens_ = ]b4_tokens_number[ //< Number of tokens. + }; + ]b4_parse_param_vars[ }; + +]b4_lex_symbol_if([b4_yytranslate_define +b4_public_types_define])[ ]b4_namespace_close[ ]b4_percent_define_flag_if([[global_tokens_and_yystype]], -[b4_token_defines(b4_tokens) +[b4_token_defines #ifndef ]b4_api_PREFIX[STYPE /* Redirection for backward compatibility. */ @@ -263,29 +333,50 @@ b4_user_stype #endif ])[ ]b4_percent_code_get([[provides]])[ +]]) + +# We do want M4 expansion after # for CPP macros. +m4_changecom() +b4_defines_if( +[m4_divert_push(0)dnl +@output(b4_spec_defines_file@)@ +b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++]) +[ +/** + ** \file ]b4_spec_defines_file[ + ** Define the ]b4_namespace_ref[::parser class. + */ + +/* C++ LALR(1) parser skeleton written by Akim Demaille. */ + +]b4_cpp_guard_open([b4_spec_defines_file])[ +]b4_shared_declarations[ ]b4_cpp_guard_close([b4_spec_defines_file]) -])dnl +m4_divert_pop(0)dnl +]) + + +m4_divert_push(0)dnl @output(b4_parser_file_name@)@ -b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++], - [2002-2012]) +b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++]) b4_percent_code_get([[top]])[]dnl m4_if(b4_prefix, [yy], [], [ // Take the name prefix into account. #define yylex b4_prefix[]lex])[ -/* First part of user declarations. */ +// First part of user declarations. ]b4_user_pre_prologue[ -]b4_defines_if([[ -#include "@basename(]b4_spec_defines_file[@)"]])[ +]b4_null_define[ + +]b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]], + [b4_shared_declarations])[ /* User implementation prologue. */ ]b4_user_post_prologue[ ]b4_percent_code_get[ -]b4_null_define[ - #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS @@ -298,8 +389,9 @@ m4_if(b4_prefix, [yy], [], # endif #endif -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -]b4_yylloc_default_define[ +]b4_locations_if([dnl +[#define YYRHSLOC(Rhs, K) ((Rhs)[K].location) +]b4_yylloc_default_define])[ /* Suppress unused-variable warnings by "using" E. */ #define YYUSE(e) ((void) (e)) @@ -310,43 +402,43 @@ m4_if(b4_prefix, [yy], [], /* A pseudo ostream that takes yydebug_ into account. */ # define YYCDEBUG if (yydebug_) (*yycdebug_) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug_) \ - { \ - *yycdebug_ << Title << ' '; \ - yy_symbol_print_ ((Type), (Value), (Location)); \ - *yycdebug_ << std::endl; \ - } \ -} while (false) - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug_) \ - yy_reduce_print_ (Rule); \ -} while (false) - -# define YY_STACK_PRINT() \ -do { \ - if (yydebug_) \ - yystack_print_ (); \ -} while (false) +# define YY_SYMBOL_PRINT(Title, Symbol) \ + do { \ + if (yydebug_) \ + { \ + *yycdebug_ << Title << ' '; \ + yy_print_ (*yycdebug_, Symbol); \ + *yycdebug_ << std::endl; \ + } \ + } while (false) + +# define YY_REDUCE_PRINT(Rule) \ + do { \ + if (yydebug_) \ + yy_reduce_print_ (Rule); \ + } while (false) + +# define YY_STACK_PRINT() \ + do { \ + if (yydebug_) \ + yystack_print_ (); \ + } while (false) #else /* !]b4_api_PREFIX[DEBUG */ # define YYCDEBUG if (false) std::cerr -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_REDUCE_PRINT(Rule) -# define YY_STACK_PRINT() +# define YY_SYMBOL_PRINT(Title, Symbol) YYUSE(Symbol) +# define YY_REDUCE_PRINT(Rule) static_cast(0) +# define YY_STACK_PRINT() static_cast(0) #endif /* !]b4_api_PREFIX[DEBUG */ -#define yyerrok (yyerrstatus_ = 0) -#define yyclearin (yychar = yyempty_) +#define yyerrok (yyerrstatus_ = 0) +#define yyclearin (yyempty = true) -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab #define YYRECOVERING() (!!yyerrstatus_) ]b4_namespace_open[]b4_error_verbose_if([[ @@ -403,65 +495,117 @@ do { \ { } -#if ]b4_api_PREFIX[DEBUG - /*--------------------------------. - | Print this symbol on YYOUTPUT. | - `--------------------------------*/ - inline void - ]b4_parser_class_name[::yy_symbol_value_print_ (int yytype, - const semantic_type* yyvaluep, const location_type* yylocationp) + /*---------------. + | Symbol types. | + `---------------*/ + +]b4_lex_symbol_if([], [b4_public_types_define])[ + + // stack_symbol_type. + ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type () + : super_type () + , state () + { + } + + ]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (]b4_args( + [state_type s], + [const semantic_type& v], + b4_locations_if([const location_type& l]))[) + : super_type (v]b4_locations_if([, l])[) + , state (s) + { + } + + int + ]b4_parser_class_name[::stack_symbol_type::type_get_ () const + { + return yystos_[state]; + } + + + template + void + ]b4_parser_class_name[::yy_destroy_ (const char* yymsg, + symbol_base_type& yysym) const + { + if (yymsg) + YY_SYMBOL_PRINT (yymsg, yysym); + + // User destructor. + int yytype = yysym.type_get (); + switch (yytype) + { +]b4_symbol_foreach([b4_symbol_destructor])dnl +[ default: + break; + }]b4_variant_if([ + + // Type destructor. + b4_symbol_variant([[yytype]], [[yysym.value]], [[template destroy]])])[ + } + +#if ]b4_api_PREFIX[DEBUG + template + void + ]b4_parser_class_name[::yy_print_ (std::ostream& yyo, + const symbol_base_type& yysym) const { - YYUSE (yylocationp); - YYUSE (yyvaluep); - std::ostream& yyo = debug_stream (); std::ostream& yyoutput = yyo; YYUSE (yyoutput); + int yytype = yysym.type_get (); + yyo << (yytype < yyntokens_ ? "token" : "nterm") + << ' ' << yytname_[yytype] << " ("]b4_locations_if([ + << yysym.location << ": "])[; switch (yytype) { - ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl +]b4_symbol_foreach([b4_symbol_printer])dnl [ default: - break; + break; } + yyo << ')'; } - +#endif void - ]b4_parser_class_name[::yy_symbol_print_ (int yytype, - const semantic_type* yyvaluep, const location_type* yylocationp) + ]b4_parser_class_name[::yypush_ (const char* m, state_type s, + symbol_type& sym) { - *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm") - << ' ' << yytname_[yytype] << " (" - << *yylocationp << ": "; - yy_symbol_value_print_ (yytype, yyvaluep, yylocationp); - *yycdebug_ << ')'; + if (m) + YY_SYMBOL_PRINT (m, sym); +]b4_variant_if( +[[ yystack_.push (stack_symbol_type (]b4_args( + [s], + [semantic_type()], + b4_locations_if([sym.location]))[)); + ]b4_symbol_variant([[yystos_[s]]], [[yystack_[0].value]], + [build], [sym.value])], +[[ yystack_.push (stack_symbol_type (]b4_args( + [s], + [sym.value], + b4_locations_if([sym.location]))[));]])[ } -#endif void - ]b4_parser_class_name[::yydestruct_ (const char* yymsg, - int yytype, semantic_type* yyvaluep, location_type* yylocationp) + ]b4_parser_class_name[::yypush_ (const char* m, stack_symbol_type& s) { - YYUSE (yylocationp); - YYUSE (yymsg); - YYUSE (yyvaluep); - - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ - default: - break; - } + if (m) + YY_SYMBOL_PRINT (m, s); +]b4_variant_if( +[[ yystack_.push (stack_symbol_type (]b4_args( + [s.state], + [semantic_type()], + b4_locations_if([s.location]))[)); + ]b4_symbol_variant([[yystos_[s.state]]], [[yystack_[0].value]], + [build], [s.value])], +[ yystack_.push (s);])[ } void ]b4_parser_class_name[::yypop_ (unsigned int n) { - yystate_stack_.pop (n); - yysemantic_stack_.pop (n); - yylocation_stack_.pop (n); + yystack_.pop (n); } #if ]b4_api_PREFIX[DEBUG @@ -489,7 +633,17 @@ do { \ { yydebug_ = l; } -#endif +#endif // ]b4_api_PREFIX[DEBUG + + inline ]b4_parser_class_name[::state_type + ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs) + { + int yyr = yypgoto_[yylhs - yyntokens_] + yystate; + if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate) + return yytable_[yyr]; + else + return yydefgoto_[yylhs - yyntokens_]; + } inline bool ]b4_parser_class_name[::yy_pact_value_is_default_ (int yyvalue) @@ -506,58 +660,50 @@ do { \ int ]b4_parser_class_name[::parse () { - /// Lookahead and lookahead in internal form. - int yychar = yyempty_; - int yytoken = 0; + /// Whether yyla contains a lookahead. + bool yyempty = true; /* State. */ int yyn; int yylen = 0; - int yystate = 0; /* Error handling. */ int yynerrs_ = 0; int yyerrstatus_ = 0; - /// Semantic value of the lookahead. - semantic_type yylval; - /// Location of the lookahead. - location_type yylloc; + /// The lookahead symbol. + symbol_type yyla;]b4_locations_if([[ + /// The locations where the error started and ended. - location_type yyerror_range[3]; + stack_symbol_type yyerror_range[3];]])[ - /// $$. - semantic_type yyval; - /// @@$. - location_type yyloc; + /// $$ and @@$. + stack_symbol_type yylhs; + /// The return value of parse (). int yyresult; YYCDEBUG << "Starting parse" << std::endl; ]m4_ifdef([b4_initial_action], [ -b4_dollar_pushdef([yylval], [], [yylloc])dnl -/* User initialization code. */ -b4_user_initial_action +b4_dollar_pushdef([yyla.value], [], [yyla.location])dnl + /* User initialization code. */ + b4_user_initial_action b4_dollar_popdef])[]dnl - [ /* Initialize the stacks. The initial state will be pushed in + [ /* Initialize the stack. The initial state will be set in yynewstate, since the latter expects the semantical and the location values to have been already stored, initialize these stacks with a primary value. */ - yystate_stack_ = state_stack_type (0); - yysemantic_stack_ = semantic_stack_type (0); - yylocation_stack_ = location_stack_type (0); - yysemantic_stack_.push (yylval); - yylocation_stack_.push (yylloc); + yystack_ = stack_type (0); + yypush_ (YY_NULL, 0, yyla); - /* New state. */ + // A new symbol was pushed on the stack. yynewstate: - yystate_stack_.push (yystate); - YYCDEBUG << "Entering state " << yystate << std::endl; + YYCDEBUG << "Entering state " << yystack_[0].state << std::endl; /* Accept? */ - if (yystate == yyfinal_) + if (yystack_[0].state == yyfinal_) goto yyacceptlab; goto yybackup; @@ -566,71 +712,66 @@ b4_dollar_popdef])[]dnl yybackup: /* Try to take a decision without lookahead. */ - yyn = yypact_[yystate]; + yyn = yypact_[yystack_[0].state]; if (yy_pact_value_is_default_ (yyn)) goto yydefault; /* Read a lookahead token. */ - if (yychar == yyempty_) - { - YYCDEBUG << "Reading a token: "; - yychar = ]b4_c_function_call([yylex], [int], - [b4_api_PREFIX[STYPE*], [&yylval]][]dnl -b4_locations_if([, [[location*], [&yylloc]]])dnl -m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; - } - - - /* Convert token to internal form. */ - if (yychar <= yyeof_) + if (yyempty) { - yychar = yytoken = yyeof_; - YYCDEBUG << "Now at end of input." << std::endl; - } - else - { - yytoken = yytranslate_ (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + YYCDEBUG << "Reading a token: "; + try + { +]b4_lex_symbol_if( +[ yyla = b4_c_function_call([yylex], [symbol_type], + m4_ifdef([b4_lex_param], b4_lex_param));], +[ yyla.type = yytranslate_ (b4_c_function_call([yylex], [int], + [b4_api_PREFIX[STYPE*], [&yyla.value]][]dnl +b4_locations_if([, [[location*], [&yyla.location]]])dnl +m4_ifdef([b4_lex_param], [, ]b4_lex_param)));])[ + } + catch (const syntax_error& yyexc) + { + error (yyexc); + goto yyerrlab1; + } + yyempty = false; } + YY_SYMBOL_PRINT ("Next token is", yyla); - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken) + /* If the proper action on seeing token YYLA.TYPE is to reduce or + to detect an error, take that action. */ + yyn += yyla.type; + if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yyla.type) goto yydefault; /* Reduce or error. */ yyn = yytable_[yyn]; if (yyn <= 0) { - if (yy_table_value_is_error_ (yyn)) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; + if (yy_table_value_is_error_ (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; } - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - /* Discard the token being shifted. */ - yychar = yyempty_; - - yysemantic_stack_.push (yylval); - yylocation_stack_.push (yylloc); + yyempty = true; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus_) --yyerrstatus_; - yystate = yyn; + /* Shift the lookahead token. */ + yypush_ ("Shifting", yyn, yyla); goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: - yyn = yydefact_[yystate]; + yyn = yydefact_[yystack_[0].state]; if (yyn == 0) goto yyerrlab; goto yyreduce; @@ -640,92 +781,97 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; `-----------------------------*/ yyreduce: yylen = yyr2_[yyn]; + yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([ + /* Variants are always initialized to an empty instance of the + correct type. The default $$=$1 action is NOT applied when using + variants. */ + b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])],[ /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, use the top of the stack. - Otherwise, the following line sets YYVAL to garbage. + Otherwise, the following line sets YYLHS.VALUE to garbage. This behavior is undocumented and Bison users should not rely upon it. */ if (yylen) - yyval = yysemantic_stack_[yylen - 1]; + yylhs.value = yystack_@{yylen - 1@}.value; else - yyval = yysemantic_stack_[0]; - + yylhs.value = yystack_@{0@}.value;])[ +]b4_locations_if([dnl +[ + // Compute the default @@$. { - slice slice (yylocation_stack_, yylen); - YYLLOC_DEFAULT (yyloc, slice, yylen); - } + slice slice (yystack_, yylen); + YYLLOC_DEFAULT (yylhs.location, slice, yylen); + }]])[ + + // Perform the reduction. YY_REDUCE_PRINT (yyn); - switch (yyn) + try + { + switch (yyn) { - ]b4_user_actions[ - default: +]b4_user_actions[ + default: break; } - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action - invokes YYABORT, YYACCEPT, or YYERROR immediately after altering - yychar. In the case of YYABORT or YYACCEPT, an incorrect - destructor might then be invoked immediately. In the case of - YYERROR, subsequent parser actions might lead to an incorrect - destructor call or verbose syntax error message before the - lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc); + } + catch (const syntax_error& yyexc) + { + error (yyexc); + YYERROR; + } + YY_SYMBOL_PRINT ("-> $$ =", yylhs); +]b4_variant_if([[ + // Destroy the rhs symbols. + for (int i = 0; i < yylen; ++i) + // Destroy a variant which value may have been swapped with + // yylhs.value (for instance if the action was "std::swap($$, + // $1)"). The value of yylhs.value (hence possibly one of these + // rhs symbols) depends on the default construction for this + // type. In the case of pointers for instance, no + // initialization is done, so the value is junk. Therefore do + // not try to report the value of symbols about to be destroyed + // in the debug trace, it's possibly junk. Hence yymsg = 0. + // Besides, that keeps exactly the same traces as with the other + // Bison skeletons. + yy_destroy_ (YY_NULL, yystack_[i]);]])[ yypop_ (yylen); yylen = 0; YY_STACK_PRINT (); - yysemantic_stack_.push (yyval); - yylocation_stack_.push (yyloc); - /* Shift the result of the reduction. */ - yyn = yyr1_[yyn]; - yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0]; - if (0 <= yystate && yystate <= yylast_ - && yycheck_[yystate] == yystate_stack_[0]) - yystate = yytable_[yystate]; - else - yystate = yydefgoto_[yyn - yyntokens_]; + yypush_ (YY_NULL, yylhs); goto yynewstate; - /*------------------------------------. - | yyerrlab -- here on detecting error | - `------------------------------------*/ + /*--------------------------------------. + | yyerrlab -- here on detecting error. | + `--------------------------------------*/ yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yytranslate_ (yychar); - /* If not already recovering from an error, report this error. */ if (!yyerrstatus_) { - ++yynerrs_; - if (yychar == yyempty_) - yytoken = yyempty_; - error (yylloc, yysyntax_error_ (yystate, yytoken)); + ++yynerrs_; + error (]b4_args(b4_locations_if([yyla.location]), + [[yysyntax_error_ (yystack_[0].state, + yyempty ? yyempty_ : yyla.type)]])[); } - yyerror_range[1] = yylloc; +]b4_locations_if([[ + yyerror_range[1].location = yyla.location;]])[ if (yyerrstatus_ == 3) { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= yyeof_) - { - /* Return failure if at end of input. */ - if (yychar == yyeof_) - YYABORT; - } - else - { - yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc); - yychar = yyempty_; - } + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + /* Return failure if at end of input. */ + if (yyla.type == yyeof_) + YYABORT; + else if (!yyempty) + { + yy_destroy_ ("Error: discarding", yyla); + yyempty = true; + } } /* Else will try to reuse lookahead token after shifting the error @@ -742,61 +888,54 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; YYERROR and the label yyerrorlab therefore never appears in user code. */ if (false) - goto yyerrorlab; - - yyerror_range[1] = yylocation_stack_[yylen - 1]; + goto yyerrorlab;]b4_locations_if([[ + yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[ + /* $$ was initialized before running the user action. */ + yy_destroy_ ("Error: discarding", yylhs);]])[ /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ yypop_ (yylen); yylen = 0; - yystate = yystate_stack_[0]; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus_ = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact_[yystate]; - if (!yy_pact_value_is_default_ (yyn)) - { - yyn += yyterror_; - if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) - { - yyn = yytable_[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yystate_stack_.height () == 1) - YYABORT; - - yyerror_range[1] = yylocation_stack_[0]; - yydestruct_ ("Error: popping", - yystos_[yystate], - &yysemantic_stack_[0], &yylocation_stack_[0]); - yypop_ (); - yystate = yystate_stack_[0]; - YY_STACK_PRINT (); - } - - yyerror_range[2] = yylloc; - // Using YYLLOC is tempting, but would change the location of - // the lookahead. YYLOC is available though. - YYLLOC_DEFAULT (yyloc, yyerror_range, 2); - yysemantic_stack_.push (yylval); - yylocation_stack_.push (yyloc); + yyerrstatus_ = 3; /* Each real token shifted decrements this. */ + { + stack_symbol_type error_token; + for (;;) + { + yyn = yypact_[yystack_[0].state]; + if (!yy_pact_value_is_default_ (yyn)) + { + yyn += yyterror_; + if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) + { + yyn = yytable_[yyn]; + if (0 < yyn) + break; + } + } - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos_[yyn], - &yysemantic_stack_[0], &yylocation_stack_[0]); + // Pop the current state because it cannot handle the error token. + if (yystack_.size () == 1) + YYABORT; +]b4_locations_if([[ + yyerror_range[1].location = yystack_[0].location;]])[ + yy_destroy_ ("Error: popping", yystack_[0]); + yypop_ (); + YY_STACK_PRINT (); + } +]b4_locations_if([[ + yyerror_range[2].location = yyla.location; + YYLLOC_DEFAULT (error_token.location, yyerror_range, 2);]])[ - yystate = yyn; + /* Shift the error token. */ + error_token.state = yyn; + yypush_ ("Shifting", error_token); + } goto yynewstate; /* Accept. */ @@ -810,34 +949,32 @@ m4_ifdef([b4_lex_param], [, ]b4_lex_param))[; goto yyreturn; yyreturn: - if (yychar != yyempty_) - { - /* Make sure we have latest lookahead translation. See comments - at user semantic actions for why this is necessary. */ - yytoken = yytranslate_ (yychar); - yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, - &yylloc); - } + if (!yyempty) + yy_destroy_ ("Cleanup: discarding lookahead", yyla); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ yypop_ (yylen); - while (yystate_stack_.height () != 1) + while (yystack_.size () != 1) { - yydestruct_ ("Cleanup: popping", - yystos_[yystate_stack_[0]], - &yysemantic_stack_[0], - &yylocation_stack_[0]); - yypop_ (); + yy_destroy_ ("Cleanup: popping", yystack_[0]); + yypop_ (); } return yyresult; } + void + ]b4_parser_class_name[::error (const syntax_error& yyexc) + { + error (]b4_args(b4_locations_if([yyexc.location]), + [[yyexc.what()]])[); + } + // Generate an error message. std::string ]b4_parser_class_name[::yysyntax_error_ (]dnl -b4_error_verbose_if([int yystate, int yytoken], +b4_error_verbose_if([state_type yystate, int yytoken], [int, int])[) {]b4_error_verbose_if([[ std::string yyres; @@ -863,7 +1000,7 @@ b4_error_verbose_if([int yystate, int yytoken], a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated - yychar. + yyla. (However, yyla is currently not documented for users.) - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the @@ -933,86 +1070,11 @@ b4_error_verbose_if([int yystate, int yytoken], } - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[; - const ]b4_int_type_for([b4_pact])[ - ]b4_parser_class_name[::yypact_[] = - { - ]b4_pact[ - }; - - /* YYDEFACT[S] -- default reduction number in state S. Performed when - YYTABLE doesn't specify something else to do. Zero means the - default is an error. */ - const ]b4_int_type_for([b4_defact])[ - ]b4_parser_class_name[::yydefact_[] = - { - ]b4_defact[ - }; - /* YYPGOTO[NTERM-NUM]. */ - const ]b4_int_type_for([b4_pgoto])[ - ]b4_parser_class_name[::yypgoto_[] = - { - ]b4_pgoto[ - }; - - /* YYDEFGOTO[NTERM-NUM]. */ - const ]b4_int_type_for([b4_defgoto])[ - ]b4_parser_class_name[::yydefgoto_[] = - { - ]b4_defgoto[ - }; - - /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If YYTABLE_NINF_, syntax error. */ const ]b4_int_type(b4_table_ninf, b4_table_ninf) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[; - const ]b4_int_type_for([b4_table])[ - ]b4_parser_class_name[::yytable_[] = - { - ]b4_table[ - }; - /* YYCHECK. */ - const ]b4_int_type_for([b4_check])[ - ]b4_parser_class_name[::yycheck_[] = - { - ]b4_check[ - }; - - /* STOS_[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ - const ]b4_int_type_for([b4_stos])[ - ]b4_parser_class_name[::yystos_[] = - { - ]b4_stos[ - }; - -#if ]b4_api_PREFIX[DEBUG - /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding - to YYLEX-NUM. */ - const ]b4_int_type_for([b4_toknum])[ - ]b4_parser_class_name[::yytoken_number_[] = - { - ]b4_toknum[ - }; -#endif - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ - const ]b4_int_type_for([b4_r1])[ - ]b4_parser_class_name[::yyr1_[] = - { - ]b4_r1[ - }; - - /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ - const ]b4_int_type_for([b4_r2])[ - ]b4_parser_class_name[::yyr2_[] = - { - ]b4_r2[ - }; +]b4_parser_tables_define[ ]b4_token_table_if([], [[#if ]b4_api_PREFIX[DEBUG]])[ /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. @@ -1020,40 +1082,22 @@ b4_error_verbose_if([int yystate, int yytoken], const char* const ]b4_parser_class_name[::yytname_[] = { - ]b4_tname[ + ]b4_tname[ }; ]b4_token_table_if([[#if ]b4_api_PREFIX[DEBUG]])[ - /* YYRHS -- A `-1'-separated list of the rules' RHS. */ - const ]b4_parser_class_name[::rhs_number_type - ]b4_parser_class_name[::yyrhs_[] = - { - ]b4_rhs[ - }; - - /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ - const ]b4_int_type_for([b4_prhs])[ - ]b4_parser_class_name[::yyprhs_[] = - { - ]b4_prhs[ - }; - - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ - const ]b4_int_type_for([b4_rline])[ - ]b4_parser_class_name[::yyrline_[] = - { - ]b4_rline[ - }; +]b4_integral_parser_table_define([rline], [b4_rline])[ // Print the state stack on the debug stream. void ]b4_parser_class_name[::yystack_print_ () { *yycdebug_ << "Stack now"; - for (state_stack_type::const_iterator i = yystate_stack_.begin (); - i != yystate_stack_.end (); ++i) - *yycdebug_ << ' ' << *i; + for (stack_type::const_iterator + i = yystack_.begin (), + i_end = yystack_.end (); + i != i_end; ++i) + *yycdebug_ << ' ' << i->state; *yycdebug_ << std::endl; } @@ -1065,44 +1109,16 @@ b4_error_verbose_if([int yystate, int yytoken], int yynrhs = yyr2_[yyrule]; /* Print the symbols being reduced, and their result. */ *yycdebug_ << "Reducing stack by rule " << yyrule - 1 - << " (line " << yylno << "):" << std::endl; + << " (line " << yylno << "):" << std::endl; /* The symbols being reduced. */ for (int yyi = 0; yyi < yynrhs; yyi++) YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", - yyrhs_[yyprhs_[yyrule] + yyi], - &]b4_rhs_value(yynrhs, yyi + 1)[, - &]b4_rhs_location(yynrhs, yyi + 1)[); + ]b4_rhs_data(yynrhs, yyi + 1)[); } #endif // ]b4_api_PREFIX[DEBUG - /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ - ]b4_parser_class_name[::token_number_type - ]b4_parser_class_name[::yytranslate_ (int t) - { - static - const token_number_type - translate_table[] = - { - ]b4_translate[ - }; - if ((unsigned int) t <= yyuser_token_number_max_) - return translate_table[t]; - else - return yyundef_token_; - } - - const int ]b4_parser_class_name[::yyeof_ = 0; - const int ]b4_parser_class_name[::yylast_ = ]b4_last[; - const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[; - const int ]b4_parser_class_name[::yyempty_ = -2; - const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[; - const int ]b4_parser_class_name[::yyterror_ = 1; - const int ]b4_parser_class_name[::yyerrcode_ = 256; - const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[; - - const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[; - const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[; - +]b4_lex_symbol_if([], [b4_yytranslate_define])[ ]b4_namespace_close[ -]b4_epilogue +]b4_epilogue[]dnl m4_divert_pop(0) +m4_popdef([b4_copyright_years])dnl diff --git a/data/lalr1.java b/data/lalr1.java index d1410a10..1cfaef38 100644 --- a/data/lalr1.java +++ b/data/lalr1.java @@ -17,10 +17,18 @@ m4_include(b4_pkgdatadir/[java.m4]) -b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java], [b4_skeleton])]) -m4_ifval(m4_defn([b4_symbol_destructors]), - [b4_fatal([%s: %%destructor does not make sense in Java], [b4_skeleton])], - []) +b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java], + [b4_skeleton])]) + +# We don't depend on %debug in Java, but pacify warnings about non-used flags. +b4_parse_trace_if([0], [0]) + +m4_define([b4_symbol_no_destructor_assert], +[b4_symbol_if([$1], [has_destructor], + [b4_fatal([%s: %s: %%destructor does not make sense in Java], + [b4_skeleton], + [b4_symbol_action_location([$1], [destructor])])])]) +b4_symbol_foreach([b4_symbol_no_destructor_assert]) m4_divert_push(0)dnl @output(b4_parser_file_name@)@ @@ -29,14 +37,16 @@ b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java], b4_percent_define_ifdef([package], [package b4_percent_define_get([package]); ])[/* First part of user declarations. */ -]b4_pre_prologue +]b4_user_pre_prologue +b4_user_post_prologue b4_percent_code_get([[imports]]) [/** * A Bison parser, automatically generated from ]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[. * * @@author LALR (1) parser skeleton written by Paolo Bonzini. */ -]b4_public_if([public ])dnl +]b4_percent_define_get3([annotations], [], [ ])dnl +b4_public_if([public ])dnl b4_abstract_if([abstract ])dnl b4_final_if([final ])dnl b4_strictfp_if([strictfp ])dnl @@ -45,9 +55,22 @@ b4_percent_define_get3([extends], [ extends ])dnl b4_percent_define_get3([implements], [ implements ])[ { ]b4_identification[ - +]b4_error_verbose_if([[ /** True if verbose error messages are enabled. */ - public boolean errorVerbose = ]b4_flag_value([error_verbose]); + private boolean yyErrorVerbose = true; + + /** + * Return whether verbose error messages are enabled. + */ + public final boolean getErrorVerbose() { return yyErrorVerbose; } + + /** + * Set the verbosity of error messages. + * @@param verbose True to request verbose error messages. + */ + public final void setErrorVerbose(boolean verbose) + { yyErrorVerbose = verbose; } +]]) b4_locations_if([[ /** @@ -93,11 +116,6 @@ b4_locations_if([[ ]]) -[ /** Token returned by the scanner to signal the end of its input. */ - public static final int EOF = 0;] - -b4_token_enums(b4_tokens) - b4_locations_if([[ private ]b4_location_type[ yylloc (YYStack rhs, int n) { @@ -112,6 +130,11 @@ b4_token_enums(b4_tokens) * parser ]b4_parser_class_name[. */ public interface Lexer { + /** Token returned by the scanner to signal the end of its input. */ + public static final int EOF = 0; + +]b4_token_enums[ + ]b4_locations_if([[/** * Method to retrieve the beginning position of the last scanned token. * @@return the position at which the last scanned token starts. */ @@ -140,8 +163,8 @@ b4_token_enums(b4_tokens) * * ]b4_locations_if([[@@param loc The location of the element to which the * error message is related]])[ - * @@param s The string for the error message. */ - void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s);] + * @@param msg The string for the error message. */ + void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String msg);] } b4_lexer_if([[private class YYLexer implements Lexer { @@ -157,7 +180,9 @@ b4_lexer_if([[ /** * Instantiates the Bison-generated parser. */ - public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) { + public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) ]b4_maybe_throws([b4_init_throws])[ + { + ]b4_percent_code_get([[init]])[ this.yylexer = new YYLexer(]b4_lex_param_call[); ]b4_parse_param_cons[ } @@ -167,7 +192,9 @@ b4_lexer_if([[ * Instantiates the Bison-generated parser. * @@param yylexer The scanner that will supply tokens to the parser. */ - b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) { + b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) ]b4_maybe_throws([b4_init_throws])[ + { + ]b4_percent_code_get([[init]])[ this.yylexer = yylexer; ]b4_parse_param_cons[ } @@ -201,20 +228,35 @@ b4_lexer_if([[ */ public final void setDebugLevel(int level) { yydebug = level; } - private final int yylex () ]b4_maybe_throws([b4_lex_throws]) [{ - return yylexer.yylex (); + /** + * Print an error message via the lexer. + *]b4_locations_if([[ Use a null location.]])[ + * @@param msg The error message. + */ + public final void yyerror (String msg) + { + yylexer.yyerror (]b4_locations_if([[(]b4_location_type[)null, ]])[msg); } - protected final void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s) { - yylexer.yyerror (]b4_locations_if([loc, ])[s); +]b4_locations_if([[ + /** + * Print an error message via the lexer. + * @@param loc The location associated with the message. + * @@param msg The error message. + */ + public final void yyerror (]b4_location_type[ loc, String msg) + { + yylexer.yyerror (loc, msg); } - ]b4_locations_if([ - protected final void yyerror (String s) { - yylexer.yyerror ((]b4_location_type[)null, s); - } - protected final void yyerror (]b4_position_type[ loc, String s) { - yylexer.yyerror (new ]b4_location_type[ (loc), s); - }]) + /** + * Print an error message via the lexer. + * @@param pos The position associated with the message. + * @@param msg The error message. + */ + public final void yyerror (]b4_position_type[ pos, String msg) + { + yylexer.yyerror (new ]b4_location_type[ (pos), msg); + }]]) [protected final void yycdebug (String s) { if (yydebug > 0) @@ -230,24 +272,24 @@ b4_lexer_if([[ public int height = -1; public final void push (int state, ]b4_yystype[ value]dnl - b4_locations_if([, ]b4_location_type[ loc])[) { + b4_locations_if([, ]b4_location_type[ loc])[) { height++; if (size == height) { - int[] newStateStack = new int[size * 2]; - System.arraycopy (stateStack, 0, newStateStack, 0, height); - stateStack = newStateStack; - ]b4_locations_if([[ - ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2]; - System.arraycopy (locStack, 0, newLocStack, 0, height); - locStack = newLocStack;]]) - - b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2]; - System.arraycopy (valueStack, 0, newValueStack, 0, height); - valueStack = newValueStack; - - size *= 2; - } + int[] newStateStack = new int[size * 2]; + System.arraycopy (stateStack, 0, newStateStack, 0, height); + stateStack = newStateStack; + ]b4_locations_if([[ + ]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2]; + System.arraycopy (locStack, 0, newLocStack, 0, height); + locStack = newLocStack;]]) + + b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2]; + System.arraycopy (valueStack, 0, newValueStack, 0, height); + valueStack = newValueStack; + + size *= 2; + } stateStack[height] = state; ]b4_locations_if([[locStack[height] = loc;]])[ @@ -261,7 +303,7 @@ b4_lexer_if([[ public final void pop (int num) { // Avoid memory leaks... garbage collection is a white lie! if (num > 0) { - java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null); + java.util.Arrays.fill (valueStack, height - num + 1, height + 1, null); ]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height + 1, null);]])[ } height -= num; @@ -286,8 +328,8 @@ b4_lexer_if([[ for (int i = 0; i <= height; i++) { - out.print (' '); - out.print (stateStack[i]); + out.print (' '); + out.print (stateStack[i]); } out.println (); } @@ -348,8 +390,8 @@ b4_lexer_if([[ switch (yyn) { - ]b4_user_actions[ - default: break; + ]b4_user_actions[ + default: break; } yy_symbol_print ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[); @@ -361,7 +403,7 @@ b4_lexer_if([[ yyn = yyr1_[yyn]; int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0); if (0 <= yystate && yystate <= yylast_ - && yycheck_[yystate] == yystack.stateAt (0)) + && yycheck_[yystate] == yystack.stateAt (0)) yystate = yytable_[yystate]; else yystate = yydefgoto_[yyn - yyntokens_]; @@ -370,6 +412,7 @@ b4_lexer_if([[ return YYNEWSTATE; } +]b4_error_verbose_if([[ /* Return YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an @@ -388,7 +431,7 @@ b4_lexer_if([[ break strip_quotes; case '\\': - if (yystr.charAt(++i) != '\\') + if (yystr.charAt(++i) != '\\') break strip_quotes; /* Fall through. */ default: @@ -404,20 +447,21 @@ b4_lexer_if([[ return yystr; } +]])[ /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ private void yy_symbol_print (String s, int yytype, - ]b4_yystype[ yyvaluep]dnl - b4_locations_if([, Object yylocationp])[) + ]b4_yystype[ yyvaluep]dnl + b4_locations_if([, Object yylocationp])[) { if (yydebug > 0) yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ") - + yytname_[yytype] + " ("]b4_locations_if([ - + yylocationp + ": "])[ - + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")"); + + yytname_[yytype] + " ("]b4_locations_if([ + + yylocationp + ": "])[ + + (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")"); } /** @@ -459,8 +503,8 @@ b4_lexer_if([[ ]m4_ifdef([b4_initial_action], [ b4_dollar_pushdef([yylval], [], [yylloc])dnl -/* User initialization code. */ -b4_user_initial_action + /* User initialization code. */ + b4_user_initial_action b4_dollar_popdef])[]dnl [ /* Initialize the stack. */ @@ -471,7 +515,7 @@ b4_dollar_popdef])[]dnl switch (label) { /* New state. Unlike in the C/C++ skeletons, the state is already - pushed when we come here. */ + pushed when we come here. */ case YYNEWSTATE: yycdebug ("Entering state " + yystate + "\n"); if (yydebug > 0) @@ -486,31 +530,31 @@ b4_dollar_popdef])[]dnl if (yy_pact_value_is_default_ (yyn)) { label = YYDEFAULT; - break; + break; } /* Read a lookahead token. */ if (yychar == yyempty_) { - yycdebug ("Reading a token: "); - yychar = yylex ();] + yycdebug ("Reading a token: "); + yychar = yylexer.yylex ();] b4_locations_if([[ - yylloc = new ]b4_location_type[(yylexer.getStartPos (), - yylexer.getEndPos ());]]) + yylloc = new ]b4_location_type[(yylexer.getStartPos (), + yylexer.getEndPos ());]]) yylval = yylexer.getLVal ();[ } /* Convert token to internal form. */ - if (yychar <= EOF) + if (yychar <= Lexer.EOF) { - yychar = yytoken = EOF; - yycdebug ("Now at end of input.\n"); + yychar = yytoken = Lexer.EOF; + yycdebug ("Now at end of input.\n"); } else { - yytoken = yytranslate_ (yychar); - yy_symbol_print ("Next token is", yytoken, - yylval]b4_locations_if([, yylloc])[); + yytoken = yytranslate_ (yychar); + yy_symbol_print ("Next token is", yytoken, + yylval]b4_locations_if([, yylloc])[); } /* If the proper action on seeing token YYTOKEN is to reduce or to @@ -522,20 +566,20 @@ b4_dollar_popdef])[]dnl /* <= 0 means reduce or error. */ else if ((yyn = yytable_[yyn]) <= 0) { - if (yy_table_value_is_error_ (yyn)) - label = YYERRLAB; - else - { - yyn = -yyn; - label = YYREDUCE; - } + if (yy_table_value_is_error_ (yyn)) + label = YYERRLAB; + else + { + yyn = -yyn; + label = YYREDUCE; + } } else { /* Shift the lookahead token. */ - yy_symbol_print ("Shifting", yytoken, - yylval]b4_locations_if([, yylloc])[); + yy_symbol_print ("Shifting", yytoken, + yylval]b4_locations_if([, yylloc])[); /* Discard the token being shifted. */ yychar = yyempty_; @@ -568,7 +612,7 @@ b4_dollar_popdef])[]dnl case YYREDUCE: yylen = yyr2_[yyn]; label = yyaction (yyn, yystack, yylen); - yystate = yystack.stateAt (0); + yystate = yystack.stateAt (0); break; /*------------------------------------. @@ -587,17 +631,17 @@ b4_dollar_popdef])[]dnl ]b4_locations_if([yyerrloc = yylloc;])[ if (yyerrstatus_ == 3) { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= EOF) - { - /* Return failure if at end of input. */ - if (yychar == EOF) - return false; - } - else - yychar = yyempty_; + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= Lexer.EOF) + { + /* Return failure if at end of input. */ + if (yychar == Lexer.EOF) + return false; + } + else + yychar = yyempty_; } /* Else will try to reuse lookahead token after shifting the error @@ -623,46 +667,46 @@ b4_dollar_popdef])[]dnl | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ case YYERRLAB1: - yyerrstatus_ = 3; /* Each real token shifted decrements this. */ + yyerrstatus_ = 3; /* Each real token shifted decrements this. */ for (;;) { - yyn = yypact_[yystate]; - if (!yy_pact_value_is_default_ (yyn)) - { - yyn += yyterror_; - if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) - { - yyn = yytable_[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yystack.height == 0) - return false; - - ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[ - yystack.pop (); - yystate = yystack.stateAt (0); - if (yydebug > 0) - yystack.print (yyDebugStream); + yyn = yypact_[yystate]; + if (!yy_pact_value_is_default_ (yyn)) + { + yyn += yyterror_; + if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) + { + yyn = yytable_[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yystack.height == 0) + return false; + + ]b4_locations_if([yyerrloc = yystack.locationAt (0);])[ + yystack.pop (); + yystate = yystack.stateAt (0); + if (yydebug > 0) + yystack.print (yyDebugStream); } - ]b4_locations_if([ - /* Muck with the stack to setup for yylloc. */ - yystack.push (0, null, yylloc); - yystack.push (0, null, yyerrloc); + ]b4_locations_if([ + /* Muck with the stack to setup for yylloc. */ + yystack.push (0, null, yylloc); + yystack.push (0, null, yyerrloc); yyloc = yylloc (yystack, 2); - yystack.pop (2);])[ + yystack.pop (2);])[ /* Shift the error token. */ yy_symbol_print ("Shifting", yystos_[yyn], - yylval]b4_locations_if([, yyloc])[); + yylval]b4_locations_if([, yyloc])[); yystate = yyn; - yystack.push (yyn, yylval]b4_locations_if([, yyloc])[); + yystack.push (yyn, yylval]b4_locations_if([, yyloc])[); label = YYNEWSTATE; break; @@ -678,15 +722,10 @@ b4_dollar_popdef])[]dnl // Generate an error message. private String yysyntax_error (int yystate, int tok) - { - if (errorVerbose) + {]b4_error_verbose_if([[ + if (yyErrorVerbose) { /* There are many possibilities here to consider: - - Assume YYFAIL is not used. It's too flawed to consider. - See - - for details. YYERROR is fine as it does not invoke this - function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't @@ -750,7 +789,7 @@ b4_dollar_popdef])[]dnl return res.toString (); } } - +]])[ return "syntax error"; } @@ -772,107 +811,20 @@ b4_dollar_popdef])[]dnl return yyvalue == yytable_ninf_; } - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[; - private static final ]b4_int_type_for([b4_pact])[ yypact_[] = - { - ]b4_pact[ - }; - - /* YYDEFACT[S] -- default reduction number in state S. Performed when - YYTABLE doesn't specify something else to do. Zero means the - default is an error. */ - private static final ]b4_int_type_for([b4_defact])[ yydefact_[] = - { - ]b4_defact[ - }; - - /* YYPGOTO[NTERM-NUM]. */ - private static final ]b4_int_type_for([b4_pgoto])[ yypgoto_[] = - { - ]b4_pgoto[ - }; - - /* YYDEFGOTO[NTERM-NUM]. */ - private static final ]b4_int_type_for([b4_defgoto])[ - yydefgoto_[] = - { - ]b4_defgoto[ - }; - - /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If YYTABLE_NINF_, syntax error. */ private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[; - private static final ]b4_int_type_for([b4_table])[ - yytable_[] = - { - ]b4_table[ - }; - /* YYCHECK. */ - private static final ]b4_int_type_for([b4_check])[ - yycheck_[] = - { - ]b4_check[ - }; - - /* STOS_[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ - private static final ]b4_int_type_for([b4_stos])[ - yystos_[] = - { - ]b4_stos[ - }; - - /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding - to YYLEX-NUM. */ - private static final ]b4_int_type_for([b4_toknum])[ - yytoken_number_[] = - { - ]b4_toknum[ - }; - - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ - private static final ]b4_int_type_for([b4_r1])[ - yyr1_[] = - { - ]b4_r1[ - }; - - /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ - private static final ]b4_int_type_for([b4_r2])[ - yyr2_[] = - { - ]b4_r2[ - }; + ]b4_parser_tables_define[ + ]b4_integral_parser_table_define([token_number], [b4_toknum], + [TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding + to YYLEX-NUM.])[ /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at \a yyntokens_, nonterminals. */ - private static final String yytname_[] = - { - ]b4_tname[ - }; - - /* YYRHS -- A `-1'-separated list of the rules' RHS. */ - private static final ]b4_int_type_for([b4_rhs])[ yyrhs_[] = - { - ]b4_rhs[ - }; + ]b4_typed_parser_table_define([String], [tname], [b4_tname])[ - /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ - private static final ]b4_int_type_for([b4_prhs])[ yyprhs_[] = - { - ]b4_prhs[ - }; - - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ - private static final ]b4_int_type_for([b4_rline])[ yyrline_[] = - { - ]b4_rline[ - }; + ]b4_integral_parser_table_define([rline], [b4_rline], + [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[ // Report on the debug stream that the rule yyrule is going to be reduced. private void yy_reduce_print (int yyrule, YYStack yystack) @@ -884,21 +836,18 @@ b4_dollar_popdef])[]dnl int yynrhs = yyr2_[yyrule]; /* Print the symbols being reduced, and their result. */ yycdebug ("Reducing stack by rule " + (yyrule - 1) - + " (line " + yylno + "), "); + + " (line " + yylno + "), "); /* The symbols being reduced. */ for (int yyi = 0; yyi < yynrhs; yyi++) yy_symbol_print (" $" + (yyi + 1) + " =", - yyrhs_[yyprhs_[yyrule] + yyi], - ]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([, - b4_rhs_location(yynrhs, yyi + 1)])[); + yystos_[yystack.stateAt(yynrhs - (yyi + 1))], + ]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([, + b4_rhs_location(yynrhs, yyi + 1)])[); } /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ - private static final ]b4_int_type_for([b4_translate])[ yytranslate_table_[] = - { - ]b4_translate[ - }; + ]b4_integral_parser_table_define([translate_table], [b4_translate])[ private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t) { @@ -924,5 +873,5 @@ b4_percent_code_get[]dnl } -b4_epilogue +b4_epilogue[]dnl m4_divert_pop(0)dnl diff --git a/data/local.mk b/data/local.mk new file mode 100644 index 00000000..b8db2d64 --- /dev/null +++ b/data/local.mk @@ -0,0 +1,45 @@ +## Copyright (C) 2002, 2005-2012 Free Software Foundation, Inc. + +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . + +dist_pkgdata_DATA = \ + data/README \ + data/bison.m4 \ + data/c++-skel.m4 \ + data/c++.m4 \ + data/c-like.m4 \ + data/c-skel.m4 \ + data/c.m4 \ + data/glr.c \ + data/glr.cc \ + data/java-skel.m4 \ + data/java.m4 \ + data/lalr1.cc \ + data/lalr1.java \ + data/location.cc \ + data/stack.hh \ + data/variant.hh \ + data/yacc.c + +m4sugardir = $(pkgdatadir)/m4sugar +dist_m4sugar_DATA = \ + data/m4sugar/foreach.m4 \ + data/m4sugar/m4sugar.m4 + +xsltdir = $(pkgdatadir)/xslt +dist_xslt_DATA = \ + data/xslt/bison.xsl \ + data/xslt/xml2dot.xsl \ + data/xslt/xml2text.xsl \ + data/xslt/xml2xhtml.xsl diff --git a/data/location.cc b/data/location.cc index b7383d65..218910b1 100644 --- a/data/location.cc +++ b/data/location.cc @@ -1,6 +1,6 @@ # C++ skeleton for Bison -# Copyright (C) 2002-2007, 2009-2012 Free Software Foundation, Inc. +# Copyright (C) 2002-2012 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -15,28 +15,14 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# We do want M4 expansion after # for CPP macros. -m4_changecom() -m4_divert_push(0)dnl -@output(b4_dir_prefix[]position.hh@)@ -b4_copyright([Positions for Bison parsers in C++], - [2002-2007, 2009-2012])[ - -/** - ** \file ]b4_dir_prefix[position.hh - ** Define the ]b4_namespace_ref[::position class. - */ +m4_pushdef([b4_copyright_years], + [2002-2012]) -]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[ - -# include // std::max -# include -# include - -]b4_null_define[ - -]b4_namespace_open[ - /// Abstract a position. +# b4_position_define +# ------------------ +# Define class position. +m4_define([b4_position_define], +[[ /// Abstract a position. class position { public: @@ -145,27 +131,13 @@ b4_copyright([Positions for Bison parsers in C++], ostr << *pos.filename << ':'; return ostr << pos.line << '.' << pos.column; } +]]) -]b4_namespace_close[ -]b4_cpp_guard_close([b4_dir_prefix[]position.hh]) -@output(b4_dir_prefix[]location.hh@)@ -b4_copyright([Locations for Bison parsers in C++], - [2002-2007, 2009-2012])[ -/** - ** \file ]b4_dir_prefix[location.hh - ** Define the ]b4_namespace_ref[::location class. - */ - -]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[ - -# include -# include -# include "position.hh" - -]b4_namespace_open[ - - /// Abstract a location. +# b4_location_define +# ------------------ +m4_define([b4_location_define], +[[ /// Abstract a location. class location { public: @@ -281,8 +253,8 @@ b4_copyright([Locations for Bison parsers in C++], position last = loc.end - 1; ostr << loc.begin; if (last.filename - && (!loc.begin.filename - || *loc.begin.filename != *last.filename)) + && (!loc.begin.filename + || *loc.begin.filename != *last.filename)) ostr << '-' << last; else if (loc.begin.line != last.line) ostr << '-' << last.line << '.' << last.column; @@ -290,9 +262,52 @@ b4_copyright([Locations for Bison parsers in C++], ostr << '-' << last.column; return ostr; } +]]) + +# We do want M4 expansion after # for CPP macros. +m4_changecom() +b4_defines_if([ +m4_divert_push(0)dnl +@output(b4_dir_prefix[]position.hh@)@ +b4_copyright([Positions for Bison parsers in C++])[ + +/** + ** \file ]b4_dir_prefix[position.hh + ** Define the ]b4_namespace_ref[::position class. + */ + +]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[ + +# include // std::max +# include +# include + +]b4_null_define[ + +]b4_namespace_open[ +]b4_position_define[ ]b4_namespace_close[ +]b4_cpp_guard_close([b4_dir_prefix[]position.hh]) +@output(b4_dir_prefix[]location.hh@)@ +b4_copyright([Locations for Bison parsers in C++])[ + +/** + ** \file ]b4_dir_prefix[location.hh + ** Define the ]b4_namespace_ref[::location class. + */ +]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[ + +# include +# include +# include "position.hh" + +]b4_namespace_open[ +]b4_location_define[ +]b4_namespace_close[ ]b4_cpp_guard_close([b4_dir_prefix[]location.hh]) m4_divert_pop(0) +])# b4_defines_if +m4_popdef([b4_copyright_years])dnl m4_changecom([#]) diff --git a/data/stack.hh b/data/stack.hh index ddedc79b..bd94eb2d 100644 --- a/data/stack.hh +++ b/data/stack.hh @@ -18,24 +18,10 @@ m4_pushdef([b4_copyright_years], [2002-2012]) -# We do want M4 expansion after # for CPP macros. -m4_changecom() -m4_divert_push(0)dnl -@output(b4_dir_prefix[]stack.hh@)@ -b4_copyright([Stack handling for Bison parsers in C++], - [2002-2012])[ - -/** - ** \file ]b4_dir_prefix[stack.hh - ** Define the ]b4_namespace_ref[::stack class. - */ - -]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[ - -# include - -]b4_namespace_open[ - template > +# b4_stack_define +# --------------- +m4_define([b4_stack_define], +[[ template > class stack { public: @@ -43,11 +29,13 @@ b4_copyright([Stack handling for Bison parsers in C++], typedef typename S::reverse_iterator iterator; typedef typename S::const_reverse_iterator const_iterator; - stack () : seq_ () + stack () + : seq_ () { } - stack (unsigned int n) : seq_ (n) + stack (unsigned int n) + : seq_ (n) { } @@ -81,16 +69,28 @@ b4_copyright([Stack handling for Bison parsers in C++], } inline - unsigned int - height () const + typename S::size_type + size () const { return seq_.size (); } - inline const_iterator begin () const { return seq_.rbegin (); } - inline const_iterator end () const { return seq_.rend (); } + inline + const_iterator + begin () const + { + return seq_.rbegin (); + } + + inline + const_iterator + end () const + { + return seq_.rend (); + } private: + /// The wrapped container. S seq_; }; @@ -116,9 +116,30 @@ b4_copyright([Stack handling for Bison parsers in C++], const S& stack_; unsigned int range_; }; +]]) + +b4_defines_if( +[# We do want M4 expansion after # for CPP macros. +m4_changecom() +m4_divert_push(0)dnl +@output(b4_dir_prefix[]stack.hh@)@ +b4_copyright([Stack handling for Bison parsers in C++])[ + +/** + ** \file ]b4_dir_prefix[stack.hh + ** Define the ]b4_namespace_ref[::stack class. + */ + +]b4_cpp_guard_open([b4_dir_prefix[]stack.hh])[ + +# include + +]b4_namespace_open[ +]b4_stack_define[ ]b4_namespace_close[ ]b4_cpp_guard_close([b4_dir_prefix[]stack.hh]) m4_divert_pop(0) m4_popdef([b4_copyright_years])dnl m4_changecom([#]) +]) diff --git a/data/variant.hh b/data/variant.hh new file mode 100644 index 00000000..5895b297 --- /dev/null +++ b/data/variant.hh @@ -0,0 +1,277 @@ +# C++ skeleton for Bison + +# Copyright (C) 2002-2012 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +## --------- ## +## variant. ## +## --------- ## + +# b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS]) +# ------------------------------------------------ +# Run some ACTION ("build", or "destroy") on YYVAL of symbol type +# YYTYPE. +m4_define([b4_symbol_variant], +[m4_pushdef([b4_dollar_dollar], + [$2.$3< $][3 >(m4_shift3($@))])dnl + switch ($1) + { +b4_type_foreach([b4_type_action_])[]dnl + default: + break; + } +m4_popdef([b4_dollar_dollar])dnl +]) + + +# _b4_char_sizeof_counter +# ----------------------- +# A counter used by _b4_char_sizeof_dummy to create fresh symbols. +m4_define([_b4_char_sizeof_counter], +[0]) + +# _b4_char_sizeof_dummy +# --------------------- +# At each call return a new C++ identifier. +m4_define([_b4_char_sizeof_dummy], +[m4_define([_b4_char_sizeof_counter], m4_incr(_b4_char_sizeof_counter))dnl +dummy[]_b4_char_sizeof_counter]) + + +# b4_char_sizeof_(SYMBOL-NUM) +# --------------------------- +# A comment describing this symbol. +m4_define([b4_char_sizeof_], +[ // b4_symbol([$1], [tag]) +]) + +# b4_char_sizeof(SYMBOL-NUMS) +# --------------------------- +# To be mapped on the list of type names to produce: +# +# char dummy1[sizeof(type_name_1)]; +# char dummy2[sizeof(type_name_2)]; +# +# for defined type names. +m4_define([b4_char_sizeof], +[b4_symbol_if([$1], [has_type], +[ +m4_map([b4_char_sizeof_], [$@])dnl + char _b4_char_sizeof_dummy@{sizeof([b4_symbol([$1], [type])])@}; +])]) + + +# b4_variant_define +# ----------------- +# Define "variant". +m4_define([b4_variant_define], +[[ + /// A char[S] buffer to store and retrieve objects. + /// + /// Sort of a variant, but does not keep track of the nature + /// of the stored data, since that knowledge is available + /// via the current state. + template + struct variant + {]b4_parse_assert_if([ + /// Whether something is contained. + bool built; +])[ + /// Empty construction. + inline + variant ()]b4_parse_assert_if([ + : built (false)])[ + {} + + /// Instantiate a \a T in here. + template + inline T& + build () + {]b4_parse_assert_if([ + assert (!built); + built = true;])[ + return *new (buffer.raw) T; + } + + /// Instantiate a \a T in here from \a t. + template + inline T& + build (const T& t) + {]b4_parse_assert_if([ + assert(!built); + built = true;])[ + return *new (buffer.raw) T(t); + } + + /// Construct and fill. + template + inline + variant (const T& t)]b4_parse_assert_if([ + : built (true)])[ + { + new (buffer.raw) T(t); + } + + /// Accessor to a built \a T. + template + inline T& + as () + {]b4_parse_assert_if([ + assert (built);])[ + return reinterpret_cast(buffer.raw); + } + + /// Const accessor to a built \a T (for %printer). + template + inline const T& + as () const + {]b4_parse_assert_if([ + assert(built);])[ + return reinterpret_cast(buffer.raw); + } + + /// Swap the content with \a other. + template + inline void + swap (variant& other) + { + std::swap (as(), other.as()); + } + + /// Assign the content of \a other to this. + /// Destroys \a other. + template + inline void + build (variant& other) + { + build(); + swap(other); + other.destroy(); + } + + /// Destroy the stored \a T. + template + inline void + destroy () + { + as().~T();]b4_parse_assert_if([ + built = false;])[ + } + + /// A buffer large enough to store any of the semantic values. + /// Long double is chosen as it has the strongest alignment + /// constraints. + union + { + long double align_me; + char raw[S]; + } buffer; + }; +]]) + + +## -------------------------- ## +## Adjustments for variants. ## +## -------------------------- ## + + +# b4_semantic_type_declare +# ------------------------ +# Declare semantic_type. +m4_define([b4_semantic_type_declare], +[ /// An auxiliary type to compute the largest semantic type. + union union_type + {]b4_type_foreach([b4_char_sizeof])[}; + + /// Symbol semantic values. + typedef variant semantic_type;]) + + +# How the semantic value is extracted when using variants. + +# b4_symbol_value(VAL, [TYPE]) +# ---------------------------- +m4_define([b4_symbol_value], +[m4_ifval([$2], + [$1.as< $2 >()], + [$1])]) + +# b4_symbol_value_template(VAL, [TYPE]) +# ------------------------------------- +# Same as b4_symbol_value, but used in a template method. +m4_define([b4_symbol_value_template], +[m4_ifval([$2], + [$1.template as< $2 >()], + [$1])]) + + + +## ------------- ## +## make_SYMBOL. ## +## ------------- ## + + +# b4_symbol_constructor_declare_(SYMBOL-NUMBER) +# --------------------------------------------- +# Declare the overloaded version of make_symbol for the (common) type of +# these SYMBOL-NUMBERS. Use at class-level. +m4_define([b4_symbol_constructor_declare_], +[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id], +[ static inline + symbol_type + make_[]b4_symbol_([$1], [id]) (dnl +b4_args(b4_symbol_if([$1], [has_type], + [const b4_symbol([$1], [type])& v]), + b4_locations_if([const location_type& l]))); + +])])]) + + +# b4_symbol_constructor_declare +# ----------------------------- +# Declare symbol constructors for all the value types. +# Use at class-level. +m4_define([b4_symbol_constructor_declare], +[ // Symbol constructors declarations. +b4_symbol_foreach([b4_symbol_constructor_declare_])]) + + + +# b4_symbol_constructor_define_(SYMBOL-NUMBER) +# -------------------------------------------- +# Define symbol constructor for this SYMBOL-NUMBER. +m4_define([b4_symbol_constructor_define_], +[b4_symbol_if([$1], [is_token], [b4_symbol_if([$1], [has_id], +[ b4_parser_class_name::symbol_type + b4_parser_class_name::make_[]b4_symbol_([$1], [id]) (dnl +b4_args(b4_symbol_if([$1], [has_type], + [const b4_symbol([$1], [type])& v]), + b4_locations_if([const location_type& l]))) + { + return symbol_type (b4_args([token::b4_symbol([$1], [id])], + b4_symbol_if([$1], [has_type], [v]), + b4_locations_if([l]))); + } + +])])]) + + +# b4_symbol_constructor_define +# ---------------------------- +# Define the overloaded versions of make_symbol for all the value types. +m4_define([b4_symbol_constructor_define], +[ // Implementation of make_symbol for each symbol type. +b4_symbol_foreach([b4_symbol_constructor_define_])]) diff --git a/data/xslt/xml2dot.xsl b/data/xslt/xml2dot.xsl index 219faa2f..49f454bb 100644 --- a/data/xslt/xml2dot.xsl +++ b/data/xslt/xml2dot.xsl @@ -124,20 +124,20 @@ - - dotted - - - solid - - - dashed - + + dotted + + + solid + + + dashed + - + diff --git a/data/xslt/xml2text.xsl b/data/xslt/xml2text.xsl index d14f1be5..d776bb17 100644 --- a/data/xslt/xml2text.xsl +++ b/data/xslt/xml2text.xsl @@ -253,9 +253,9 @@ - - - + + + @@ -266,9 +266,9 @@ - - - + + + @@ -279,9 +279,9 @@ - - - + + + @@ -290,7 +290,7 @@ + select="preceding-sibling::item[1]/@rule-number"/> @@ -329,14 +329,14 @@ - - + + - - + + @@ -442,7 +442,7 @@ ( + select="key('bison:ruleByNumber', current()/@rule)/lhs[text()]"/> ) @@ -479,9 +479,9 @@ + order="descending"/> - + @@ -498,7 +498,7 @@ - + @@ -516,7 +516,7 @@ - + diff --git a/data/xslt/xml2xhtml.xsl b/data/xslt/xml2xhtml.xsl index f8126cfb..239ce3b5 100644 --- a/data/xslt/xml2xhtml.xsl +++ b/data/xslt/xml2xhtml.xsl @@ -31,32 +31,32 @@ + doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" + doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" + indent="yes"/> - <xsl:value-of select="bison-xml-report/filename"/> - <xsl:text> - GNU Bison XML Automaton Report</xsl:text> + <xsl:value-of select="bison-xml-report/filename"/> + <xsl:text> - GNU Bison XML Automaton Report</xsl:text>