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
This commit is contained in:
Theophile Ranquet
2012-12-10 17:01:55 +01:00
18 changed files with 611 additions and 278 deletions

View File

@@ -1 +1 @@
2.6.5 2.6.90

103
NEWS
View File

@@ -247,51 +247,67 @@ GNU Bison NEWS
The introduction of this feature, in 2.4, was four years ago. The --language The introduction of this feature, in 2.4, was four years ago. The --language
option and the %language directive are no longer experimental. 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 Warnings about uninitialized yylloc in yyparse have been fixed.
documentation):
** Diagnostics are improved
*** Changes in the format of error messages
This used to be the format of many error reports:
input.y:2.7-12: %type redeclaration for exp
input.y:1.7-12: previous declaration
It is now:
input.y:2.7-12: error: %type redeclaration for exp
input.y:1.7-12: previous declaration
*** New format for error reports: carets
Caret errors have been added to Bison:
input.y:2.7-12: error: %type redeclaration for exp
%type <sval> exp
^^^^^^
input.y:1.7-12: previous declaration
%type <ival> exp
^^^^^^
or
input.y:3.20-23: error: ambiguous reference: '$exp' input.y:3.20-23: error: ambiguous reference: '$exp'
exp: exp '+' exp { $exp = $1 + $2; }; 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 The default behaviour for now is still not to display these unless
asked with -fall of -fcaret. However, in a later release, it will be made the explictly asked with -fcaret (or -fall). However, in a later release, it
default behavior (but may still be deactivated with -fno-caret). will be made the default behavior (but may still be deactivated with
-fno-caret).
** New value for %define variable: api.pure full ** New value for %define variable: api.pure full
The %define variable api.pure requests a pure (reentrant) parser. However, The %define variable api.pure requests a pure (reentrant) parser. However,
for historical reasons, using it in a location-tracking Yacc parser resulted for historical reasons, using it in a location-tracking Yacc parser
in an yyerror function that did not take a location as a parameter. With this resulted in a yyerror function that did not take a location as a
new value, the user may request a better pure parser, where yyerror does take parameter. With this new value, the user may request a better pure parser,
a location as a parameter (in location-tracking parsers). 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 The use of "%define api.pure true" is deprecated in favor of this new
"%define api.pure full". "%define api.pure full".
** Changes in the format of error messages
This used to be the format of many error reports:
foo.y:5.10-24: result type clash on merge function 'merge': <t3> != <t2>
foo.y:4.13-27: previous declaration
It is now:
foo.y:5.10-25: result type clash on merge function 'merge': <t3> != <t2>
foo.y:4.13-27: previous declaration
** 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.
** New %define variable: api.location.type (glr.cc, lalr1.cc, lalr1.java) ** New %define variable: api.location.type (glr.cc, lalr1.cc, lalr1.java)
The %define variable api.location.type defines the name of the type to use The %define variable api.location.type defines the name of the type to use
@@ -311,6 +327,15 @@ GNU Bison NEWS
position_type are deprecated in favor of api.location.type and position_type are deprecated in favor of api.location.type and
api.position.type. 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 ** Graph improvements in DOT and XSLT
The graphical presentation of the states is more readable: their shape is 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 These changes are present in both --graph output and xml2dot.xsl XSLT
processing, with minor (documented) differences. processing, with minor (documented) differences.
Two nodes were added to the documentation: Xml and Graphviz. ** %language is no longer an experimental feature.
* Noteworthy changes in release ?.? (????-??-??) [?] The introduction of this feature, in 2.4, was four years ago. The
--language option and the %language directive are no longer experimental.
** Bug fixes
Warnings about uninitialized yylloc in yyparse have been fixed.
** Documentation ** Documentation
The sections about shift/reduce and reduce/reduce conflicts resolution The sections about shift/reduce and reduce/reduce conflicts resolution
have been fixed and extended. 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] * Noteworthy changes in release 2.6.5 (2012-11-07) [stable]
We consider compiler warnings about Bison generated parsers to be bugs. We consider compiler warnings about Bison generated parsers to be bugs.

1
cfg.mk
View File

