mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
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:
@@ -1 +1 @@
|
|||||||
2.6.5
|
2.6.90
|
||||||
|
|||||||
103
NEWS
103
NEWS
@@ -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
1
cfg.mk
@@ -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$$ \
|
||||||
|
|||||||
31
configure.ac
31
configure.ac
@@ -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],
|
||||||
|
|||||||
309
doc/bison.texi
309
doc/bison.texi
@@ -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
35
doc/figs/example.dot
Normal 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
4
doc/figs/example.y
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
%%
|
||||||
|
exp: a ";" | b ".";
|
||||||
|
a: "0";
|
||||||
|
b: "0";
|
||||||
@@ -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])
|
||||||
|
])
|
||||||
|
|||||||
@@ -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++])
|
||||||
|
])
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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: $$"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|
||||||
|
|||||||
143
tests/input.at
143
tests/input.at
@@ -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]
|
||||||
]])
|
]])
|
||||||
|
|
||||||
|
|||||||
@@ -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])],
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user