From: Theophile Ranquet Date: Mon, 10 Dec 2012 16:01:55 +0000 (+0100) Subject: Merge remote-tracking branch 'origin/maint' X-Git-Tag: v2.7.90~261 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/0906b12cd56f9777fb684b8a257a0e56c090a93c?hp=f3ead217b8636f623399e66bd937b1c51774d4af Merge remote-tracking branch 'origin/maint' * origin/maint: news: prepare for forthcoming release doc: explain how mid-rule actions are translated error: use better locations for unused midrule values doc: various minor improvements and fixes tests: ignore more useless compiler warnings tests: be robust to C being compiled with a C++11 compiler build: beware of Clang++ not supporting POSIXLY_CORRECT maint: post-release administrivia version 2.6.90 build: fix syntax-check error. cpp: simplify the Flex version checking macro news: improve the carets example and fix a typo cpp: improve the Flex version checking macro carets: improve the code maint: update news build: keep -Wmissing-declarations and -Wmissing-prototypes for modern GCCs build: drop -Wcast-qual gnulib: update Conflicts: NEWS doc/Makefile.am doc/bison.texi gnulib src/reader.c tests/actions.at tests/atlocal.in tests/input.at --- diff --git a/.prev-version b/.prev-version index 57cf282e..7d99c602 100644 --- a/.prev-version +++ b/.prev-version @@ -1 +1 @@ -2.6.5 +2.6.90 diff --git a/NEWS b/NEWS index eabdcc6e..7df5d87e 100644 --- a/NEWS +++ b/NEWS @@ -247,50 +247,66 @@ GNU Bison NEWS The introduction of this feature, in 2.4, was four years ago. The --language option and the %language directive are no longer experimental. -** New format for error reports: carets +** Bug fixes - Caret errors have been added to Bison, for example (taken from the - documentation): + Warnings about uninitialized yylloc in yyparse have been fixed. - input.y:3.20-23: error: ambiguous reference: '$exp' - exp: exp '+' exp { $exp = $1 + $2; }; - ^^^^ +** Diagnostics are improved - The default behaviour for now is still not to display these unless explictly - asked with -fall of -fcaret. However, in a later release, it will be made the - default behavior (but may still be deactivated with -fno-caret). +*** Changes in the format of error messages -** New value for %define variable: api.pure full + This used to be the format of many error reports: - The %define variable api.pure requests a pure (reentrant) parser. However, - for historical reasons, using it in a location-tracking Yacc parser resulted - in an yyerror function that did not take a location as a parameter. With this - new value, the user may request a better pure parser, where yyerror does take - a location as a parameter (in location-tracking parsers). + input.y:2.7-12: %type redeclaration for exp + input.y:1.7-12: previous declaration - The use of "%define api.pure true" is deprecated in favor of this new - "%define api.pure full". + It is now: -** Changes in the format of error messages + input.y:2.7-12: error: %type redeclaration for exp + input.y:1.7-12: previous declaration - This used to be the format of many error reports: +*** New format for error reports: carets - foo.y:5.10-24: result type clash on merge function 'merge': != - foo.y:4.13-27: previous declaration + Caret errors have been added to Bison: - It is now: + input.y:2.7-12: error: %type redeclaration for exp + %type exp + ^^^^^^ + input.y:1.7-12: previous declaration + %type exp + ^^^^^^ - foo.y:5.10-25: result type clash on merge function 'merge': != - foo.y:4.13-27: previous declaration + or -** Exception safety (lalr1.cc) + input.y:3.20-23: error: ambiguous reference: '$exp' + exp: exp '+' exp { $exp = $1 + $3; }; + ^^^^ + input.y:3.1-3: refers to: $exp at $$ + exp: exp '+' exp { $exp = $1 + $3; }; + ^^^ + input.y:3.6-8: refers to: $exp at $1 + exp: exp '+' exp { $exp = $1 + $3; }; + ^^^ + input.y:3.14-16: refers to: $exp at $3 + exp: exp '+' exp { $exp = $1 + $3; }; + ^^^ + + The default behaviour for now is still not to display these unless + explictly asked with -fcaret (or -fall). However, in a later release, it + will be made the default behavior (but may still be deactivated with + -fno-caret). - The parse function now catches exceptions, uses the %destructors to - release memory (the lookahead symbol and the symbols pushed on the stack) - before re-throwing the exception. +** New value for %define variable: api.pure full - This feature is somewhat experimental. User feedback would be - appreciated. + The %define variable api.pure requests a pure (reentrant) parser. However, + for historical reasons, using it in a location-tracking Yacc parser + resulted in a yyerror function that did not take a location as a + parameter. With this new value, the user may request a better pure parser, + where yyerror does take a location as a parameter (in location-tracking + parsers). + + The use of "%define api.pure true" is deprecated in favor of this new + "%define api.pure full". ** New %define variable: api.location.type (glr.cc, lalr1.cc, lalr1.java) @@ -311,6 +327,15 @@ GNU Bison NEWS position_type are deprecated in favor of api.location.type and api.position.type. +** Exception safety (lalr1.cc) + + The parse function now catches exceptions, uses the %destructors to + release memory (the lookahead symbol and the symbols pushed on the stack) + before re-throwing the exception. + + This feature is somewhat experimental. User feedback would be + appreciated. + ** Graph improvements in DOT and XSLT The graphical presentation of the states is more readable: their shape is @@ -323,19 +348,21 @@ GNU Bison NEWS These changes are present in both --graph output and xml2dot.xsl XSLT processing, with minor (documented) differences. - Two nodes were added to the documentation: Xml and Graphviz. - -* Noteworthy changes in release ?.? (????-??-??) [?] - -** Bug fixes +** %language is no longer an experimental feature. - Warnings about uninitialized yylloc in yyparse have been fixed. + The introduction of this feature, in 2.4, was four years ago. The + --language option and the %language directive are no longer experimental. ** Documentation The sections about shift/reduce and reduce/reduce conflicts resolution have been fixed and extended. + Although introduced more than four years ago, XML and Graphviz reports + were not properly documented. + + The translation of mid-rule actions is now described. + * Noteworthy changes in release 2.6.5 (2012-11-07) [stable] We consider compiler warnings about Bison generated parsers to be bugs. diff --git a/cfg.mk b/cfg.mk index 1aa1c1ab..e77fe89e 100644 --- a/cfg.mk +++ b/cfg.mk @@ -77,6 +77,7 @@ $(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_doubled_word=^tests/named-refs.at$$ \ prohibit_magic_number_exit=^doc/bison.texi$$ \ prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$ \ prohibit_strcmp=^doc/bison\.texi$$ \ diff --git a/configure.ac b/configure.ac index a4eb373e..eb39c617 100644 --- a/configure.ac +++ b/configure.ac @@ -60,6 +60,20 @@ AC_PROG_CXX # Gnulib (early checks). gl_EARLY +# Gnulib uses '#pragma GCC diagnostic push' to silence some +# warnings, but older gcc doesn't support this. +AC_CACHE_CHECK([whether pragma GCC diagnostic push works], + [lv_cv_gcc_pragma_push_works], [ + save_CFLAGS=$CFLAGS + CFLAGS='-Wunknown-pragmas -Werror' + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #pragma GCC diagnostic push + #pragma GCC diagnostic pop + ]])], + [lv_cv_gcc_pragma_push_works=yes], + [lv_cv_gcc_pragma_push_works=no]) + CFLAGS=$save_CFLAGS]) + AC_ARG_ENABLE([gcc-warnings], [ --enable-gcc-warnings turn on lots of GCC warnings (not recommended)], [case $enable_gcc_warnings in @@ -69,9 +83,8 @@ AC_ARG_ENABLE([gcc-warnings], [enable_gcc_warnings=no]) if test "$enable_gcc_warnings" = yes; then warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align - -Wcast-qual -Wformat -Wpointer-arith -Wwrite-strings' - warn_c='-Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes - -Wshadow -Wstrict-prototypes' + -Wformat -Wpointer-arith -Wwrite-strings' + warn_c='-Wbad-function-cast -Wshadow -Wstrict-prototypes' warn_cxx='-Wnoexcept' AC_LANG_PUSH([C]) @@ -92,12 +105,21 @@ if test "$enable_gcc_warnings" = yes; then gl_WARN_ADD([$i], [WARN_CFLAGS]) done gl_WARN_ADD([-Werror], [WERROR_CFLAGS]) + + # Warnings for the test suite, and maybe for bison if GCC is modern + # enough. + gl_WARN_ADD([-Wmissing-declarations], [WARN_CFLAGS_TEST]) + gl_WARN_ADD([-Wmissing-prototypes], [WARN_CFLAGS_TEST]) + test $lv_cv_gcc_pragma_push_works = yes && + AS_VAR_APPEND([WARN_CFLAGS], [" $WARN_CFLAGS_TEST"]) + # Warnings for the test suite only. gl_WARN_ADD([-Wundef], [WARN_CFLAGS_TEST]) gl_WARN_ADD([-pedantic], [WARN_CFLAGS_TEST]) CFLAGS=$save_CFLAGS AC_LANG_POP([C]) + AC_LANG_PUSH([C++]) save_CXXFLAGS=$CXXFLAGS gl_WARN_ADD([-Werror=unknown-warning-option], [CXXFLAGS]) @@ -118,8 +140,9 @@ if test "$enable_gcc_warnings" = yes; then fi BISON_TEST_FOR_WORKING_C_COMPILER -BISON_TEST_FOR_WORKING_CXX_COMPILER BISON_C_COMPILER_POSIXLY_CORRECT +BISON_TEST_FOR_WORKING_CXX_COMPILER +BISON_CXX_COMPILER_POSIXLY_CORRECT AC_ARG_ENABLE([yacc], [AC_HELP_STRING([--disable-yacc], diff --git a/doc/bison.texi b/doc/bison.texi index 28af1ae6..e0c321bc 100644 --- a/doc/bison.texi +++ b/doc/bison.texi @@ -211,6 +211,12 @@ Defining Language Semantics This says when, why and how to use the exceptional action in the middle of a rule. +Actions in Mid-Rule + +* Using Mid-Rule Actions:: Putting an action in the middle of a rule. +* Mid-Rule Action Translation:: How mid-rule actions are actually processed. +* Mid-Rule Conflicts:: Mid-rule actions can cause conflicts. + Tracking Locations * Location Type:: Specifying a data type for locations. @@ -2791,6 +2797,9 @@ The Bison grammar file conventionally has a name ending in @samp{.y}. @node Grammar Outline @section Outline of a Bison Grammar +@cindex comment +@findex // @dots{} +@findex /* @dots{} */ A Bison grammar file has four main sections, shown here with the appropriate delimiters: @@ -2810,8 +2819,8 @@ appropriate delimiters: @end example Comments enclosed in @samp{/* @dots{} */} may appear in any of the sections. -As a GNU extension, @samp{//} introduces a comment that -continues until end of line. +As a GNU extension, @samp{//} introduces a comment that continues until end +of line. @menu * Prologue:: Syntax and usage of the prologue. @@ -3799,6 +3808,15 @@ Occasionally it is useful to put an action in the middle of a rule. These actions are written just like usual end-of-rule actions, but they are executed before the parser even recognizes the following components. +@menu +* Using Mid-Rule Actions:: Putting an action in the middle of a rule. +* Mid-Rule Action Translation:: How mid-rule actions are actually processed. +* Mid-Rule Conflicts:: Mid-rule actions can cause conflicts. +@end menu + +@node Using Mid-Rule Actions +@subsubsection Using Mid-Rule Actions + A mid-rule action may refer to the components preceding it using @code{$@var{n}}, but it may not refer to subsequent components because it is run before they are parsed. @@ -3831,10 +3849,16 @@ remove it afterward. Here is how it is done: @example @group stmt: - LET '(' var ')' - @{ $$ = push_context (); declare_variable ($3); @} + "let" '(' var ')' + @{ + $$ = push_context (); + declare_variable ($3); + @} stmt - @{ $$ = $6; pop_context ($5); @} + @{ + $$ = $6; + pop_context ($5); + @} @end group @end example @@ -3845,8 +3869,27 @@ list of accessible variables) as its semantic value, using alternative @code{context} in the data-type union. Then it calls @code{declare_variable} to add the new variable to that list. Once the first action is finished, the embedded statement @code{stmt} can be -parsed. Note that the mid-rule action is component number 5, so the -@samp{stmt} is component number 6. +parsed. + +Note that the mid-rule action is component number 5, so the @samp{stmt} is +component number 6. Named references can be used to improve the readability +and maintainability (@pxref{Named References}): + +@example +@group +stmt: + "let" '(' var ')' + @{ + $let = push_context (); + declare_variable ($3); + @}[let] + stmt + @{ + $$ = $6; + pop_context ($let); + @} +@end group +@end example After the embedded statement is parsed, its semantic value becomes the value of the entire @code{let}-statement. Then the semantic value from the @@ -3880,13 +3923,13 @@ stmt: let stmt @{ $$ = $2; - pop_context ($1); + pop_context ($let); @}; let: - LET '(' var ')' + "let" '(' var ')' @{ - $$ = push_context (); + $let = push_context (); declare_variable ($3); @}; @@ -3898,6 +3941,76 @@ Note that the action is now at the end of its rule. Any mid-rule action can be converted to an end-of-rule action in this way, and this is what Bison actually does to implement mid-rule actions. +@node Mid-Rule Action Translation +@subsubsection Mid-Rule Action Translation +@vindex $@@@var{n} +@vindex @@@var{n} + +As hinted earlier, mid-rule actions are actually transformed into regular +rules and actions. The various reports generated by Bison (textual, +graphical, etc., see @ref{Understanding, , Understanding Your Parser}) +reveal this translation, best explained by means of an example. The +following rule: + +@example +exp: @{ a(); @} "b" @{ c(); @} @{ d(); @} "e" @{ f(); @}; +@end example + +@noindent +is translated into: + +@example +$@@1: /* empty */ @{ a(); @}; +$@@2: /* empty */ @{ c(); @}; +$@@3: /* empty */ @{ d(); @}; +exp: $@@1 "b" $@@2 $@@3 "e" @{ f(); @}; +@end example + +@noindent +with new nonterminal symbols @code{$@@@var{n}}, where @var{n} is a number. + +A mid-rule action is expected to generate a value if it uses @code{$$}, or +the (final) action uses @code{$@var{n}} where @var{n} denote the mid-rule +action. In that case its nonterminal is rather named @code{@@@var{n}}: + +@example +exp: @{ a(); @} "b" @{ $$ = c(); @} @{ d(); @} "e" @{ f = $1; @}; +@end example + +@noindent +is translated into + +@example +@@1: /* empty */ @{ a(); @}; +@@2: /* empty */ @{ $$ = c(); @}; +$@@3: /* empty */ @{ d(); @}; +exp: @@1 "b" @@2 $@@3 "e" @{ f = $1; @} +@end example + +There are probably two errors in the above example: the first mid-rule +action does not generate a value (it does not use @code{$$} although the +final action uses it), and the value of the second one is not used (the +final action does not use @code{$3}). Bison reports these errors when the +@code{midrule-value} warnings are enabled (@pxref{Invocation, ,Invoking +Bison}): + +@example +$ bison -fcaret -Wmidrule-value mid.y +@group +mid.y:2.6-13: warning: unset value: $$ + exp: @{ a(); @} "b" @{ $$ = c(); @} @{ d(); @} "e" @{ f = $1; @}; + ^^^^^^^^ +@end group +@group +mid.y:2.19-31: warning: unused value: $3 + exp: @{ a(); @} "b" @{ $$ = c(); @} @{ d(); @} "e" @{ f = $1; @}; + ^^^^^^^^^^^^^ +@end group +@end example + + +@node Mid-Rule Conflicts +@subsubsection Conflicts due to Mid-Rule Actions Taking action before a rule is completely recognized often leads to conflicts since the parser must commit to a parse in order to execute the action. For example, the following two rules, without mid-rule actions, @@ -3995,6 +4108,7 @@ compound: Now Bison can execute the action in the rule for @code{subroutine} without deciding which rule for @code{compound} it will eventually use. + @node Tracking Locations @section Tracking Locations @cindex location @@ -5524,8 +5638,8 @@ I.e., if @samp{%locations %define api.pure} is passed then the prototypes for @code{yyerror} are: @example -void yyerror (char const *msg); /* Yacc parsers. */ -void yyerror (YYLTYPE *locp, char const *msg); /* GLR parsers. */ +void yyerror (char const *msg); // Yacc parsers. +void yyerror (YYLTYPE *locp, char const *msg); // GLR parsers. @end example But if @samp{%locations %define api.pure %parse-param @{int *nastiness@}} is @@ -6662,7 +6776,6 @@ Actions}). @end deffn @deffn {Value} @@$ -@findex @@$ Acts like a structure variable containing information on the textual location of the grouping made by the current rule. @xref{Tracking Locations}. @@ -6721,7 +6834,7 @@ GNU Automake. @item @cindex bison-i18n.m4 Into the directory containing the GNU Autoconf macros used -by the package---often called @file{m4}---copy the +by the package ---often called @file{m4}--- copy the @file{bison-i18n.m4} file installed by Bison under @samp{share/aclocal/bison-i18n.m4} in Bison's installation directory. For example: @@ -8526,8 +8639,26 @@ clear the flag. Developing a parser can be a challenge, especially if you don't understand the algorithm (@pxref{Algorithm, ,The Bison Parser Algorithm}). This -chapter explains how to generate and read the detailed description of the -automaton, and how to enable and understand the parser run-time traces. +chapter explains how understand and debug a parser. + +The first sections focus on the static part of the parser: its structure. +They explain how to generate and read the detailed description of the +automaton. There are several formats available: +@itemize @minus +@item +as text, see @ref{Understanding, , Understanding Your Parser}; + +@item +as a graph, see @ref{Graphviz,, Visualizing Your Parser}; + +@item +or as a markup report that can be turned, for instance, into HTML, see +@ref{Xml,, Visualizing your parser in multiple formats}. +@end itemize + +The last section focuses on the dynamic part of the parser: how to enable +and understand the parser run-time traces (@pxref{Tracing, ,Tracing Your +Parser}). @menu * Understanding:: Understanding the structure of your parser. @@ -8542,8 +8673,7 @@ automaton, and how to enable and understand the parser run-time traces. As documented elsewhere (@pxref{Algorithm, ,The Bison Parser Algorithm}) Bison parsers are @dfn{shift/reduce automata}. In some cases (much more frequent than one would hope), looking at this automaton is required to -tune or simply fix a parser. Bison provides two different -representation of it, either textually or graphically (as a DOT file). +tune or simply fix a parser. The textual file is generated when the options @option{--report} or @option{--verbose} are specified, see @ref{Invocation, , Invoking @@ -8557,9 +8687,12 @@ The following grammar file, @file{calc.y}, will be used in the sequel: @example %token NUM STR +@group %left '+' '-' %left '*' +@end group %% +@group exp: exp '+' exp | exp '-' exp @@ -8567,6 +8700,7 @@ exp: | exp '/' exp | NUM ; +@end group useless: STR; %% @end example @@ -8576,8 +8710,8 @@ useless: STR; @example calc.y: warning: 1 nonterminal useless in grammar calc.y: warning: 1 rule useless in grammar -calc.y:11.1-7: warning: nonterminal useless in grammar: useless -calc.y:11.10-12: warning: rule useless in grammar: useless: STR +calc.y:12.1-7: warning: nonterminal useless in grammar: useless +calc.y:12.10-12: warning: rule useless in grammar: useless: STR calc.y: conflicts: 7 shift/reduce @end example @@ -8671,7 +8805,7 @@ item is a production rule together with a point (@samp{.}) marking the location of the input cursor. @example -state 0 +State 0 0 $accept: . exp $end @@ -8701,7 +8835,7 @@ you want to see more detail you can invoke @command{bison} with @option{--report=itemset} to list the derived items as well: @example -state 0 +State 0 0 $accept: . exp $end 1 exp: . exp '+' exp @@ -8719,7 +8853,7 @@ state 0 In the state 1@dots{} @example -state 1 +State 1 5 exp: NUM . @@ -8729,11 +8863,11 @@ state 1 @noindent the rule 5, @samp{exp: NUM;}, is completed. Whatever the lookahead token (@samp{$default}), the parser will reduce it. If it was coming from -state 0, then, after this reduction it will return to state 0, and will +State 0, then, after this reduction it will return to state 0, and will jump to state 2 (@samp{exp: go to state 2}). @example -state 2 +State 2 0 $accept: exp . $end 1 exp: exp . '+' exp @@ -8761,7 +8895,7 @@ The state 3 is named the @dfn{final state}, or the @dfn{accepting state}: @example -state 3 +State 3 0 $accept: exp $end . @@ -8776,7 +8910,7 @@ The interpretation of states 4 to 7 is straightforward, and is left to the reader. @example -state 4 +State 4 1 exp: exp '+' . exp @@ -8785,7 +8919,7 @@ state 4 exp go to state 8 -state 5 +State 5 2 exp: exp '-' . exp @@ -8794,7 +8928,7 @@ state 5 exp go to state 9 -state 6 +State 6 3 exp: exp '*' . exp @@ -8803,7 +8937,7 @@ state 6 exp go to state 10 -state 7 +State 7 4 exp: exp '/' . exp @@ -8816,7 +8950,7 @@ As was announced in beginning of the report, @samp{State 8 conflicts: 1 shift/reduce}: @example -state 8 +State 8 1 exp: exp . '+' exp 1 | exp '+' exp . @@ -8859,7 +8993,7 @@ with some set of possible lookahead tokens. When run with @option{--report=lookahead}, Bison specifies these lookahead tokens: @example -state 8 +State 8 1 exp: exp . '+' exp 1 | exp '+' exp . [$end, '+', '-', '/'] @@ -8891,7 +9025,7 @@ The remaining states are similar: @example @group -state 9 +State 9 1 exp: exp . '+' exp 2 | exp . '-' exp @@ -8907,7 +9041,7 @@ state 9 @end group @group -state 10 +State 10 1 exp: exp . '+' exp 2 | exp . '-' exp @@ -8922,7 +9056,7 @@ state 10 @end group @group -state 11 +State 11 1 exp: exp . '+' exp 2 | exp . '-' exp @@ -8945,12 +9079,11 @@ state 11 @noindent Observe that state 11 contains conflicts not only due to the lack of -precedence of @samp{/} with respect to @samp{+}, @samp{-}, and -@samp{*}, but also because the -associativity of @samp{/} is not specified. +precedence of @samp{/} with respect to @samp{+}, @samp{-}, and @samp{*}, but +also because the associativity of @samp{/} is not specified. -Note that Bison may also produce an HTML version of this output, via an XML -file and XSLT processing (@pxref{Xml}). +Bison may also produce an HTML version of this output, via an XML file and +XSLT processing (@pxref{Xml,,Visualizing your parser in multiple formats}). @c ================================================= Graphical Representation @@ -8970,7 +9103,10 @@ This file is generated when the @option{--graph} option is specified (@pxref{Invocation, , Invoking Bison}). Its name is made by removing @samp{.tab.c} or @samp{.c} from the parser implementation file name, and adding @samp{.dot} instead. If the grammar file is @file{foo.y}, the -Graphviz output file is called @file{foo.dot}. +Graphviz output file is called @file{foo.dot}. A DOT file may also be +produced via an XML file and XSLT processing (@pxref{Xml,,Visualizing your +parser in multiple formats}). + The following grammar file, @file{rr.y}, will be used in the sequel: @@ -8983,10 +9119,20 @@ b: "0"; @end group @end example -The graphical output is very similar to the textual one, and as such it is -easier understood by making direct comparisons between them. See -@ref{Debugging, , Debugging Your Parser} for a detailled analysis of the -textual report. +The graphical output +@ifnotinfo +(see @ref{fig:graph}) +@end ifnotinfo +is very similar to the textual one, and as such it is easier understood by +making direct comparisons between them. @xref{Debugging, , Debugging Your +Parser}, for a detailled analysis of the textual report. + +@ifnotinfo +@float Figure,fig:graph +@image{figs/example, 430pt} +@caption{A graphical rendering of the parser.} +@end float +@end ifnotinfo @subheading Graphical Representation of States @@ -9011,7 +9157,7 @@ shift. The following describes a reduction in the @file{rr.output} file: @example @group -state 3 +State 3 1 exp: a . ";" @@ -9032,7 +9178,7 @@ action for the given state, there is no such label. This is how reductions are represented in the verbose file @file{rr.output}: @example -state 1 +State 1 3 a: "0" . [";"] 4 b: "0" . ["."] @@ -9051,17 +9197,14 @@ reduction, see @ref{Shift/Reduce, , Shift/Reduce Conflicts}. Discarded actions are distinguished by a red filling color on these nodes, just like how they are reported between square brackets in the verbose file. -The reduction corresponding to the rule number 0 is the acceptation state. It -is shown as a blue diamond, labelled "Acc". +The reduction corresponding to the rule number 0 is the acceptation +state. It is shown as a blue diamond, labelled ``Acc''. @subheading Graphical representation of go tos The @samp{go to} jump transitions are represented as dotted lines bearing the name of the rule being jumped to. -Note that a DOT file may also be produced via an XML file and XSLT -processing (@pxref{Xml}). - @c ================================================= XML @node Xml @@ -9069,8 +9212,10 @@ processing (@pxref{Xml}). @cindex xml Bison supports two major report formats: textual output -(@pxref{Understanding}) when invoked with option @option{--verbose}, and DOT -(@pxref{Graphviz}) when invoked with option @option{--graph}. However, +(@pxref{Understanding, ,Understanding Your Parser}) when invoked +with option @option{--verbose}, and DOT +(@pxref{Graphviz,, Visualizing Your Parser}) when invoked with +option @option{--graph}. However, another alternative is to output an XML file that may then be, with @command{xsltproc}, rendered as either a raw text format equivalent to the verbose file, or as an HTML version of the same file, with clickable @@ -9078,7 +9223,7 @@ transitions, or even as a DOT. The @file{.output} and DOT files obtained via XSLT have no difference whatsoever with those obtained by invoking @command{bison} with options @option{--verbose} or @option{--graph}. -The textual file is generated when the options @option{-x} or +The XML file is generated when the options @option{-x} or @option{--xml[=FILE]} are specified, see @ref{Invocation,,Invoking Bison}. If not specified, its name is made by removing @samp{.tab.c} or @samp{.c} from the parser implementation file name, and adding @samp{.xml} instead. @@ -9092,19 +9237,19 @@ files to apply to the XML file. Their names are non-ambiguous: @item xml2dot.xsl Used to output a copy of the DOT visualization of the automaton. @item xml2text.xsl -Used to output a copy of the .output file. +Used to output a copy of the @samp{.output} file. @item xml2xhtml.xsl -Used to output an xhtml enhancement of the .output file. +Used to output an xhtml enhancement of the @samp{.output} file. @end table -Sample usage (requires @code{xsltproc}): +Sample usage (requires @command{xsltproc}): @example -$ bison -x input.y +$ bison -x gr.y @group $ bison --print-datadir /usr/local/share/bison @end group -$ xsltproc /usr/local/share/bison/xslt/xml2xhtml.xsl input.xml > input.html +$ xsltproc /usr/local/share/bison/xslt/xml2xhtml.xsl gr.xml >gr.html @end example @c ================================================= Tracing @@ -9302,7 +9447,7 @@ Entering state 24 @noindent The previous reduction demonstrates the @code{%printer} directive for -@code{}: both the token @code{NUM} and the resulting non-terminal +@code{}: both the token @code{NUM} and the resulting nonterminal @code{exp} have @samp{1} as value. @example @@ -9617,7 +9762,7 @@ Show caret errors, in a manner similar to GCC's @option{-fdiagnostics-show-caret}, or Clang's @option{-fcaret-diagnotics}. The location provided with the message is used to quote the corresponding line of the source file, underlining the important part of it with carets (^). Here is -an example, using the following file @file{input.y}: +an example, using the following file @file{in.y}: @example %type exp @@ -9629,27 +9774,27 @@ When invoked with @option{-fcaret}, Bison will report: @example @group -input.y:3.20-23: error: ambiguous reference: '$exp' +in.y:3.20-23: error: ambiguous reference: '$exp' exp: exp '+' exp @{ $exp = $1 + $2; @}; ^^^^ @end group @group -input.y:3.1-3: refers to: $exp at $$ +in.y:3.1-3: refers to: $exp at $$ exp: exp '+' exp @{ $exp = $1 + $2; @}; ^^^ @end group @group -input.y:3.6-8: refers to: $exp at $1 +in.y:3.6-8: refers to: $exp at $1 exp: exp '+' exp @{ $exp = $1 + $2; @}; ^^^ @end group @group -input.y:3.14-16: refers to: $exp at $3 +in.y:3.14-16: refers to: $exp at $3 exp: exp '+' exp @{ $exp = $1 + $2; @}; ^^^ @end group @group -input.y:3.32-33: error: $2 of 'exp' has no declared type +in.y:3.32-33: error: $2 of 'exp' has no declared type exp: exp '+' exp @{ $exp = $1 + $2; @}; ^^ @end group @@ -12040,18 +12185,23 @@ In an action, the location of the left-hand side of the rule. @end deffn @deffn {Variable} @@@var{n} +@deffnx {Symbol} @@@var{n} In an action, the location of the @var{n}-th symbol of the right-hand side of the rule. @xref{Tracking Locations}. + +In a grammar, the Bison-generated nonterminal symbol for a mid-rule action +with a semantical value. @xref{Mid-Rule Action Translation}. @end deffn @deffn {Variable} @@@var{name} -In an action, the location of a symbol addressed by name. @xref{Tracking -Locations}. +@deffnx {Variable} @@[@var{name}] +In an action, the location of a symbol addressed by @var{name}. +@xref{Tracking Locations}. @end deffn -@deffn {Variable} @@[@var{name}] -In an action, the location of a symbol addressed by name. @xref{Tracking -Locations}. +@deffn {Symbol} $@@@var{n} +In a grammar, the Bison-generated nonterminal symbol for a mid-rule action +with no semantical value. @xref{Mid-Rule Action Translation}. @end deffn @deffn {Variable} $$ @@ -12065,12 +12215,8 @@ right-hand side of the rule. @xref{Actions}. @end deffn @deffn {Variable} $@var{name} -In an action, the semantic value of a symbol addressed by name. -@xref{Actions}. -@end deffn - -@deffn {Variable} $[@var{name}] -In an action, the semantic value of a symbol addressed by name. +@deffnx {Variable} $[@var{name}] +In an action, the semantic value of a symbol addressed by @var{name}. @xref{Actions}. @end deffn @@ -12101,8 +12247,9 @@ More user feedback will help to determine whether it should become a permanent feature. @end deffn -@deffn {Construct} /*@dots{}*/ -Comment delimiters, as in C. +@deffn {Construct} /* @dots{} */ +@deffnx {Construct} // @dots{} +Comments, as in C/C++. @end deffn @deffn {Delimiter} : @@ -12587,7 +12734,7 @@ Data type of semantic values; @code{int} by default. @item Accepting state A state whose only action is the accept action. The accepting state is thus a consistent state. -@xref{Understanding,,}. +@xref{Understanding, ,Understanding Your Parser}. @item Backus-Naur Form (BNF; also called ``Backus Normal Form'') Formal method of specifying context-free grammars originally proposed diff --git a/doc/figs/example.dot b/doc/figs/example.dot new file mode 100644 index 00000000..94fff855 --- /dev/null +++ b/doc/figs/example.dot @@ -0,0 +1,35 @@ +// Generated by GNU Bison 2.6.90. +// Report bugs to . +// Home page: . + +digraph "/tmp/fo.y" +{ + node [fontname = courier, shape = box, colorscheme = paired6] + edge [fontname = courier] + + 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a \";\"\l 2 | . b \".\"\l 3 a: . \"0\"\l 4 b: . \"0\"\l"] + 0 -> 1 [style=solid label="\"0\""] + 0 -> 2 [style=dashed label="exp"] + 0 -> 3 [style=dashed label="a"] + 0 -> 4 [style=dashed label="b"] + 1 [label="State 1\n\l 3 a: \"0\" . [\";\"]\l 4 b: \"0\" . [\".\"]\l"] + 1 -> "1R3" [style=solid] + "1R3" [label="R3", fillcolor=3, shape=diamond, style=filled] + 1 -> "1R4" [label="[\".\"]", style=solid] + "1R4" [label="R4", fillcolor=3, shape=diamond, style=filled] + 2 [label="State 2\n\l 0 $accept: exp . $end\l"] + 2 -> 5 [style=solid label="$end"] + 3 [label="State 3\n\l 1 exp: a . \";\"\l"] + 3 -> 6 [style=solid label="\";\""] + 4 [label="State 4\n\l 2 exp: b . \".\"\l"] + 4 -> 7 [style=solid label="\".\""] + 5 [label="State 5\n\l 0 $accept: exp $end .\l"] + 5 -> "5R0" [style=solid] + "5R0" [label="Acc", fillcolor=1, shape=diamond, style=filled] + 6 [label="State 6\n\l 1 exp: a \";\" .\l"] + 6 -> "6R1" [style=solid] + "6R1" [label="R1", fillcolor=3, shape=diamond, style=filled] + 7 [label="State 7\n\l 2 exp: b \".\" .\l"] + 7 -> "7R2" [style=solid] + "7R2" [label="R2", fillcolor=3, shape=diamond, style=filled] +} diff --git a/doc/figs/example.y b/doc/figs/example.y new file mode 100644 index 00000000..d0840815 --- /dev/null +++ b/doc/figs/example.y @@ -0,0 +1,4 @@ +%% +exp: a ";" | b "."; +a: "0"; +b: "0"; diff --git a/m4/c-working.m4 b/m4/c-working.m4 index ee84acf9..999c52de 100644 --- a/m4/c-working.m4 +++ b/m4/c-working.m4 @@ -24,6 +24,7 @@ AC_DEFUN([BISON_TEST_FOR_WORKING_C_COMPILER], [ int test_array[CHAR_BIT];]])], [], [AC_MSG_FAILURE([cannot compile a simple C program])]) + AC_SUBST([BISON_C_WORKS], [:]) ]) # BISON_CHECK_WITH_POSIXLY_CORRECT(CODE) @@ -47,25 +48,32 @@ case $gl_had_POSIXLY_CORRECT in esac ]) +# BISON_LANG_COMPILER_POSIXLY_CORRECT +# ----------------------------------- +# Whether the compiler for the current language supports -g in +# POSIXLY_CORRECT mode. clang-2.9 on OS X does not, because +# "clang-mp-2.9 -o test -g test.c" launches "/usr/bin/dsymutil test -o +# test.dSYM" which fails with "error: unable to open executable '-o'". +# +# Sets _COMPILER_POSIXLY_CORRECT to true/false. +AC_DEFUN([BISON_LANG_COMPILER_POSIXLY_CORRECT], +[AC_CACHE_CHECK([whether $_AC_CC supports POSIXLY_CORRECT=1], + [bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct], +[BISON_CHECK_WITH_POSIXLY_CORRECT( +[AC_LINK_IFELSE([AC_LANG_PROGRAM], + [bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct=yes], + [bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct=no])])]) +case $bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct in + yes) AC_SUBST(_AC_LANG_PREFIX[_COMPILER_POSIXLY_CORRECT], [true]) ;; + no) AC_SUBST(_AC_LANG_PREFIX[_COMPILER_POSIXLY_CORRECT], [false]);; +esac +]) + # BISON_C_COMPILER_POSIXLY_CORRECT # -------------------------------- -# Whether the compiler supports -g in POSIXLY_CORRECT mode. clang-2.9 -# on OS X does not, because "clang-mp-2.9 -o test -g test.c" launches -# "/usr/bin/dsymutil test -o test.dSYM" which fails with "error: -# unable to open executable '-o'". -# -# Sets C_COMPILER_POSIXLY_CORRECT to true/false. +# Whether the C compiler supports -g in POSIXLY_CORRECT mode. AC_DEFUN([BISON_C_COMPILER_POSIXLY_CORRECT], -[AC_CACHE_CHECK([whether $CC supports POSIXLY_CORRECT=1], - [bison_cv_cc_supports_posixly_correct], -[BISON_CHECK_WITH_POSIXLY_CORRECT( [AC_LANG_PUSH([C]) -AC_LINK_IFELSE([AC_LANG_PROGRAM], - [bison_cv_cc_supports_posixly_correct=yes], - [bison_cv_cc_supports_posixly_correct=no]) -AC_LANG_POP([C])])]) -case $bison_cv_cc_supports_posixly_correct in - yes) AC_SUBST([C_COMPILER_POSIXLY_CORRECT], [true]) ;; - no) AC_SUBST([C_COMPILER_POSIXLY_CORRECT], [false]);; -esac +BISON_LANG_COMPILER_POSIXLY_CORRECT +AC_LANG_POP([C]) ]) diff --git a/m4/cxx.m4 b/m4/cxx.m4 index 8ef1a250..f9f06092 100644 --- a/m4/cxx.m4 +++ b/m4/cxx.m4 @@ -58,3 +58,12 @@ AC_DEFUN([BISON_TEST_FOR_WORKING_CXX_COMPILER], AC_SUBST([BISON_CXX_WORKS]) AM_CONDITIONAL(BISON_CXX_WORKS, test $bison_cv_cxx_works = yes) ]) + +# BISON_CXX_COMPILER_POSIXLY_CORRECT +# ---------------------------------- +# Whether the C++ compiler supports -g in POSIXLY_CORRECT mode. +AC_DEFUN([BISON_CXX_COMPILER_POSIXLY_CORRECT], +[AC_LANG_PUSH([C++]) +BISON_LANG_COMPILER_POSIXLY_CORRECT +AC_LANG_POP([C++]) +]) diff --git a/src/flex-scanner.h b/src/flex-scanner.h index 9b80744d..40253512 100644 --- a/src/flex-scanner.h +++ b/src/flex-scanner.h @@ -21,18 +21,12 @@ # error "FLEX_PREFIX not defined" #endif -/* Whether this version of Flex is (strictly) greater than - Major.Minor.Subminor. */ -#ifdef YY_FLEX_SUBMINOR_VERSION -# define FLEX_VERSION \ - (YY_FLEX_MAJOR_VERSION) * 1000000 \ -+ (YY_FLEX_MINOR_VERSION) * 1000 \ -+ (YY_FLEX_SUBMINOR_VERSION) -#else -# define FLEX_VERSION \ - (YY_FLEX_MAJOR_VERSION) * 1000000 \ -+ (YY_FLEX_MINOR_VERSION) * 1000 -#endif +/* Flex full version as a number. */ +#define FLEX_VERSION \ + ((YY_FLEX_MAJOR_VERSION) * 1000000 \ + + (YY_FLEX_MINOR_VERSION) * 1000 \ + + (YY_FLEX_SUBMINOR_VERSION)) + /* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used. */ # if FLEX_VERSION <= 2005031 int FLEX_PREFIX (get_lineno) (void); diff --git a/src/location.c b/src/location.c index 1a7d65c2..d48a0a13 100644 --- a/src/location.c +++ b/src/location.c @@ -143,15 +143,13 @@ location_print (FILE *out, location loc) same file all over for each error. */ struct caret_info { - FILE* source; + FILE *source; size_t line; size_t offset; }; static struct caret_info caret_info = { NULL, 1, 0 }; -/* Free any allocated ressources and close any open file handles that are - left-over by the usage of location_caret. */ void cleanup_caret () { @@ -159,11 +157,10 @@ cleanup_caret () fclose (caret_info.source); } -/* Output to OUT the line and caret corresponding to location LOC. */ void location_caret (FILE *out, location loc) { - /* FIXME: find a way to support X-file locations, and only open once each + /* FIXME: find a way to support multifile locations, and only open once each file. That would make the procedure future-proof. */ if (! (caret_info.source || (caret_info.source = fopen (loc.start.file, "r"))) @@ -183,41 +180,36 @@ location_caret (FILE *out, location loc) } /* Advance to the line's position, keeping track of the offset. */ - { - int i; - for (i = caret_info.line; i < loc.start.line; caret_info.offset++) - if (fgetc (caret_info.source) == '\n') - ++i; - } - caret_info.line = loc.start.line; + while (caret_info.line < loc.start.line) + caret_info.line += fgetc (caret_info.source) == '\n'; + caret_info.offset = ftell (caret_info.source); /* Read the actual line. Don't update the offset, so that we keep a pointer to the start of the line. */ { - ssize_t len = 0; char *buf = NULL; - if ((len = getline (&buf, (size_t*) &len, caret_info.source)) != -1) + size_t size = 0; + ssize_t len = getline (&buf, &size, caret_info.source); + if (0 < len) { /* The caret of a multiline location ends with the first line. */ int end = loc.start.line != loc.end.line ? len : loc.end.column; - if (len) - { - int i = loc.start.column; - /* Quote the file, indent by a single column. */ - fputc (' ', out); - fwrite (buf, 1, len, out); - - /* Print the caret, with the same indent as above. */ - fputc (' ', out); - fprintf (out, "%*s", loc.start.column - 1, ""); - do { - fputc ('^', out); - } while (++i < end); - } + /* Quote the file, indent by a single column. */ + fputc (' ', out); + fwrite (buf, 1, len, out); + + /* Print the caret, with the same indent as above. */ + fprintf (out, " %*s", loc.start.column - 1, ""); + { + int i = loc.start.column; + do + fputc ('^', out); + while (++i < end); + } fputc ('\n', out); - free (buf); } + free (buf); } } diff --git a/src/reader.c b/src/reader.c index fb17b018..a2f3bfb1 100644 --- a/src/reader.c +++ b/src/reader.c @@ -326,9 +326,9 @@ grammar_rule_check (const symbol_list *r) { warnings warn_flag = midrule_warning ? Wmidrule_values : Wother; if (n) - complain (&r->location, warn_flag, _("unused value: $%d"), n); + complain (&l->location, warn_flag, _("unused value: $%d"), n); else - complain (&r->location, warn_flag, _("unset value: $$")); + complain (&l->location, warn_flag, _("unset value: $$")); } } } diff --git a/tests/actions.at b/tests/actions.at index cd7a58b6..f62c43dd 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -1326,7 +1326,7 @@ AT_BISON_CHECK([-o input.c input.y], 0,, [[input.y:24.70-72: warning: useless %destructor for type <*> [-Wother] input.y:24.70-72: warning: useless %printer for type <*> [-Wother] input.y:33.3-23: warning: unset value: $$ [-Wother] -input.y:30.3-35.37: warning: unused value: $3 [-Wother] +input.y:32.3-23: warning: unused value: $3 [-Wother] ]]) AT_BISON_CHECK([-fcaret -o input.c input.y], 0,, @@ -1339,9 +1339,9 @@ input.y:24.70-72: warning: useless %printer for type <*> [-Wother] input.y:33.3-23: warning: unset value: $$ [-Wother] { @$ = 4; } // Only used. ^^^^^^^^^^^^^^^^^^^^^ -input.y:30.3-35.37: warning: unused value: $3 [-Wother] - { @$ = 1; } // Not set or used. - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +input.y:32.3-23: warning: unused value: $3 [-Wother] + { USE ($$); @$ = 3; } // Only set. + ^^^^^^^^^^^^^^^^^^^^^ ]]) AT_COMPILE([input]) diff --git a/tests/atlocal.in b/tests/atlocal.in index a545e5e2..bdc6d47c 100644 --- a/tests/atlocal.in +++ b/tests/atlocal.in @@ -19,6 +19,15 @@ # We need `config.h'. CPPFLAGS="-I$abs_top_builddir/lib @CPPFLAGS@" +# Don't just check if $POSIXLY_CORRECT is set, as Bash, when launched +# as /bin/sh, sets the shell variable POSIXLY_CORRECT to y, but not +# the environment variable. +if env | grep '^POSIXLY_CORRECT=' >/dev/null; then + POSIXLY_CORRECT_IS_EXPORTED=true +else + POSIXLY_CORRECT_IS_EXPORTED=false +fi + ## ------------------- ## ## C/C++ Compilation. ## ## ------------------- ## @@ -44,12 +53,24 @@ NO_STRICT_ALIAS_CXXFLAGS='@NO_STRICT_ALIAS_CXXFLAGS@' # If 'exit 77'; skip all C++ tests; otherwise ':'. BISON_CXX_WORKS='@BISON_CXX_WORKS@' +# Whether the compiler supports POSIXLY_CORRECT defined. +: ${C_COMPILER_POSIXLY_CORRECT='@C_COMPILER_POSIXLY_CORRECT@'} +: ${CXX_COMPILER_POSIXLY_CORRECT='@CXX_COMPILER_POSIXLY_CORRECT@'} + +if $POSIXLY_CORRECT_IS_EXPORTED; then + $C_COMPILER_POSIXLY_CORRECT || + BISON_C_WORKS="as_fn_error 77 POSIXLY_CORRECT" + $CXX_COMPILER_POSIXLY_CORRECT || + BISON_CXX_WORKS="as_fn_error 77 POSIXLY_CORRECT" +fi + # Handle --compile-c-with-cxx here, once CXX and CXXFLAGS are known. if "$at_arg_compile_c_with_cxx"; then CC_IS_CXX=1 CC=$CXX NO_WERROR_CFLAGS=$NO_WERROR_CXXFLAGS CFLAGS=$CXXFLAGS + BISON_C_WORKS=$BISON_CXX_WORKS else CC_IS_CXX=0 fi diff --git a/tests/glr-regression.at b/tests/glr-regression.at index a826a5e3..1ab92238 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -18,9 +18,9 @@ AT_BANNER([[GLR Regression Tests]]) -## --------------------------- ## -## Badly Collapsed GLR States. ## -## --------------------------- ## +## ---------------------------- ## +## Badly Collapsed GLR States. ## +## ---------------------------- ## AT_SETUP([Badly Collapsed GLR States]) @@ -67,7 +67,7 @@ static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1) return 0; } -const char *input = NULL; +const char *input = YY_NULL; int main (int argc, const char* argv[]) @@ -105,9 +105,9 @@ E -> E 'P' E AT_CLEANUP -## ------------------------------------------------------------ ## -## Improper handling of embedded actions and $-N in GLR parsers ## -## ------------------------------------------------------------ ## +## -------------------------------------------------------------- ## +## Improper handling of embedded actions and $-N in GLR parsers. ## +## -------------------------------------------------------------- ## AT_SETUP([Improper handling of embedded actions and dollar(-N) in GLR parsers]) @@ -236,9 +236,9 @@ AT_PARSER_CHECK([[./glr-regr2a input3.txt]], 0, AT_CLEANUP -## ------------------------------------------------------------ ## -## Improper merging of GLR delayed action sets ## -## ------------------------------------------------------------ ## +## --------------------------------------------- ## +## Improper merging of GLR delayed action sets. ## +## --------------------------------------------- ## AT_SETUP([Improper merging of GLR delayed action sets]) @@ -355,10 +355,10 @@ AT_PARSER_CHECK([[./glr-regr3 input.txt]], AT_CLEANUP -## ------------------------------------------------------------------------- ## -## Duplicate representation of merged trees. See ## -## . ## -## ------------------------------------------------------------------------- ## +## ---------------------------------------------------------------------- ## +## Duplicate representation of merged trees. See ## +## . ## +## ---------------------------------------------------------------------- ## AT_SETUP([Duplicate representation of merged trees]) @@ -446,10 +446,10 @@ AT_PARSER_CHECK([[./glr-regr4]], 0, AT_CLEANUP -## -------------------------------------------------------------------------- ## -## User destructor for unresolved GLR semantic value. See ## -## . ## -## -------------------------------------------------------------------------- ## +## ------------------------------------------------------------------------- ## +## User destructor for unresolved GLR semantic value. See ## +## . ## +## ------------------------------------------------------------------------- ## AT_SETUP([User destructor for unresolved GLR semantic value]) @@ -506,10 +506,10 @@ AT_PARSER_CHECK([[./glr-regr5]], 0, [], AT_CLEANUP -## -------------------------------------------------------------------------- ## -## User destructor after an error during a split parse. See ## -## . ## -## -------------------------------------------------------------------------- ## +## ------------------------------------------------------------------------- ## +## User destructor after an error during a split parse. See ## +## . ## +## ------------------------------------------------------------------------- ## AT_SETUP([User destructor after an error during a split parse]) @@ -561,7 +561,7 @@ AT_CLEANUP ## ------------------------------------------------------------------------- ## -## Duplicated user destructor for lookahead. See ## +## Duplicated user destructor for lookahead. See ## ## . ## ## ------------------------------------------------------------------------- ## @@ -744,7 +744,7 @@ AT_CLEANUP ## ------------------------------------------------------------------------- ## -## No users destructors if stack 0 deleted. See ## +## No users destructors if stack 0 deleted. See ## ## . ## ## ------------------------------------------------------------------------- ## @@ -821,9 +821,9 @@ AT_PARSER_CHECK([[./glr-regr9]], 0, [], AT_CLEANUP -## ------------------------------------------------------------------------- ## -## Corrupted semantic options if user action cuts parse. ## -## ------------------------------------------------------------------------- ## +## ------------------------------------------------------ ## +## Corrupted semantic options if user action cuts parse. ## +## ------------------------------------------------------ ## AT_SETUP([Corrupted semantic options if user action cuts parse]) @@ -875,9 +875,9 @@ AT_PARSER_CHECK([[./glr-regr10]], 0, [], []) AT_CLEANUP -## ------------------------------------------------------------------------- ## -## Undesirable destructors if user action cuts parse. ## -## ------------------------------------------------------------------------- ## +## --------------------------------------------------- ## +## Undesirable destructors if user action cuts parse. ## +## --------------------------------------------------- ## AT_SETUP([Undesirable destructors if user action cuts parse]) @@ -933,9 +933,9 @@ AT_PARSER_CHECK([[./glr-regr11]], 0, [], []) AT_CLEANUP -## ------------------------------------------------------------------------- ## -## Leaked semantic values if user action cuts parse. ## -## ------------------------------------------------------------------------- ## +## -------------------------------------------------- ## +## Leaked semantic values if user action cuts parse. ## +## -------------------------------------------------- ## AT_SETUP([Leaked semantic values if user action cuts parse]) @@ -1181,9 +1181,9 @@ start <- defstate_init defstate_shift 'b': AT_CLEANUP -## ------------------------------------------------------------------------- ## -## Incorrect lookahead during nondeterministic GLR. ## -## ------------------------------------------------------------------------- ## +## ------------------------------------------------- ## +## Incorrect lookahead during nondeterministic GLR. ## +## ------------------------------------------------- ## AT_SETUP([Incorrect lookahead during nondeterministic GLR]) @@ -1398,9 +1398,9 @@ start <- merge 'c' stack_explosion: AT_CLEANUP -## ------------------------------------------------------------------------- ## -## Leaked semantic values when reporting ambiguity. ## -## ------------------------------------------------------------------------- ## +## ------------------------------------------------- ## +## Leaked semantic values when reporting ambiguity. ## +## ------------------------------------------------- ## AT_SETUP([Leaked semantic values when reporting ambiguity]) @@ -1480,9 +1480,9 @@ AT_PARSER_CHECK([[./glr-regr15]], 0, [], AT_CLEANUP -## ------------------------------------------------------------------------- ## -## Leaked lookahead after nondeterministic parse syntax error. ## -## ------------------------------------------------------------------------- ## +## ------------------------------------------------------------ ## +## Leaked lookahead after nondeterministic parse syntax error. ## +## ------------------------------------------------------------ ## AT_SETUP([Leaked lookahead after nondeterministic parse syntax error]) @@ -1540,9 +1540,9 @@ AT_PARSER_CHECK([[./glr-regr16]], 0, [], AT_CLEANUP -## ------------------------------------------------------------------------- ## -## Uninitialized location when reporting ambiguity. ## -## ------------------------------------------------------------------------- ## +## ------------------------------------------------- ## +## Uninitialized location when reporting ambiguity. ## +## ------------------------------------------------- ## AT_SETUP([Uninitialized location when reporting ambiguity]) @@ -1618,9 +1618,9 @@ AT_PARSER_CHECK([[./glr-regr17]], 0, [], AT_CLEANUP -## -------------------------------------------------------------## -## Missed %merge type warnings when LHS type is declared later. ## -## -------------------------------------------------------------## +## ------------------------------------------------------------- ## +## Missed %merge type warnings when LHS type is declared later. ## +## ------------------------------------------------------------- ## AT_SETUP([Missed %merge type warnings when LHS type is declared later]) diff --git a/tests/input.at b/tests/input.at index 7f5fb887..5e5b1e8f 100644 --- a/tests/input.at +++ b/tests/input.at @@ -169,42 +169,109 @@ l: INT | INT { $$ = $1; } INT { $$ = $2 + $< _AT_UNUSED_VALUES_DECLARATIONS]) ) -AT_BISON_CHECK(m4_ifval($2, [ --warnings=midrule-values ])[ input.y], [0], [], -[[input.y:11.10-32: warning: unset value: $]$[ [-Wother] -input.y:11.10-32: warning: unused value: $]1[ [-Wother] -input.y:11.10-32: warning: unused value: $]3[ [-Wother] -input.y:11.10-32: warning: unused value: $]5[ [-Wother] +AT_BISON_CHECK(m4_ifval($2, [--warnings=midrule-values ])[-fcaret input.y], + [0], [], +[[input.y:11.10-32: warning: unset value: $][$ [-Wother] + a: INT | INT { } INT { } INT { }; + ^^^^^^^^^^^^^^^^^^^^^^^ +input.y:11.10-12: warning: unused value: $][1 [-Wother] + a: INT | INT { } INT { } INT { }; + ^^^ +input.y:11.18-20: warning: unused value: $][3 [-Wother] + a: INT | INT { } INT { } INT { }; + ^^^ +input.y:11.26-28: warning: unused value: $][5 [-Wother] + a: INT | INT { } INT { } INT { }; + ^^^ input.y:12.9: warning: empty rule for typed nonterminal, and no action [-Wother] -]]m4_ifval($2, [[[input.y:13.14-20: warning: unset value: $$ [-Wmidrule-values] -input.y:13.26-41: warning: unset value: $$ [-Wmidrule-values] -]]])[[input.y:13.10-62: warning: unset value: $]$[ [-Wother] -input.y:13.10-62: warning: unused value: $]3[ [-Wother] -input.y:13.10-62: warning: unused value: $]5[ [-Wother] -]]m4_ifval($2, [[[input.y:14.14-16: warning: unset value: $$ [-Wmidrule-values] -]]])[[input.y:14.10-49: warning: unset value: $]$[ [-Wother] -input.y:14.10-49: warning: unused value: $]3[ [-Wother] -input.y:14.10-49: warning: unused value: $]5[ [-Wother] -input.y:15.10-37: warning: unset value: $]$[ [-Wother] -input.y:15.10-37: warning: unused value: $]3[ [-Wother] -input.y:15.10-37: warning: unused value: $]5[ [-Wother] -input.y:17.10-58: warning: unset value: $]$[ [-Wother] -input.y:17.10-58: warning: unused value: $]1[ [-Wother] -]]m4_ifval($2, [[[input.y:17.10-58: warning: unused value: $]2[ [-Wmidrule-values] -]]])[[input.y:17.10-58: warning: unused value: $]3[ [-Wother] -]]m4_ifval($2, [[[input.y:17.10-58: warning: unused value: $]4[ [-Wmidrule-values] -]]])[[input.y:17.10-58: warning: unused value: $]5[ [-Wother] -input.y:18.10-72: warning: unset value: $]$[ [-Wother] -input.y:18.10-72: warning: unused value: $]1[ [-Wother] -input.y:18.10-72: warning: unused value: $]3[ [-Wother] -]]m4_ifval($2, [[[input.y:18.10-72: warning: unused value: $]4[ [-Wmidrule-values] -]]])[[input.y:18.10-72: warning: unused value: $]5[ [-Wother] -]]m4_ifval($2, [[[input.y:20.10-55: warning: unused value: $]3[ [-Wmidrule-values] -]]])[[input.y:21.10-68: warning: unset value: $]$[ [-Wother] -input.y:21.10-68: warning: unused value: $]1[ [-Wother] -input.y:21.10-68: warning: unused value: $]2[ [-Wother] -]]m4_ifval($2, [[[input.y:21.10-68: warning: unused value: $]4[ [-Wmidrule-values] -]]]))]) - + b: INT | /* empty */; + ^ +]]m4_ifval($2, [[[input.y:13.14-20: warning: unset value: $][$ [-Wmidrule-values] + c: INT | INT { $][1; } INT { $2; } INT { $4; }; + ^^^^^^^ +input.y:13.26-41: warning: unset value: $][$ [-Wmidrule-values] + c: INT | INT { $][1; } INT { $2; } INT { $4; }; + ^^^^^^^^^^^^^^^^ +]]])[[input.y:13.10-62: warning: unset value: $][$ [-Wother] + c: INT | INT { $][1; } INT { $2; } INT { $4; }; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +input.y:13.22-24: warning: unused value: $][3 [-Wother] + c: INT | INT { $][1; } INT { $2; } INT { $4; }; + ^^^ +input.y:13.43-45: warning: unused value: $][5 [-Wother] + c: INT | INT { $][1; } INT { $2; } INT { $4; }; + ^^^ +]]m4_ifval($2, [[[input.y:14.14-16: warning: unset value: $][$ [-Wmidrule-values] + d: INT | INT { } INT { $][1; } INT { $2; }; + ^^^ +]]])[[input.y:14.10-49: warning: unset value: $][$ [-Wother] + d: INT | INT { } INT { $][1; } INT { $2; }; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +input.y:14.18-20: warning: unused value: $][3 [-Wother] + d: INT | INT { } INT { $][1; } INT { $2; }; + ^^^ +input.y:14.30-32: warning: unused value: $][5 [-Wother] + d: INT | INT { } INT { $][1; } INT { $2; }; + ^^^ +input.y:15.10-37: warning: unset value: $][$ [-Wother] + e: INT | INT { } INT { } INT { $][1; }; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +input.y:15.18-20: warning: unused value: $][3 [-Wother] + e: INT | INT { } INT { } INT { $][1; }; + ^^^ +input.y:15.27-29: warning: unused value: $][5 [-Wother] + e: INT | INT { } INT { } INT { $][1; }; + ^^^ +input.y:17.10-58: warning: unset value: $][$ [-Wother] + g: INT | INT { $$; } INT { $$; } INT { }; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +input.y:17.10-12: warning: unused value: $][1 [-Wother] + g: INT | INT { $$; } INT { $$; } INT { }; + ^^^ +]]m4_ifval($2, [[[input.y:17.14-29: warning: unused value: $][2 [-Wmidrule-values] + g: INT | INT { $$; } INT { $$; } INT { }; + ^^^^^^^^^^^^^^^^ +]]])[[input.y:17.31-33: warning: unused value: $][3 [-Wother] + g: INT | INT { $$; } INT { $$; } INT { }; + ^^^ +]]m4_ifval($2, [[[input.y:17.35-50: warning: unused value: $][4 [-Wmidrule-values] + g: INT | INT { $$; } INT { $$; } INT { }; + ^^^^^^^^^^^^^^^^ +]]])[[input.y:17.52-54: warning: unused value: $][5 [-Wother] + g: INT | INT { $$; } INT { $$; } INT { }; + ^^^ +input.y:18.10-72: warning: unset value: $][$ [-Wother] + h: INT | INT { $$; } INT { $$ = $2; } INT { }; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +input.y:18.10-12: warning: unused value: $][1 [-Wother] + h: INT | INT { $$; } INT { $$ = $2; } INT { }; + ^^^ +input.y:18.31-33: warning: unused value: $][3 [-Wother] + h: INT | INT { $$; } INT { $$ = $2; } INT { }; + ^^^ +]]m4_ifval($2, [[[input.y:18.35-64: warning: unused value: $][4 [-Wmidrule-values] + h: INT | INT { $$; } INT { $$ = $2; } INT { }; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +]]])[[input.y:18.66-68: warning: unused value: $][5 [-Wother] + h: INT | INT { $$; } INT { $$ = $2; } INT { }; + ^^^ +]]m4_ifval($2, [[[input.y:20.18-37: warning: unused value: $][3 [-Wmidrule-values] + j: INT | INT INT { $$ = 1; } { $][$ = $][1 + $][2; }; + ^^^^^^^^^^^^^^^^^^^^ +]]])[[input.y:21.10-68: warning: unset value: $][$ [-Wother] + k: INT | INT INT { $$; } { $$ = $3; } { }; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +input.y:21.10-12: warning: unused value: $][1 [-Wother] + k: INT | INT INT { $$; } { $$ = $3; } { }; + ^^^ +input.y:21.14-16: warning: unused value: $][2 [-Wother] + k: INT | INT INT { $$; } { $$ = $3; } { }; + ^^^ +]]m4_ifval($2, [[[input.y:21.35-64: warning: unused value: $][4 [-Wmidrule-values] + k: INT | INT INT { $$; } { $$ = $3; } { }; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +]]])) +]) ## --------------- ## ## Unused values. ## @@ -465,7 +532,7 @@ tagged: { } ; AT_BISON_CHECK([input.y], [0], [], [[input.y:6.8-45: warning: unset value: $$ [-Wother] -input.y:6.8-45: warning: unused value: $2 [-Wother] +input.y:6.12-14: warning: unused value: $2 [-Wother] input.y:7.6-8: warning: unset value: $$ [-Wother] ]]) @@ -481,7 +548,7 @@ tagged: { } ; ]]) AT_BISON_CHECK([input.y], [0], [], -[[input.y:6.8-45: warning: unused value: $4 [-Wother] +[[input.y:6.23-28: warning: unused value: $4 [-Wother] input.y:8.9-11: warning: unset value: $$ [-Wother] ]]) @@ -506,7 +573,7 @@ end: { } ; AT_BISON_CHECK([input.y], [0], [], [[input.y:6.8-22: warning: unset value: $$ [-Wother] -input.y:6.8-22: warning: unused value: $2 [-Wother] +input.y:6.12-14: warning: unused value: $2 [-Wother] input.y:7.6-8: warning: unset value: $$ [-Wother] ]]) diff --git a/tests/local.at b/tests/local.at index 121dedf2..f7a64710 100644 --- a/tests/local.at +++ b/tests/local.at @@ -581,9 +581,7 @@ m4_define([AT_QUELL_VALGRIND], # otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT # with trailing .o removed, and ".c" appended. m4_define([AT_COMPILE], -[AT_CHECK([case $POSIXLY_CORRECT_IS_EXPORTED:$C_COMPILER_POSIXLY_CORRECT in - true:false) echo 'cannot compile properly with POSIXLY_CORRECT' && exit 77;; -esac]) +[AT_CHECK([$BISON_C_WORKS], 0, ignore, ignore) AT_CHECK(m4_join([ ], [$CC $CFLAGS $CPPFLAGS], [m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])], diff --git a/tests/synclines.at b/tests/synclines.at index 751db7c6..2fc74fe0 100644 --- a/tests/synclines.at +++ b/tests/synclines.at @@ -54,7 +54,7 @@ m4_define([AT_SYNCLINES_COMPILE], # #error "1" # ^ # -# And possibly distcc adds its bits. +# Possibly distcc adds its bits. # # distcc[33187] ERROR: compile (null) on localhost failed # syncline.c:1:2: error: #error "1" @@ -71,11 +71,18 @@ m4_define([AT_SYNCLINES_COMPILE], # #error "1" # ^ # 1 error generated. +# +# When c++ is used to compiler C, we might have more messages (Clang 3.2): +# +# clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated + AT_CHECK([[$PERL -p -0777 - stderr <<\EOF # 1. Remove useless lines. # distcc clutter. s/^distcc\[\d+\] .*\n//gm; + # c vs. c++. + s/^clang: warning: treating 'c' input as 'c\+\+'.*\n//gm; # Function context. s/^[^:]*: In function '[^']+':\n//gm; # Caret error.