@@ -77,6 +77,7 @@ $(call exclude, \
prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$ \ prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$ \
prohibit_always-defined_macros+=?|^tests/regression.at$$ \ prohibit_always-defined_macros+=?|^tests/regression.at$$ \
prohibit_defined_have_decl_tests=?|^lib/timevar.c$$ \ 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=^doc/bison.texi$$ \
prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$ \ prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$ \
prohibit_strcmp=^doc/bison\.texi$$ \ prohibit_strcmp=^doc/bison\.texi$$ \

View File

@@ -60,6 +60,20 @@ AC_PROG_CXX
# Gnulib (early checks). # Gnulib (early checks).
gl_EARLY 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], AC_ARG_ENABLE([gcc-warnings],
[ --enable-gcc-warnings turn on lots of GCC warnings (not recommended)], [ --enable-gcc-warnings turn on lots of GCC warnings (not recommended)],
[case $enable_gcc_warnings in [case $enable_gcc_warnings in
@@ -69,9 +83,8 @@ AC_ARG_ENABLE([gcc-warnings],
[enable_gcc_warnings=no]) [enable_gcc_warnings=no])
if test "$enable_gcc_warnings" = yes; then if test "$enable_gcc_warnings" = yes; then
warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align
-Wcast-qual -Wformat -Wpointer-arith -Wwrite-strings' -Wformat -Wpointer-arith -Wwrite-strings'
warn_c='-Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes warn_c='-Wbad-function-cast -Wshadow -Wstrict-prototypes'
-Wshadow -Wstrict-prototypes'
warn_cxx='-Wnoexcept' warn_cxx='-Wnoexcept'
AC_LANG_PUSH([C]) AC_LANG_PUSH([C])
@@ -92,12 +105,21 @@ if test "$enable_gcc_warnings" = yes; then
gl_WARN_ADD([$i], [WARN_CFLAGS]) gl_WARN_ADD([$i], [WARN_CFLAGS])
done done
gl_WARN_ADD([-Werror], [WERROR_CFLAGS]) 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. # Warnings for the test suite only.
gl_WARN_ADD([-Wundef], [WARN_CFLAGS_TEST]) gl_WARN_ADD([-Wundef], [WARN_CFLAGS_TEST])
gl_WARN_ADD([-pedantic], [WARN_CFLAGS_TEST]) gl_WARN_ADD([-pedantic], [WARN_CFLAGS_TEST])
CFLAGS=$save_CFLAGS CFLAGS=$save_CFLAGS
AC_LANG_POP([C]) AC_LANG_POP([C])
AC_LANG_PUSH([C++]) AC_LANG_PUSH([C++])
save_CXXFLAGS=$CXXFLAGS save_CXXFLAGS=$CXXFLAGS
gl_WARN_ADD([-Werror=unknown-warning-option], [CXXFLAGS]) gl_WARN_ADD([-Werror=unknown-warning-option], [CXXFLAGS])
@@ -118,8 +140,9 @@ if test "$enable_gcc_warnings" = yes; then
fi fi
BISON_TEST_FOR_WORKING_C_COMPILER BISON_TEST_FOR_WORKING_C_COMPILER
BISON_TEST_FOR_WORKING_CXX_COMPILER
BISON_C_COMPILER_POSIXLY_CORRECT BISON_C_COMPILER_POSIXLY_CORRECT
BISON_TEST_FOR_WORKING_CXX_COMPILER
BISON_CXX_COMPILER_POSIXLY_CORRECT
AC_ARG_ENABLE([yacc], AC_ARG_ENABLE([yacc],
[AC_HELP_STRING([--disable-yacc], [AC_HELP_STRING([--disable-yacc],

View File

@@ -211,6 +211,12 @@ Defining Language Semantics
This says when, why and how to use the exceptional This says when, why and how to use the exceptional
action in the middle of a rule. 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 Tracking Locations
* Location Type:: Specifying a data type for 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 @node Grammar Outline
@section Outline of a Bison Grammar @section Outline of a Bison Grammar
@cindex comment
@findex // @dots{}
@findex /* @dots{} */
A Bison grammar file has four main sections, shown here with the A Bison grammar file has four main sections, shown here with the
appropriate delimiters: appropriate delimiters:
@@ -2810,8 +2819,8 @@ appropriate delimiters:
@end example @end example
Comments enclosed in @samp{/* @dots{} */} may appear in any of the sections. Comments enclosed in @samp{/* @dots{} */} may appear in any of the sections.
As a GNU extension, @samp{//} introduces a comment that As a GNU extension, @samp{//} introduces a comment that continues until end
continues until end of line. of line.
@menu @menu
* Prologue:: Syntax and usage of the prologue. * 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 These actions are written just like usual end-of-rule actions, but they
are executed before the parser even recognizes the following components. 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 A mid-rule action may refer to the components preceding it using
@code{$@var{n}}, but it may not refer to subsequent components because @code{$@var{n}}, but it may not refer to subsequent components because
it is run before they are parsed. it is run before they are parsed.
@@ -3831,10 +3849,16 @@ remove it afterward. Here is how it is done:
@example @example
@group @group
stmt: stmt:
LET '(' var ')' "let" '(' var ')'
@{ $<context>$ = push_context (); declare_variable ($3); @} @{
$<context>$ = push_context ();
declare_variable ($3);
@}
stmt stmt
@{ $$ = $6; pop_context ($<context>5); @} @{
$$ = $6;
pop_context ($<context>5);
@}
@end group @end group
@end example @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{context} in the data-type union. Then it calls
@code{declare_variable} to add the new variable to that list. Once the @code{declare_variable} to add the new variable to that list. Once the
first action is finished, the embedded statement @code{stmt} can be first action is finished, the embedded statement @code{stmt} can be
parsed. Note that the mid-rule action is component number 5, so the parsed.
@samp{stmt} is component number 6.
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 ')'
@{
$<context>let = push_context ();
declare_variable ($3);
@}[let]
stmt
@{
$$ = $6;
pop_context ($<context>let);
@}
@end group
@end example
After the embedded statement is parsed, its semantic value becomes the After the embedded statement is parsed, its semantic value becomes the
value of the entire @code{let}-statement. Then the semantic value from the value of the entire @code{let}-statement. Then the semantic value from the
@@ -3880,13 +3923,13 @@ stmt:
let stmt let stmt
@{ @{
$$ = $2; $$ = $2;
pop_context ($1); pop_context ($let);
@}; @};
let: let:
LET '(' var ')' "let" '(' var ')'
@{ @{
$$ = push_context (); $let = push_context ();
declare_variable ($3); 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 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. 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 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 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, 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 Now Bison can execute the action in the rule for @code{subroutine} without
deciding which rule for @code{compound} it will eventually use. deciding which rule for @code{compound} it will eventually use.
@node Tracking Locations @node Tracking Locations
@section Tracking Locations @section Tracking Locations
@cindex location @cindex location
@@ -5524,8 +5638,8 @@ I.e., if @samp{%locations %define api.pure} is passed then the prototypes for
@code{yyerror} are: @code{yyerror} are:
@example @example
void yyerror (char const *msg); /* Yacc parsers. */ void yyerror (char const *msg); // Yacc parsers.
void yyerror (YYLTYPE *locp, char const *msg); /* GLR parsers. */ void yyerror (YYLTYPE *locp, char const *msg); // GLR parsers.
@end example @end example
But if @samp{%locations %define api.pure %parse-param @{int *nastiness@}} is But if @samp{%locations %define api.pure %parse-param @{int *nastiness@}} is
@@ -6662,7 +6776,6 @@ Actions}).
@end deffn @end deffn
@deffn {Value} @@$ @deffn {Value} @@$
@findex @@$
Acts like a structure variable containing information on the textual Acts like a structure variable containing information on the textual
location of the grouping made by the current rule. @xref{Tracking location of the grouping made by the current rule. @xref{Tracking
Locations}. Locations}.
@@ -6721,7 +6834,7 @@ GNU Automake.
@item @item
@cindex bison-i18n.m4 @cindex bison-i18n.m4
Into the directory containing the GNU Autoconf macros used 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 @file{bison-i18n.m4} file installed by Bison under
@samp{share/aclocal/bison-i18n.m4} in Bison's installation directory. @samp{share/aclocal/bison-i18n.m4} in Bison's installation directory.
For example: For example:
@@ -8526,8 +8639,26 @@ clear the flag.
Developing a parser can be a challenge, especially if you don't understand Developing a parser can be a challenge, especially if you don't understand
the algorithm (@pxref{Algorithm, ,The Bison Parser Algorithm}). This the algorithm (@pxref{Algorithm, ,The Bison Parser Algorithm}). This
chapter explains how to generate and read the detailed description of the chapter explains how understand and debug a parser.
automaton, and how to enable and understand the parser run-time traces.
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 @menu
* Understanding:: Understanding the structure of your parser. * 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}) As documented elsewhere (@pxref{Algorithm, ,The Bison Parser Algorithm})
Bison parsers are @dfn{shift/reduce automata}. In some cases (much more Bison parsers are @dfn{shift/reduce automata}. In some cases (much more
frequent than one would hope), looking at this automaton is required to frequent than one would hope), looking at this automaton is required to
tune or simply fix a parser. Bison provides two different tune or simply fix a parser.
representation of it, either textually or graphically (as a DOT file).
The textual file is generated when the options @option{--report} or The textual file is generated when the options @option{--report} or
@option{--verbose} are specified, see @ref{Invocation, , Invoking @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 @example
%token NUM STR %token NUM STR
@group
%left '+' '-' %left '+' '-'
%left '*' %left '*'
@end group
%% %%
@group
exp: exp:
exp '+' exp exp '+' exp
| exp '-' exp | exp '-' exp
@@ -8567,6 +8700,7 @@ exp:
| exp '/' exp | exp '/' exp
| NUM | NUM
; ;
@end group
useless: STR; useless: STR;
%% %%
@end example @end example
@@ -8576,8 +8710,8 @@ useless: STR;
@example @example
calc.y: warning: 1 nonterminal useless in grammar calc.y: warning: 1 nonterminal useless in grammar
calc.y: warning: 1 rule useless in grammar calc.y: warning: 1 rule useless in grammar
calc.y:11.1-7: warning: nonterminal useless in grammar: useless calc.y:12.1-7: warning: nonterminal useless in grammar: useless
calc.y:11.10-12: warning: rule useless in grammar: useless: STR calc.y:12.10-12: warning: rule useless in grammar: useless: STR
calc.y: conflicts: 7 shift/reduce calc.y: conflicts: 7 shift/reduce
@end example @end example
@@ -8671,7 +8805,7 @@ item is a production rule together with a point (@samp{.}) marking
the location of the input cursor. the location of the input cursor.
@example @example
state 0 State 0
0 $accept: . exp $end 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: @option{--report=itemset} to list the derived items as well:
@example @example
state 0 State 0
0 $accept: . exp $end 0 $accept: . exp $end
1 exp: . exp '+' exp 1 exp: . exp '+' exp
@@ -8719,7 +8853,7 @@ state 0
In the state 1@dots{} In the state 1@dots{}
@example @example
state 1 State 1
5 exp: NUM . 5 exp: NUM .
@@ -8729,11 +8863,11 @@ state 1
@noindent @noindent
the rule 5, @samp{exp: NUM;}, is completed. Whatever the lookahead token the rule 5, @samp{exp: NUM;}, is completed. Whatever the lookahead token
(@samp{$default}), the parser will reduce it. If it was coming from (@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}). jump to state 2 (@samp{exp: go to state 2}).
@example @example
state 2 State 2
0 $accept: exp . $end 0 $accept: exp . $end
1 exp: exp . '+' exp 1 exp: exp . '+' exp
@@ -8761,7 +8895,7 @@ The state 3 is named the @dfn{final state}, or the @dfn{accepting
state}: state}:
@example @example
state 3 State 3
0 $accept: exp $end . 0 $accept: exp $end .
@@ -8776,7 +8910,7 @@ The interpretation of states 4 to 7 is straightforward, and is left to
the reader. the reader.
@example @example
state 4 State 4
1 exp: exp '+' . exp 1 exp: exp '+' . exp
@@ -8785,7 +8919,7 @@ state 4
exp go to state 8 exp go to state 8
state 5 State 5
2 exp: exp '-' . exp 2 exp: exp '-' . exp
@@ -8794,7 +8928,7 @@ state 5
exp go to state 9 exp go to state 9
state 6 State 6
3 exp: exp '*' . exp 3 exp: exp '*' . exp
@@ -8803,7 +8937,7 @@ state 6
exp go to state 10 exp go to state 10
state 7 State 7
4 exp: exp '/' . exp 4 exp: exp '/' . exp
@@ -8816,7 +8950,7 @@ As was announced in beginning of the report, @samp{State 8 conflicts:
1 shift/reduce}: 1 shift/reduce}:
@example @example
state 8 State 8
1 exp: exp . '+' exp 1 exp: exp . '+' exp
1 | 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: @option{--report=lookahead}, Bison specifies these lookahead tokens:
@example @example
state 8 State 8
1 exp: exp . '+' exp 1 exp: exp . '+' exp
1 | exp '+' exp . [$end, '+', '-', '/'] 1 | exp '+' exp . [$end, '+', '-', '/']
@@ -8891,7 +9025,7 @@ The remaining states are similar:
@example @example
@group @group
state 9 State 9
1 exp: exp . '+' exp 1 exp: exp . '+' exp
2 | exp . '-' exp 2 | exp . '-' exp
@@ -8907,7 +9041,7 @@ state 9
@end group @end group
@group @group
state 10 State 10
1 exp: exp . '+' exp 1 exp: exp . '+' exp
2 | exp . '-' exp 2 | exp . '-' exp
@@ -8922,7 +9056,7 @@ state 10
@end group @end group
@group @group
state 11 State 11
1 exp: exp . '+' exp 1 exp: exp . '+' exp
2 | exp . '-' exp 2 | exp . '-' exp
@@ -8945,12 +9079,11 @@ state 11
@noindent @noindent
Observe that state 11 contains conflicts not only due to the lack of Observe that state 11 contains conflicts not only due to the lack of
precedence of @samp{/} with respect to @samp{+}, @samp{-}, and precedence of @samp{/} with respect to @samp{+}, @samp{-}, and @samp{*}, but
@samp{*}, but also because the also because the associativity of @samp{/} is not specified.
associativity of @samp{/} is not specified.
Note that Bison may also produce an HTML version of this output, via an XML Bison may also produce an HTML version of this output, via an XML file and
file and XSLT processing (@pxref{Xml}). XSLT processing (@pxref{Xml,,Visualizing your parser in multiple formats}).
@c ================================================= Graphical Representation @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 (@pxref{Invocation, , Invoking Bison}). Its name is made by removing
@samp{.tab.c} or @samp{.c} from the parser implementation file name, and @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 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: The following grammar file, @file{rr.y}, will be used in the sequel:
@@ -8983,10 +9119,20 @@ b: "0";
@end group @end group
@end example @end example
The graphical output is very similar to the textual one, and as such it is The graphical output
easier understood by making direct comparisons between them. See @ifnotinfo
@ref{Debugging, , Debugging Your Parser} for a detailled analysis of the (see @ref{fig:graph})
textual report. @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 @subheading Graphical Representation of States
@@ -9011,7 +9157,7 @@ shift. The following describes a reduction in the @file{rr.output} file:
@example @example
@group @group
state 3 State 3
1 exp: a . ";" 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}: This is how reductions are represented in the verbose file @file{rr.output}:
@example @example
state 1 State 1
3 a: "0" . [";"] 3 a: "0" . [";"]
4 b: "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 are distinguished by a red filling color on these nodes, just like how they are
reported between square brackets in the verbose file. reported between square brackets in the verbose file.
The reduction corresponding to the rule number 0 is the acceptation state. It The reduction corresponding to the rule number 0 is the acceptation
is shown as a blue diamond, labelled "Acc". state. It is shown as a blue diamond, labelled ``Acc''.
@subheading Graphical representation of go tos @subheading Graphical representation of go tos
The @samp{go to} jump transitions are represented as dotted lines bearing The @samp{go to} jump transitions are represented as dotted lines bearing
the name of the rule being jumped to. 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 @c ================================================= XML
@node Xml @node Xml
@@ -9069,8 +9212,10 @@ processing (@pxref{Xml}).
@cindex xml @cindex xml
Bison supports two major report formats: textual output Bison supports two major report formats: textual output
(@pxref{Understanding}) when invoked with option @option{--verbose}, and DOT (@pxref{Understanding, ,Understanding Your Parser}) when invoked
(@pxref{Graphviz}) when invoked with option @option{--graph}. However, 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 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 @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 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 XSLT have no difference whatsoever with those obtained by invoking
@command{bison} with options @option{--verbose} or @option{--graph}. @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}. @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} 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. 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 @item xml2dot.xsl
Used to output a copy of the DOT visualization of the automaton. Used to output a copy of the DOT visualization of the automaton.
@item xml2text.xsl @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 @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 @end table
Sample usage (requires @code{xsltproc}): Sample usage (requires @command{xsltproc}):
@example @example
$ bison -x input.y $ bison -x gr.y
@group @group
$ bison --print-datadir $ bison --print-datadir
/usr/local/share/bison /usr/local/share/bison
@end group @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 @end example
@c ================================================= Tracing @c ================================================= Tracing
@@ -9302,7 +9447,7 @@ Entering state 24
@noindent @noindent
The previous reduction demonstrates the @code{%printer} directive for The previous reduction demonstrates the @code{%printer} directive for
@code{<val>}: both the token @code{NUM} and the resulting non-terminal @code{<val>}: both the token @code{NUM} and the resulting nonterminal
@code{exp} have @samp{1} as value. @code{exp} have @samp{1} as value.
@example @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 @option{-fdiagnostics-show-caret}, or Clang's @option{-fcaret-diagnotics}. The
location provided with the message is used to quote the corresponding line of 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 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 @example
%type <ival> exp %type <ival> exp
@@ -9629,27 +9774,27 @@ When invoked with @option{-fcaret}, Bison will report:
@example @example
@group @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; @}; exp: exp '+' exp @{ $exp = $1 + $2; @};
^^^^ ^^^^
@end group @end group
@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; @}; exp: exp '+' exp @{ $exp = $1 + $2; @};
^^^ ^^^
@end group @end group
@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; @}; exp: exp '+' exp @{ $exp = $1 + $2; @};
^^^ ^^^
@end group @end group
@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; @}; exp: exp '+' exp @{ $exp = $1 + $2; @};
^^^ ^^^
@end group @end group
@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; @}; exp: exp '+' exp @{ $exp = $1 + $2; @};
^^ ^^
@end group @end group
@@ -12040,18 +12185,23 @@ In an action, the location of the left-hand side of the rule.
@end deffn @end deffn
@deffn {Variable} @@@var{n} @deffn {Variable} @@@var{n}
@deffnx {Symbol} @@@var{n}
In an action, the location of the @var{n}-th symbol of the right-hand side In an action, the location of the @var{n}-th symbol of the right-hand side
of the rule. @xref{Tracking Locations}. 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 @end deffn
@deffn {Variable} @@@var{name} @deffn {Variable} @@@var{name}
In an action, the location of a symbol addressed by name. @xref{Tracking @deffnx {Variable} @@[@var{name}]
Locations}. In an action, the location of a symbol addressed by @var{name}.
@xref{Tracking Locations}.
@end deffn @end deffn
@deffn {Variable} @@[@var{name}] @deffn {Symbol} $@@@var{n}
In an action, the location of a symbol addressed by name. @xref{Tracking In a grammar, the Bison-generated nonterminal symbol for a mid-rule action
Locations}. with no semantical value. @xref{Mid-Rule Action Translation}.
@end deffn @end deffn
@deffn {Variable} $$ @deffn {Variable} $$
@@ -12065,12 +12215,8 @@ right-hand side of the rule. @xref{Actions}.
@end deffn @end deffn
@deffn {Variable} $@var{name} @deffn {Variable} $@var{name}
In an action, the semantic value of a symbol addressed by name. @deffnx {Variable} $[@var{name}]
@xref{Actions}. In an action, the semantic value of a symbol addressed by @var{name}.
@end deffn
@deffn {Variable} $[@var{name}]
In an action, the semantic value of a symbol addressed by name.
@xref{Actions}. @xref{Actions}.
@end deffn @end deffn
@@ -12101,8 +12247,9 @@ More user feedback will help to determine whether it should become a permanent
feature. feature.
@end deffn @end deffn
@deffn {Construct} /*@dots{}*/ @deffn {Construct} /* @dots{} */
Comment delimiters, as in C. @deffnx {Construct} // @dots{}
Comments, as in C/C++.
@end deffn @end deffn
@deffn {Delimiter} : @deffn {Delimiter} :
@@ -12587,7 +12734,7 @@ Data type of semantic values; @code{int} by default.
@item Accepting state @item Accepting state
A state whose only action is the accept action. A state whose only action is the accept action.
The accepting state is thus a consistent state. 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'') @item Backus-Naur Form (BNF; also called ``Backus Normal Form'')
Formal method of specifying context-free grammars originally proposed Formal method of specifying context-free grammars originally proposed

35
doc/figs/example.dot Normal file
View File

@@ -0,0 +1,35 @@
// Generated by GNU Bison 2.6.90.
// Report bugs to <bug-bison@gnu.org>.
// Home page: <http://www.gnu.org/software/bison/>.
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]
}

4
doc/figs/example.y Normal file
View File

@@ -0,0 +1,4 @@
%%
exp: a ";" | b ".";
a: "0";
b: "0";

View File

@@ -24,6 +24,7 @@ AC_DEFUN([BISON_TEST_FOR_WORKING_C_COMPILER], [
int test_array[CHAR_BIT];]])], int test_array[CHAR_BIT];]])],
[], [],
[AC_MSG_FAILURE([cannot compile a simple C program])]) [AC_MSG_FAILURE([cannot compile a simple C program])])
AC_SUBST([BISON_C_WORKS], [:])
]) ])
# BISON_CHECK_WITH_POSIXLY_CORRECT(CODE) # BISON_CHECK_WITH_POSIXLY_CORRECT(CODE)
@@ -47,25 +48,32 @@ case $gl_had_POSIXLY_CORRECT in
esac esac
]) ])
# BISON_C_COMPILER_POSIXLY_CORRECT # BISON_LANG_COMPILER_POSIXLY_CORRECT
# -------------------------------- # -----------------------------------
# Whether the compiler supports -g in POSIXLY_CORRECT mode. clang-2.9 # Whether the compiler for the current language supports -g in
# on OS X does not, because "clang-mp-2.9 -o test -g test.c" launches # POSIXLY_CORRECT mode. clang-2.9 on OS X does not, because
# "/usr/bin/dsymutil test -o test.dSYM" which fails with "error: # "clang-mp-2.9 -o test -g test.c" launches "/usr/bin/dsymutil test -o
# unable to open executable '-o'". # test.dSYM" which fails with "error: unable to open executable '-o'".
# #
# Sets C_COMPILER_POSIXLY_CORRECT to true/false. # Sets <LANG>_COMPILER_POSIXLY_CORRECT to true/false.
AC_DEFUN([BISON_C_COMPILER_POSIXLY_CORRECT], AC_DEFUN([BISON_LANG_COMPILER_POSIXLY_CORRECT],
[AC_CACHE_CHECK([whether $CC supports POSIXLY_CORRECT=1], [AC_CACHE_CHECK([whether $_AC_CC supports POSIXLY_CORRECT=1],
[bison_cv_cc_supports_posixly_correct], [bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct],
[BISON_CHECK_WITH_POSIXLY_CORRECT( [BISON_CHECK_WITH_POSIXLY_CORRECT(
[AC_LANG_PUSH([C]) [AC_LINK_IFELSE([AC_LANG_PROGRAM],
AC_LINK_IFELSE([AC_LANG_PROGRAM], [bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct=yes],
[bison_cv_cc_supports_posixly_correct=yes], [bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct=no])])])
[bison_cv_cc_supports_posixly_correct=no]) case $bison_cv_[]_AC_LANG_ABBREV[]_supports_posixly_correct in
AC_LANG_POP([C])])]) yes) AC_SUBST(_AC_LANG_PREFIX[_COMPILER_POSIXLY_CORRECT], [true]) ;;
case $bison_cv_cc_supports_posixly_correct in no) AC_SUBST(_AC_LANG_PREFIX[_COMPILER_POSIXLY_CORRECT], [false]);;
yes) AC_SUBST([C_COMPILER_POSIXLY_CORRECT], [true]) ;;
no) AC_SUBST([C_COMPILER_POSIXLY_CORRECT], [false]);;
esac esac
]) ])
# BISON_C_COMPILER_POSIXLY_CORRECT
# --------------------------------
# Whether the C compiler supports -g in POSIXLY_CORRECT mode.
AC_DEFUN([BISON_C_COMPILER_POSIXLY_CORRECT],
[AC_LANG_PUSH([C])
BISON_LANG_COMPILER_POSIXLY_CORRECT
AC_LANG_POP([C])
])

View File

@@ -58,3 +58,12 @@ AC_DEFUN([BISON_TEST_FOR_WORKING_CXX_COMPILER],
AC_SUBST([BISON_CXX_WORKS]) AC_SUBST([BISON_CXX_WORKS])
AM_CONDITIONAL(BISON_CXX_WORKS, test $bison_cv_cxx_works = yes) 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++])
])

View File

@@ -21,18 +21,12 @@
# error "FLEX_PREFIX not defined" # error "FLEX_PREFIX not defined"
#endif #endif
/* Whether this version of Flex is (strictly) greater than /* Flex full version as a number. */
Major.Minor.Subminor. */ #define FLEX_VERSION \
#ifdef YY_FLEX_SUBMINOR_VERSION ((YY_FLEX_MAJOR_VERSION) * 1000000 \
# define FLEX_VERSION \ + (YY_FLEX_MINOR_VERSION) * 1000 \
(YY_FLEX_MAJOR_VERSION) * 1000000 \ + (YY_FLEX_SUBMINOR_VERSION))
+ (YY_FLEX_MINOR_VERSION) * 1000 \
+ (YY_FLEX_SUBMINOR_VERSION)
#else
# define FLEX_VERSION \
(YY_FLEX_MAJOR_VERSION) * 1000000 \
+ (YY_FLEX_MINOR_VERSION) * 1000
#endif
/* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used. */ /* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used. */
# if FLEX_VERSION <= 2005031 # if FLEX_VERSION <= 2005031
int FLEX_PREFIX (get_lineno) (void); int FLEX_PREFIX (get_lineno) (void);

View File

@@ -143,15 +143,13 @@ location_print (FILE *out, location loc)
same file all over for each error. */ same file all over for each error. */
struct caret_info struct caret_info
{ {
FILE* source; FILE *source;
size_t line; size_t line;
size_t offset; size_t offset;
}; };
static struct caret_info caret_info = { NULL, 1, 0 }; 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 void
cleanup_caret () cleanup_caret ()
{ {
@@ -159,11 +157,10 @@ cleanup_caret ()
fclose (caret_info.source); fclose (caret_info.source);
} }
/* Output to OUT the line and caret corresponding to location LOC. */
void void
location_caret (FILE *out, location loc) 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. */ file. That would make the procedure future-proof. */
if (! (caret_info.source if (! (caret_info.source
|| (caret_info.source = fopen (loc.start.file, "r"))) || (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. */ /* Advance to the line's position, keeping track of the offset. */
{ while (caret_info.line < loc.start.line)
int i; caret_info.line += fgetc (caret_info.source) == '\n';
for (i = caret_info.line; i < loc.start.line; caret_info.offset++) caret_info.offset = ftell (caret_info.source);
if (fgetc (caret_info.source) == '\n')
++i;
}
caret_info.line = loc.start.line;
/* Read the actual line. Don't update the offset, so that we keep a pointer /* Read the actual line. Don't update the offset, so that we keep a pointer
to the start of the line. */ to the start of the line. */
{ {
ssize_t len = 0;
char *buf = NULL; 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. */ /* The caret of a multiline location ends with the first line. */
int end = loc.start.line != loc.end.line ? len : loc.end.column; int end = loc.start.line != loc.end.line ? len : loc.end.column;
if (len) /* Quote the file, indent by a single column. */
{ fputc (' ', out);
int i = loc.start.column; fwrite (buf, 1, len, out);
/* Quote the file, indent by a single column. */
fputc (' ', out);
fwrite (buf, 1, len, out);
/* Print the caret, with the same indent as above. */ /* Print the caret, with the same indent as above. */
fputc (' ', out); fprintf (out, " %*s", loc.start.column - 1, "");
fprintf (out, "%*s", loc.start.column - 1, ""); {
do { int i = loc.start.column;
fputc ('^', out); do
} while (++i < end); fputc ('^', out);
} while (++i < end);
}
fputc ('\n', out); fputc ('\n', out);
free (buf);
} }
free (buf);
} }
} }

View File

@@ -326,9 +326,9 @@ grammar_rule_check (const symbol_list *r)
{ {
warnings warn_flag = midrule_warning ? Wmidrule_values : Wother; warnings warn_flag = midrule_warning ? Wmidrule_values : Wother;
if (n) if (n)
complain (&r->location, warn_flag, _("unused value: $%d"), n); complain (&l->location, warn_flag, _("unused value: $%d"), n);
else else
complain (&r->location, warn_flag, _("unset value: $$")); complain (&l->location, warn_flag, _("unset value: $$"));
} }
} }
} }

View File

@@ -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 %destructor for type <*> [-Wother]
input.y:24.70-72: warning: useless %printer 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: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,, 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] input.y:33.3-23: warning: unset value: $$ [-Wother]
{ @$ = 4; } // Only used. { @$ = 4; } // Only used.
^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
input.y:30.3-35.37: warning: unused value: $3 [-Wother] input.y:32.3-23: warning: unused value: $3 [-Wother]
{ @$ = 1; } // Not set or used. { USE ($$); @$ = 3; } // Only set.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
]]) ]])
AT_COMPILE([input]) AT_COMPILE([input])

View File

@@ -19,6 +19,15 @@
# We need `config.h'. # We need `config.h'.
CPPFLAGS="-I$abs_top_builddir/lib @CPPFLAGS@" 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. ## ## C/C++ Compilation. ##
## ------------------- ## ## ------------------- ##
@@ -44,12 +53,24 @@ NO_STRICT_ALIAS_CXXFLAGS='@NO_STRICT_ALIAS_CXXFLAGS@'
# If 'exit 77'; skip all C++ tests; otherwise ':'. # If 'exit 77'; skip all C++ tests; otherwise ':'.
BISON_CXX_WORKS='@BISON_CXX_WORKS@' 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. # Handle --compile-c-with-cxx here, once CXX and CXXFLAGS are known.
if "$at_arg_compile_c_with_cxx"; then if "$at_arg_compile_c_with_cxx"; then
CC_IS_CXX=1 CC_IS_CXX=1
CC=$CXX CC=$CXX
NO_WERROR_CFLAGS=$NO_WERROR_CXXFLAGS NO_WERROR_CFLAGS=$NO_WERROR_CXXFLAGS
CFLAGS=$CXXFLAGS CFLAGS=$CXXFLAGS
BISON_C_WORKS=$BISON_CXX_WORKS
else else
CC_IS_CXX=0 CC_IS_CXX=0
fi fi

View File

@@ -18,9 +18,9 @@
AT_BANNER([[GLR Regression Tests]]) AT_BANNER([[GLR Regression Tests]])
## --------------------------- ## ## ---------------------------- ##
## Badly Collapsed GLR States. ## ## Badly Collapsed GLR States. ##
## --------------------------- ## ## ---------------------------- ##
AT_SETUP([Badly Collapsed GLR States]) AT_SETUP([Badly Collapsed GLR States])
@@ -67,7 +67,7 @@ static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1)
return 0; return 0;
} }
const char *input = NULL; const char *input = YY_NULL;
int int
main (int argc, const char* argv[]) main (int argc, const char* argv[])
@@ -105,9 +105,9 @@ E -> E 'P' E
AT_CLEANUP 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]) 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 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]) AT_SETUP([Improper merging of GLR delayed action sets])
@@ -355,10 +355,10 @@ AT_PARSER_CHECK([[./glr-regr3 input.txt]],
AT_CLEANUP AT_CLEANUP
## ------------------------------------------------------------------------- ## ## ---------------------------------------------------------------------- ##
## Duplicate representation of merged trees. See ## ## Duplicate representation of merged trees. See ##
## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>. ## ## <http://lists.gnu.org/archive/html/help-bison/2005-07/msg00013.html>. ##
## ------------------------------------------------------------------------- ## ## ---------------------------------------------------------------------- ##
AT_SETUP([Duplicate representation of merged trees]) AT_SETUP([Duplicate representation of merged trees])
@@ -446,10 +446,10 @@ AT_PARSER_CHECK([[./glr-regr4]], 0,
AT_CLEANUP AT_CLEANUP
## -------------------------------------------------------------------------- ## ## ------------------------------------------------------------------------- ##
## User destructor for unresolved GLR semantic value. See ## ## User destructor for unresolved GLR semantic value. See ##
## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>. ## ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00016.html>. ##
## -------------------------------------------------------------------------- ## ## ------------------------------------------------------------------------- ##
AT_SETUP([User destructor for unresolved GLR semantic value]) AT_SETUP([User destructor for unresolved GLR semantic value])
@@ -506,10 +506,10 @@ AT_PARSER_CHECK([[./glr-regr5]], 0, [],
AT_CLEANUP AT_CLEANUP
## -------------------------------------------------------------------------- ## ## ------------------------------------------------------------------------- ##
## User destructor after an error during a split parse. See ## ## User destructor after an error during a split parse. See ##
## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>. ## ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00029.html>. ##
## -------------------------------------------------------------------------- ## ## ------------------------------------------------------------------------- ##
AT_SETUP([User destructor after an error during a split parse]) 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 ##
## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>. ## ## <http://lists.gnu.org/archive/html/bison-patches/2005-08/msg00035.html>. ##
## ------------------------------------------------------------------------- ## ## ------------------------------------------------------------------------- ##
@@ -744,7 +744,7 @@ AT_CLEANUP
## ------------------------------------------------------------------------- ## ## ------------------------------------------------------------------------- ##
## No users destructors if stack 0 deleted. See ## ## No users destructors if stack 0 deleted. See ##
## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>. ## ## <http://lists.gnu.org/archive/html/bison-patches/2005-09/msg00109.html>. ##
## ------------------------------------------------------------------------- ## ## ------------------------------------------------------------------------- ##
@@ -821,9 +821,9 @@ AT_PARSER_CHECK([[./glr-regr9]], 0, [],
AT_CLEANUP 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]) AT_SETUP([Corrupted semantic options if user action cuts parse])
@@ -875,9 +875,9 @@ AT_PARSER_CHECK([[./glr-regr10]], 0, [], [])
AT_CLEANUP 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]) AT_SETUP([Undesirable destructors if user action cuts parse])
@@ -933,9 +933,9 @@ AT_PARSER_CHECK([[./glr-regr11]], 0, [], [])
AT_CLEANUP 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]) AT_SETUP([Leaked semantic values if user action cuts parse])
@@ -1181,9 +1181,9 @@ start <- defstate_init defstate_shift 'b':
AT_CLEANUP AT_CLEANUP
## ------------------------------------------------------------------------- ## ## ------------------------------------------------- ##
## Incorrect lookahead during nondeterministic GLR. ## ## Incorrect lookahead during nondeterministic GLR. ##
## ------------------------------------------------------------------------- ## ## ------------------------------------------------- ##
AT_SETUP([Incorrect lookahead during nondeterministic GLR]) AT_SETUP([Incorrect lookahead during nondeterministic GLR])
@@ -1398,9 +1398,9 @@ start <- merge 'c' stack_explosion:
AT_CLEANUP AT_CLEANUP
## ------------------------------------------------------------------------- ## ## ------------------------------------------------- ##
## Leaked semantic values when reporting ambiguity. ## ## Leaked semantic values when reporting ambiguity. ##
## ------------------------------------------------------------------------- ## ## ------------------------------------------------- ##
AT_SETUP([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 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]) AT_SETUP([Leaked lookahead after nondeterministic parse syntax error])
@@ -1540,9 +1540,9 @@ AT_PARSER_CHECK([[./glr-regr16]], 0, [],
AT_CLEANUP AT_CLEANUP
## ------------------------------------------------------------------------- ## ## ------------------------------------------------- ##
## Uninitialized location when reporting ambiguity. ## ## Uninitialized location when reporting ambiguity. ##
## ------------------------------------------------------------------------- ## ## ------------------------------------------------- ##
AT_SETUP([Uninitialized location when reporting ambiguity]) AT_SETUP([Uninitialized location when reporting ambiguity])
@@ -1618,9 +1618,9 @@ AT_PARSER_CHECK([[./glr-regr17]], 0, [],
AT_CLEANUP 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]) AT_SETUP([Missed %merge type warnings when LHS type is declared later])

View File

@@ -169,42 +169,109 @@ l: INT | INT { $<integer>$ = $<integer>1; } INT { $<integer>$ = $<integer>2 + $<
_AT_UNUSED_VALUES_DECLARATIONS]) _AT_UNUSED_VALUES_DECLARATIONS])
) )
AT_BISON_CHECK(m4_ifval($2, [ --warnings=midrule-values ])[ input.y], [0], [], AT_BISON_CHECK(m4_ifval($2, [--warnings=midrule-values ])[-fcaret input.y],
[[input.y:11.10-32: warning: unset value: $]$[ [-Wother] [0], [],
input.y:11.10-32: warning: unused value: $]1[ [-Wother] [[input.y:11.10-32: warning: unset value: $][$ [-Wother]
input.y:11.10-32: warning: unused value: $]3[ [-Wother] a: INT | INT { } INT { } INT { };
input.y:11.10-32: warning: unused value: $]5[ [-Wother] ^^^^^^^^^^^^^^^^^^^^^^^
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] 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] b: INT | /* empty */;
input.y:13.26-41: warning: unset value: $$ [-Wmidrule-values] ^
]]])[[input.y:13.10-62: warning: unset value: $]$[ [-Wother] ]]m4_ifval($2, [[[input.y:13.14-20: warning: unset value: $][$ [-Wmidrule-values]
input.y:13.10-62: warning: unused value: $]3[ [-Wother] c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
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:13.26-41: warning: unset value: $][$ [-Wmidrule-values]
]]])[[input.y:14.10-49: warning: unset value: $]$[ [-Wother] c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
input.y:14.10-49: warning: unused value: $]3[ [-Wother] ^^^^^^^^^^^^^^^^
input.y:14.10-49: warning: unused value: $]5[ [-Wother] ]]])[[input.y:13.10-62: warning: unset value: $][$ [-Wother]
input.y:15.10-37: warning: unset value: $]$[ [-Wother] c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
input.y:15.10-37: warning: unused value: $]3[ [-Wother] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
input.y:15.10-37: warning: unused value: $]5[ [-Wother] input.y:13.22-24: warning: unused value: $][3 [-Wother]
input.y:17.10-58: warning: unset value: $]$[ [-Wother] c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
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:13.43-45: warning: unused value: $][5 [-Wother]
]]])[[input.y:17.10-58: warning: unused value: $]3[ [-Wother] c: INT | INT { $][1; } INT { $<integer>2; } INT { $<integer>4; };
]]m4_ifval($2, [[[input.y:17.10-58: warning: unused value: $]4[ [-Wmidrule-values] ^^^
]]])[[input.y:17.10-58: warning: unused value: $]5[ [-Wother] ]]m4_ifval($2, [[[input.y:14.14-16: warning: unset value: $][$ [-Wmidrule-values]
input.y:18.10-72: warning: unset value: $]$[ [-Wother] d: INT | INT { } INT { $][1; } INT { $<integer>2; };
input.y:18.10-72: warning: unused value: $]1[ [-Wother] ^^^
input.y:18.10-72: warning: unused value: $]3[ [-Wother] ]]])[[input.y:14.10-49: warning: unset value: $][$ [-Wother]
]]m4_ifval($2, [[[input.y:18.10-72: warning: unused value: $]4[ [-Wmidrule-values] d: INT | INT { } INT { $][1; } INT { $<integer>2; };
]]])[[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:14.18-20: warning: unused value: $][3 [-Wother]
]]])[[input.y:21.10-68: warning: unset value: $]$[ [-Wother] d: INT | INT { } INT { $][1; } INT { $<integer>2; };
input.y:21.10-68: warning: unused value: $]1[ [-Wother] ^^^
input.y:21.10-68: warning: unused value: $]2[ [-Wother] input.y:14.30-32: warning: unused value: $][5 [-Wother]
]]m4_ifval($2, [[[input.y:21.10-68: warning: unused value: $]4[ [-Wmidrule-values] d: INT | INT { } INT { $][1; } INT { $<integer>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 { $<integer>$; } INT { $<integer>$; } INT { };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
input.y:17.10-12: warning: unused value: $][1 [-Wother]
g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
^^^
]]m4_ifval($2, [[[input.y:17.14-29: warning: unused value: $][2 [-Wmidrule-values]
g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
^^^^^^^^^^^^^^^^
]]])[[input.y:17.31-33: warning: unused value: $][3 [-Wother]
g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
^^^
]]m4_ifval($2, [[[input.y:17.35-50: warning: unused value: $][4 [-Wmidrule-values]
g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
^^^^^^^^^^^^^^^^
]]])[[input.y:17.52-54: warning: unused value: $][5 [-Wother]
g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
^^^
input.y:18.10-72: warning: unset value: $][$ [-Wother]
h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
input.y:18.10-12: warning: unused value: $][1 [-Wother]
h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
^^^
input.y:18.31-33: warning: unused value: $][3 [-Wother]
h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
^^^
]]m4_ifval($2, [[[input.y:18.35-64: warning: unused value: $][4 [-Wmidrule-values]
h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
]]])[[input.y:18.66-68: warning: unused value: $][5 [-Wother]
h: INT | INT { $<integer>$; } INT { $<integer>$ = $<integer>2; } INT { };
^^^
]]m4_ifval($2, [[[input.y:20.18-37: warning: unused value: $][3 [-Wmidrule-values]
j: INT | INT INT { $<integer>$ = 1; } { $][$ = $][1 + $][2; };
^^^^^^^^^^^^^^^^^^^^
]]])[[input.y:21.10-68: warning: unset value: $][$ [-Wother]
k: INT | INT INT { $<integer>$; } { $<integer>$ = $<integer>3; } { };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
input.y:21.10-12: warning: unused value: $][1 [-Wother]
k: INT | INT INT { $<integer>$; } { $<integer>$ = $<integer>3; } { };
^^^
input.y:21.14-16: warning: unused value: $][2 [-Wother]
k: INT | INT INT { $<integer>$; } { $<integer>$ = $<integer>3; } { };
^^^
]]m4_ifval($2, [[[input.y:21.35-64: warning: unused value: $][4 [-Wmidrule-values]
k: INT | INT INT { $<integer>$; } { $<integer>$ = $<integer>3; } { };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
]]]))
])
## --------------- ## ## --------------- ##
## Unused values. ## ## Unused values. ##
@@ -465,7 +532,7 @@ tagged: { } ;
AT_BISON_CHECK([input.y], [0], [], AT_BISON_CHECK([input.y], [0], [],
[[input.y:6.8-45: warning: unset value: $$ [-Wother] [[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] input.y:7.6-8: warning: unset value: $$ [-Wother]
]]) ]])
@@ -481,7 +548,7 @@ tagged: { } ;
]]) ]])
AT_BISON_CHECK([input.y], [0], [], 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] input.y:8.9-11: warning: unset value: $$ [-Wother]
]]) ]])
@@ -506,7 +573,7 @@ end: { } ;
AT_BISON_CHECK([input.y], [0], [], AT_BISON_CHECK([input.y], [0], [],
[[input.y:6.8-22: warning: unset value: $$ [-Wother] [[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] input.y:7.6-8: warning: unset value: $$ [-Wother]
]]) ]])

View File

@@ -581,9 +581,7 @@ m4_define([AT_QUELL_VALGRIND],
# otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT # otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT
# with trailing .o removed, and ".c" appended. # with trailing .o removed, and ".c" appended.
m4_define([AT_COMPILE], m4_define([AT_COMPILE],
[AT_CHECK([case $POSIXLY_CORRECT_IS_EXPORTED:$C_COMPILER_POSIXLY_CORRECT in [AT_CHECK([$BISON_C_WORKS], 0, ignore, ignore)
true:false) echo 'cannot compile properly with POSIXLY_CORRECT' && exit 77;;
esac])
AT_CHECK(m4_join([ ], AT_CHECK(m4_join([ ],
[$CC $CFLAGS $CPPFLAGS], [$CC $CFLAGS $CPPFLAGS],
[m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])], [m4_bmatch([$1], [[.]], [-c], [$LDFLAGS])],

View File

@@ -54,7 +54,7 @@ m4_define([AT_SYNCLINES_COMPILE],
# #error "1" # #error "1"
# ^ # ^
# #
# And possibly distcc adds its bits. # Possibly distcc adds its bits.
# #
# distcc[33187] ERROR: compile (null) on localhost failed # distcc[33187] ERROR: compile (null) on localhost failed
# syncline.c:1:2: error: #error "1" # syncline.c:1:2: error: #error "1"
@@ -71,11 +71,18 @@ m4_define([AT_SYNCLINES_COMPILE],
# #error "1" # #error "1"
# ^ # ^
# 1 error generated. # 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 AT_CHECK([[$PERL -p -0777 - stderr <<\EOF
# 1. Remove useless lines. # 1. Remove useless lines.
# distcc clutter. # distcc clutter.
s/^distcc\[\d+\] .*\n//gm; s/^distcc\[\d+\] .*\n//gm;
# c vs. c++.
s/^clang: warning: treating 'c' input as 'c\+\+'.*\n//gm;
# Function context. # Function context.
s/^[^:]*: In function '[^']+':\n//gm; s/^[^:]*: In function '[^']+':\n//gm;
# Caret error. # Caret error.