Compare commits

..
8 Commits
Author SHA1 Message Date
Valentin Tolmer c8c9212bbd news: new syntax (%gprec and %precr) 2013-08-01 15:56:00 +02:00
Valentin Tolmer d992a222af regen 2013-08-01 15:56:00 +02:00
Valentin Tolmer 86a2a43854 tests: new tests for %gprec and %precr
3 grammars: one typical, with normal test cases, one to display all the
warnings introduced, and one with the errors introduced.

* tests/conflicts.at: New
2013-08-01 15:24:52 +02:00
Valentin Tolmer d8de391c38 syntax: introducing %precr to add specific precedence relations
It is now possible to add specific precedence relations between two symbols,
or a symbol and a group, with the %precr keyword:

%gprec arith {
  %left '+' '-'
  %left '*' '/'
}
%gprec boolean {
  %left OR
  %left AND
}
%right '^'

%precr '^' > arith
%precr OR AND > '^'

Here, the symbol ^ is of higher priority than the the ones in arith, but of
lower priority than both OR and AND. OR and '+', for example, cannot be
compared.

* src/parse-gram.y, src/scan-gram.l: Lexer and grammar implementation of
%precr.
* src/symtab.c, src/symtab.h: implementation of the addition of single link
precedence relationships.
2013-08-01 15:24:52 +02:00
Valentin Tolmer f8a710c6f4 syntax: introducing %gprec for precedence groups
It is now possible to introduce precedence groups, with precedence
relationships inside the group, but not with the outside tokens.  Ex:

%gprec arith {
  %left '+' '-'
  %left '*' '/'
  %right '^'
}

%gprec {
  %left OR
  %left AND
}

%left OTHER
%precedence OTHER2

Here, the arithmetical operators (in the "arith" group) can be compared, the
boolean operators can be compared, but OTHER can only be compared to OTHER2.

* src/gram.c, src/gram.h, src/scan-gram.l, src/parse-gram.y: {} blocks after
%gprec are understood by the lexer
* src/parse-gram.y: New syntax
* tests/input.at, tests/regression.at: Fix due to lexer change
2013-08-01 15:24:52 +02:00
Valentin Tolmer 2d8fc07778 conflicts: switch to partial order precedence system
Even though it is not yet fully deployed, this commit lays the ground for
the partial order precedence system, by changing to a graph-based order and
introducing precedence groups (only the default one can be used for now).

* src/symtab.h (struct symbol): Removed extra fields
* src/symtab.h: New function declarations
* src/symtab.c: New functions for precedence and groups, new hash table for
groups
* src/AnnotationList.c, src/conflicts.c, src/gram.c, src/print-xml.c,
* src/symtab.c: Adaptation to the new prec_node structure
* tests/existing.at (GAWK LALR): Fix
2013-08-01 15:24:52 +02:00
Valentin Tolmer a910d26cfb introduction of the new structures to prepare for partial order precedence
New structures: symgroup, prec_link, prec_node, and an enum of the
precedence relation operators.  Symbols have two more fields to prepare for
the precedence graph and grouping to come.

* src/symtab.h (struct symbol): Two new fields
* src/symtab.h: New structures
2013-08-01 15:24:52 +02:00
Valentin TolmerandAkim Demaille a728075710 symbols: improve symbol aliasing
Rather than having duplicate info in the symbol and the alias that has
to be resolved later on, both the symbol and the alias have a common
pointer to a separate structure containing this info.

* src/symtab.h (sym_content): New structure.
* src/symtab.c (sym_content_new, sym_content_free, symbol_free): New

* src/AnnotationList.c, src/conflicts.c, src/gram.c, src/gram.h,
* src/graphviz.c, src/ielr.c, src/output.c, src/parse-gram.y, src/print.c
* src/print-xml.c, src/print_graph.c, src/reader.c, src/reduce.c,
* src/state.h, src/symlist.c, src/symtab.c, src/symtab.h, src/tables.c:
Adjust.

* tests/input.at: Fix expectations (order changes).
2013-08-01 12:49:51 +02:00
79 changed files with 2622 additions and 1925 deletions
+1 -10
View File
@@ -1,16 +1,7 @@
*.eps
*.log
*.o
*.pdf
*.png
*.stamp
*.trs
*~
.deps
.dirstamp
/*.cache /*.cache
/*.flc /*.flc
/*.prj /*.prj
/*~
/.tarball-version /.tarball-version
/.version /.version
/ABOUT-NLS /ABOUT-NLS
+1 -1
View File
@@ -1 +1 @@
3.0.1 3.0
+22 -48
View File
@@ -1,59 +1,33 @@
GNU Bison NEWS GNU Bison NEWS
* Noteworthy changes in release 3.0.2 (2013-12-05) [stable] * Noteworthy changes in release ?.? (????-??-??) [?]
** Bug fixes ** New syntax: partial-order precedence relationships
*** Generated source files when errors are reported Formerly, the precedence order of tokens was linear, depending only on the
order in which they were declared. With the new syntax, all the tokens are
not necessarily comparable. It is possible to declare a group of tokens with
no links outside of the group, and to later on add only those needed.
The uncomparability of tokens would allow for more feedback on new conflicts
silently resolved via precedence.
When warnings are issued and -Werror is set, bison would still generate An example of the new syntax applied to arithmetic and boolean operators,
the source files (*.c, *.h...). As a consequence, some runs of "make" with '^' serving as both numerical power and boolean XOR:
could fail the first time, but not the second (as the files were generated
anyway).
This is fixed: bison no longer generates this source files, but, of %gprec arith {
course, still produces the various reports (*.output, *.xml, etc.). %left '+' '-'
%left '*' '/'
}
%gprec bool {
%left OR
%left AND
}
%gprec { %right '^' }
*** %empty is used in reports %precr '^' > arith
%precr OR AND > '^'
Empty right-hand sides are denoted by '%empty' in all the reports (text, Here, AND is not comparable with '+', but '^' > '+' and AND > '^'
dot, XML and formats derived from it).
*** YYERROR and variants
When C++ variant support is enabled, an error triggered via YYERROR, but
not caught via error recovery, resulted in a double deletion.
* Noteworthy changes in release 3.0.1 (2013-11-12) [stable]
** Bug fixes
*** Errors in caret diagnostics
On some platforms, some errors could result in endless diagnostics.
*** Fixes of the -Werror option
Options such as "-Werror -Wno-error=foo" were still turning "foo"
diagnostics into errors instead of warnings. This is fixed.
Actually, for consistency with GCC, "-Wno-error=foo -Werror" now also
leaves "foo" diagnostics as warnings. Similarly, with "-Werror=foo
-Wno-error", "foo" diagnostics are now errors.
*** GLR Predicates
As demonstrated in the documentation, one can now leave spaces between
"%?" and its "{".
*** Installation
The yacc.1 man page is no longer installed if --disable-yacc was
specified.
*** Fixes in the test suite
Bugs and portability issues.
* Noteworthy changes in release 3.0 (2013-07-25) [stable] * Noteworthy changes in release 3.0 (2013-07-25) [stable]
-9
View File
@@ -62,22 +62,13 @@ tools we depend upon, including:
- Gettext <http://www.gnu.org/software/gettext/> - Gettext <http://www.gnu.org/software/gettext/>
- Graphviz <http://www.graphviz.org> - Graphviz <http://www.graphviz.org>
- Gzip <http://www.gnu.org/software/gzip/> - Gzip <http://www.gnu.org/software/gzip/>
- Help2man <http://www.gnu.org/software/help2man/>
- Perl <http://www.cpan.org/> - Perl <http://www.cpan.org/>
- Rsync <http://samba.anu.edu.au/rsync/> - Rsync <http://samba.anu.edu.au/rsync/>
- Tar <http://www.gnu.org/software/tar/> - Tar <http://www.gnu.org/software/tar/>
- Texinfo <http://www.gnu.org/software/texinfo/>
Valgrind <http://valgrind.org/> is also highly recommended, if it supports Valgrind <http://valgrind.org/> is also highly recommended, if it supports
your architecture. your architecture.
If you're using a GNU/Linux distribution, the easiest way to install the
above packages depends on your system. The following shell command should
work for Debian-based systems such as Ubuntu:
sudo apt-get install \
autoconf automake autopoint flex graphviz help2man texinfo valgrind
Bison is written using Bison grammars, so there are bootstrapping issues. Bison is written using Bison grammars, so there are bootstrapping issues.
The bootstrap script attempts to discover when the C code generated from the The bootstrap script attempts to discover when the C code generated from the
grammars is out of date, and to bootstrap with an out-of-date version of the grammars is out of date, and to bootstrap with an out-of-date version of the
-5
View File
@@ -31,7 +31,6 @@ Cris van Pelt [email protected]
Csaba Raduly [email protected] Csaba Raduly [email protected]
Dagobert Michelsen [email protected] Dagobert Michelsen [email protected]
Daniel Frużyński [email protected] Daniel Frużyński [email protected]
Daniel Galloway [email protected]
Daniel Hagerty [email protected] Daniel Hagerty [email protected]
David J. MacKenzie [email protected] David J. MacKenzie [email protected]
David Kastrup [email protected] David Kastrup [email protected]
@@ -66,7 +65,6 @@ Johan van Selst [email protected]
Jonathan Fabrizio [email protected] Jonathan Fabrizio [email protected]
Jonathan Nieder [email protected] Jonathan Nieder [email protected]
Juan Manuel Guerrero [email protected] Juan Manuel Guerrero [email protected]
Ken Moffat [email protected]
Kees Zeelenberg [email protected] Kees Zeelenberg [email protected]
Keith Browne [email protected] Keith Browne [email protected]
Laurent Mascherpa [email protected] Laurent Mascherpa [email protected]
@@ -80,7 +78,6 @@ Martin Mokrejs [email protected]
Martin Nylin [email protected] Martin Nylin [email protected]
Matt Kraai [email protected] Matt Kraai [email protected]
Matt Rosing [email protected] Matt Rosing [email protected]
Michael Felt [email protected]
Michael Hayes [email protected] Michael Hayes [email protected]
Michael Raskin [email protected] Michael Raskin [email protected]
Michiel De Wilde [email protected] Michiel De Wilde [email protected]
@@ -96,7 +93,6 @@ Odd Arild Olsen [email protected]
Oleg Smolsky [email protected] Oleg Smolsky [email protected]
Oleksii Taran [email protected] Oleksii Taran [email protected]
Paolo Bonzini [email protected] Paolo Bonzini [email protected]
Paolo Simone Gasparello [email protected]
Pascal Bart [email protected] Pascal Bart [email protected]
Paul Eggert [email protected] Paul Eggert [email protected]
Paul Hilfinger [email protected] Paul Hilfinger [email protected]
@@ -113,7 +109,6 @@ R Blake [email protected]
Raja R Harinath [email protected] Raja R Harinath [email protected]
Ralf Wildenhues [email protected] Ralf Wildenhues [email protected]
Richard Stallman [email protected] Richard Stallman [email protected]
Rici Lake [email protected]
Rob Vermaas [email protected] Rob Vermaas [email protected]
Robert Anisko [email protected] Robert Anisko [email protected]
Rob Conde [email protected] Rob Conde [email protected]
+26 -28
View File
@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Print a version string. # Print a version string.
scriptversion=2013-08-15.22; # UTC scriptversion=2013-07-03.20; # UTC
# Bootstrap this package from checked-out sources. # Bootstrap this package from checked-out sources.
@@ -209,16 +209,12 @@ bootstrap_sync=false
# Use git to update gnulib sources # Use git to update gnulib sources
use_git=true use_git=true
check_exists() {
($1 --version </dev/null) >/dev/null 2>&1
test $? -lt 126
}
# find_tool ENVVAR NAMES... # find_tool ENVVAR NAMES...
# ------------------------- # -------------------------
# Search for a required program. Use the value of ENVVAR, if set, # Search for a required program. Use the value of ENVVAR, if set,
# otherwise find the first of the NAMES that can be run. # otherwise find the first of the NAMES that can be run (i.e.,
# If found, set ENVVAR to the program name, die otherwise. # supports --version). If found, set ENVVAR to the program name,
# die otherwise.
# #
# FIXME: code duplication, see also gnu-web-doc-update. # FIXME: code duplication, see also gnu-web-doc-update.
find_tool () find_tool ()
@@ -228,21 +224,27 @@ find_tool ()
find_tool_names=$@ find_tool_names=$@
eval "find_tool_res=\$$find_tool_envvar" eval "find_tool_res=\$$find_tool_envvar"
if test x"$find_tool_res" = x; then if test x"$find_tool_res" = x; then
for i; do for i
if check_exists $i; then do
find_tool_res=$i if ($i --version </dev/null) >/dev/null 2>&1; then
break find_tool_res=$i
break
fi fi
done done
else
find_tool_error_prefix="\$$find_tool_envvar: "
fi fi
if test x"$find_tool_res" = x; then test x"$find_tool_res" != x \
warn_ "one of these is required: $find_tool_names;" || die "one of these is required: $find_tool_names"
die "alternatively set $find_tool_envvar to a compatible tool" ($find_tool_res --version </dev/null) >/dev/null 2>&1 \
fi || die "${find_tool_error_prefix}cannot run $find_tool_res --version"
eval "$find_tool_envvar=\$find_tool_res" eval "$find_tool_envvar=\$find_tool_res"
eval "export $find_tool_envvar" eval "export $find_tool_envvar"
} }
# Find sha1sum, named gsha1sum on MacPorts, and shasum on Mac OS X 10.6.
find_tool SHA1SUM sha1sum gsha1sum shasum
# Override the default configuration, if necessary. # Override the default configuration, if necessary.
# Make sure that bootstrap.conf is sourced from the current directory # Make sure that bootstrap.conf is sourced from the current directory
# if we were invoked as "sh bootstrap". # if we were invoked as "sh bootstrap".
@@ -324,7 +326,7 @@ insert_if_absent() {
die "Error: Duplicate entries in $file: " $duplicate_entries die "Error: Duplicate entries in $file: " $duplicate_entries
fi fi
linesold=$(gitignore_entries $file | wc -l) linesold=$(gitignore_entries $file | wc -l)
linesnew=$( { echo "$str"; cat $file; } | gitignore_entries | sort -u | wc -l) linesnew=$(echo "$str" | gitignore_entries - $file | sort -u | wc -l)
if [ $linesold != $linesnew ] ; then if [ $linesold != $linesnew ] ; then
{ echo "$str" | cat - $file > $file.bak && mv $file.bak $file; } \ { echo "$str" | cat - $file > $file.bak && mv $file.bak $file; } \
|| die "insert_if_absent $file $str: failed" || die "insert_if_absent $file $str: failed"
@@ -467,7 +469,8 @@ check_versions() {
if [ "$req_ver" = "-" ]; then if [ "$req_ver" = "-" ]; then
# Merely require app to exist; not all prereq apps are well-behaved # Merely require app to exist; not all prereq apps are well-behaved
# so we have to rely on $? rather than get_version. # so we have to rely on $? rather than get_version.
if ! check_exists $app; then $app --version >/dev/null 2>&1
if [ 126 -le $? ]; then
warn_ "Error: '$app' not found" warn_ "Error: '$app' not found"
ret=1 ret=1
fi fi
@@ -500,12 +503,6 @@ print_versions() {
# can't depend on column -t # can't depend on column -t
} }
# Find sha1sum, named gsha1sum on MacPorts, shasum on Mac OS X 10.6.
# Also find the compatible sha1 utility on the BSDs
if test x"$SKIP_PO" = x; then
find_tool SHA1SUM sha1sum gsha1sum shasum sha1
fi
use_libtool=0 use_libtool=0
# We'd like to use grep -E, to see if any of LT_INIT, # We'd like to use grep -E, to see if any of LT_INIT,
# AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac, # AC_PROG_LIBTOOL, AM_PROG_LIBTOOL is used in configure.ac,
@@ -554,10 +551,10 @@ fi
echo "$0: Bootstrapping from checked-out $package sources..." echo "$0: Bootstrapping from checked-out $package sources..."
# See if we can use gnulib's git-merge-changelog merge driver. # See if we can use gnulib's git-merge-changelog merge driver.
if $use_git && test -d .git && check_exists git; then if $use_git && test -d .git && (git --version) >/dev/null 2>/dev/null ; then
if git config merge.merge-changelog.driver >/dev/null ; then if git config merge.merge-changelog.driver >/dev/null ; then
: :
elif check_exists git-merge-changelog; then elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
echo "$0: initializing git-merge-changelog driver" echo "$0: initializing git-merge-changelog driver"
git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver' git config merge.merge-changelog.name 'GNU-style ChangeLog merge driver'
git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B' git config merge.merge-changelog.driver 'git-merge-changelog %O %A %B'
@@ -695,10 +692,11 @@ update_po_files() {
cksum_file="$ref_po_dir/$po.s1" cksum_file="$ref_po_dir/$po.s1"
if ! test -f "$cksum_file" || if ! test -f "$cksum_file" ||
! test -f "$po_dir/$po.po" || ! test -f "$po_dir/$po.po" ||
! $SHA1SUM -c "$cksum_file" < "$new_po" > /dev/null 2>&1; then ! $SHA1SUM -c --status "$cksum_file" \
< "$new_po" > /dev/null; then
echo "$me: updated $po_dir/$po.po..." echo "$me: updated $po_dir/$po.po..."
cp "$new_po" "$po_dir/$po.po" \ cp "$new_po" "$po_dir/$po.po" \
&& $SHA1SUM < "$new_po" > "$cksum_file" || return && $SHA1SUM < "$new_po" > "$cksum_file"
fi fi
done done
} }
+1 -2
View File
@@ -34,8 +34,7 @@ gnulib_modules='
readme-release readme-release
realloc-posix realloc-posix
spawn-pipe stdbool stpcpy strdup-posix strerror strtoul strverscmp spawn-pipe stdbool stpcpy strdup-posix strerror strtoul strverscmp
unistd unistd-safer unlink unlocked-io unistd unistd-safer unlocked-io update-copyright unsetenv verify
update-copyright unsetenv verify
warnings warnings
xalloc xalloc
xalloc-die xalloc-die
+18 -10
View File
@@ -33,7 +33,11 @@ AC_DEFINE_UNQUOTED([PACKAGE_COPYRIGHT_YEAR], [$PACKAGE_COPYRIGHT_YEAR],
AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
# We use Automake 1.14's %D% and %C%. # Automake 1.10.3 and 1.11.1 fix a security flaw discussed here:
#
# http://thread.gmane.org/gmane.comp.sysutils.autotools.announce/131
#
# To avoid 1.11, we make 1.11.1 the minimum version.
# #
# We want gnits strictness only when rolling a stable release. For # We want gnits strictness only when rolling a stable release. For
# release candidates, we use version strings like 2.4.3_rc1, but gnits # release candidates, we use version strings like 2.4.3_rc1, but gnits
@@ -41,7 +45,7 @@ AC_CONFIG_MACRO_DIR([m4])
# releases, we want to be able run make dist without being required to # releases, we want to be able run make dist without being required to
# add a bogus NEWS entry. In that case, the version string # add a bogus NEWS entry. In that case, the version string
# automatically contains a dash, which we also let disable gnits. # automatically contains a dash, which we also let disable gnits.
AM_INIT_AUTOMAKE([1.14 dist-xz nostdinc AM_INIT_AUTOMAKE([1.11.1 dist-xz nostdinc
color-tests parallel-tests color-tests parallel-tests
silent-rules] silent-rules]
m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]], m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]],
@@ -78,7 +82,7 @@ AC_ARG_ENABLE([gcc-warnings],
esac], esac],
[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 -Wdocumentation warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align
-Wformat -Wpointer-arith -Wwrite-strings' -Wformat -Wpointer-arith -Wwrite-strings'
warn_c='-Wbad-function-cast -Wshadow -Wstrict-prototypes' warn_c='-Wbad-function-cast -Wshadow -Wstrict-prototypes'
warn_cxx='-Wnoexcept' warn_cxx='-Wnoexcept'
@@ -157,17 +161,21 @@ AC_ARG_ENABLE([yacc],
[AC_HELP_STRING([--disable-yacc], [AC_HELP_STRING([--disable-yacc],
[do not build a yacc command or an -ly library])], [do not build a yacc command or an -ly library])],
, [enable_yacc=yes]) , [enable_yacc=yes])
AM_CONDITIONAL([ENABLE_YACC], [test "$enable_yacc" = yes]) case $enable_yacc in
yes)
YACC_SCRIPT=src/yacc
YACC_LIBRARY=lib/liby.a;;
*)
YACC_SCRIPT=
YACC_LIBRARY=;;
esac
AC_SUBST([YACC_SCRIPT])
AC_SUBST([YACC_LIBRARY])
# Checks for programs. # Checks for programs.
AM_MISSING_PROG([DOT], [dot]) AM_MISSING_PROG([DOT], [dot])
AC_PROG_LEX AC_PROG_LEX
$LEX_IS_FLEX || test "X$LEX" = X: || { $LEX_IS_FLEX || AC_MSG_ERROR([Flex is required])
AC_MSG_WARN([bypassing lex because flex is required])
LEX=:
}
AM_CONDITIONAL([FLEX_CXX_WORKS],
[$LEX_IS_FLEX && test $bison_cv_cxx_works = yes])
AC_PROG_YACC AC_PROG_YACC
AC_PROG_RANLIB AC_PROG_RANLIB
AC_PROG_GNU_M4 AC_PROG_GNU_M4
+12 -31
View File
@@ -205,32 +205,13 @@ m4_define([b4_table_value_equals],
# b4_attribute_define # b4_attribute_define
# ------------------- # -------------------
# Provide portable compiler "attributes". # Provide portability for __attribute__.
m4_define([b4_attribute_define], m4_define([b4_attribute_define],
[#ifndef YY_ATTRIBUTE [#ifndef __attribute__
# if (defined __GNUC__ \ /* This feature is available in gcc versions 2.5 and later. */
&& (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ # if (! defined __GNUC__ || __GNUC__ < 2 \
|| defined __SUNPRO_C && 0x5110 <= __SUNPRO_C || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
# define YY_ATTRIBUTE(Spec) __attribute__(Spec) # define __attribute__(Spec) /* empty */
# else
# define YY_ATTRIBUTE(Spec) /* empty */
# endif
#endif
#ifndef YY_ATTRIBUTE_PURE
# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
#endif
#ifndef YY_ATTRIBUTE_UNUSED
# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
#endif
#if !defined _Noreturn \
&& (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
# if defined _MSC_VER && 1200 <= _MSC_VER
# define _Noreturn __declspec (noreturn)
# else
# define _Noreturn YY_ATTRIBUTE ((__noreturn__))
# endif # endif
#endif #endif
@@ -269,14 +250,14 @@ m4_define([b4_attribute_define],
# b4_null_define # b4_null_define
# -------------- # --------------
# Portability issues: define a YY_NULLPTR appropriate for the current # Portability issues: define a YY_NULL appropriate for the current
# language (C, C++98, or C++11). # language (C, C++98, or C++11).
m4_define([b4_null_define], m4_define([b4_null_define],
[# ifndef YY_NULLPTR [# ifndef YY_NULL
# if defined __cplusplus && 201103L <= __cplusplus # if defined __cplusplus && 201103L <= __cplusplus
# define YY_NULLPTR nullptr # define YY_NULL nullptr
# else # else
# define YY_NULLPTR 0 # define YY_NULL 0
# endif # endif
# endif[]dnl # endif[]dnl
]) ])
@@ -285,7 +266,7 @@ m4_define([b4_null_define],
# b4_null # b4_null
# ------- # -------
# Return a null pointer constant. # Return a null pointer constant.
m4_define([b4_null], [YY_NULLPTR]) m4_define([b4_null], [YY_NULL])
# b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT) # b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
# ------------------------------------------------------------- # -------------------------------------------------------------
@@ -802,7 +783,7 @@ m4_define([b4_yy_location_print_define],
/* Print *YYLOCP on YYO. Private, do not rely on its existence. */ /* Print *YYLOCP on YYO. Private, do not rely on its existence. */
YY_ATTRIBUTE_UNUSED __attribute__((__unused__))
]b4_function_define([yy_location_print_], ]b4_function_define([yy_location_print_],
[static unsigned], [static unsigned],
[[FILE *yyo], [yyo]], [[FILE *yyo], [yyo]],
+79 -81
View File
@@ -445,9 +445,9 @@ int yydebug;
struct yyGLRStack; struct yyGLRStack;
static void yypstack (struct yyGLRStack* yystackp, size_t yyk) static void yypstack (struct yyGLRStack* yystackp, size_t yyk)
YY_ATTRIBUTE_UNUSED; __attribute__ ((__unused__));
static void yypdumpstack (struct yyGLRStack* yystackp) static void yypdumpstack (struct yyGLRStack* yystackp)
YY_ATTRIBUTE_UNUSED; __attribute__ ((__unused__));
#else /* !]b4_api_PREFIX[DEBUG */ #else /* !]b4_api_PREFIX[DEBUG */
@@ -669,15 +669,19 @@ struct yyGLRStack {
static void yyexpandGLRStack (yyGLRStack* yystackp); static void yyexpandGLRStack (yyGLRStack* yystackp);
#endif #endif
static _Noreturn void static void yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg)
__attribute__ ((__noreturn__));
static void
yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg) yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg)
{ {
if (yymsg != YY_NULLPTR) if (yymsg != YY_NULL)
yyerror (]b4_yyerror_args[yymsg); yyerror (]b4_yyerror_args[yymsg);
YYLONGJMP (yystackp->yyexception_buffer, 1); YYLONGJMP (yystackp->yyexception_buffer, 1);
} }
static _Noreturn void static void yyMemoryExhausted (yyGLRStack* yystackp)
__attribute__ ((__noreturn__));
static void
yyMemoryExhausted (yyGLRStack* yystackp) yyMemoryExhausted (yyGLRStack* yystackp)
{ {
YYLONGJMP (yystackp->yyexception_buffer, 2); YYLONGJMP (yystackp->yyexception_buffer, 2);
@@ -698,7 +702,7 @@ yytokenName (yySymbol yytoken)
/** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting /** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting
* at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred
* containing the pointer to the next state in the chain. */ * containing the pointer to the next state in the chain. */
static void yyfillin (yyGLRStackItem *, int, int) YY_ATTRIBUTE_UNUSED; static void yyfillin (yyGLRStackItem *, int, int) __attribute__ ((__unused__));
static void static void
yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1)
{ {
@@ -715,7 +719,7 @@ yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1)
else else
/* The effect of using yysval or yyloc (in an immediate rule) is /* The effect of using yysval or yyloc (in an immediate rule) is
* undefined. */ * undefined. */
yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULLPTR;]b4_locations_if([[ yyvsp[i].yystate.yysemantics.yyfirstVal = YY_NULL;]b4_locations_if([[
yyvsp[i].yystate.yyloc = s->yyloc;]])[ yyvsp[i].yystate.yyloc = s->yyloc;]])[
s = yyvsp[i].yystate.yypred = s->yypred; s = yyvsp[i].yystate.yypred = s->yypred;
} }
@@ -725,7 +729,7 @@ yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1)
* YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1. * YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1.
* For convenience, always return YYLOW1. */ * For convenience, always return YYLOW1. */
static inline int yyfill (yyGLRStackItem *, int *, int, yybool) static inline int yyfill (yyGLRStackItem *, int *, int, yybool)
YY_ATTRIBUTE_UNUSED; __attribute__ ((__unused__));
static inline int static inline int
yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal) yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal)
{ {
@@ -747,7 +751,8 @@ yyuserAction (yyRuleNum yyn, size_t yyrhslen, yyGLRStackItem* yyvsp,
yyGLRStack* yystackp, yyGLRStack* yystackp,
YYSTYPE* yyvalp]b4_locuser_formals[) YYSTYPE* yyvalp]b4_locuser_formals[)
{ {
yybool yynormal YY_ATTRIBUTE_UNUSED = (yystackp->yysplitPoint == YY_NULLPTR); yybool yynormal __attribute__ ((__unused__)) =
(yystackp->yysplitPoint == YY_NULL);
int yylow; int yylow;
]b4_parse_param_use([yyvalp], [yylocp])dnl ]b4_parse_param_use([yyvalp], [yylocp])dnl
[ YYUSE (yyrhslen); [ YYUSE (yyrhslen);
@@ -831,10 +836,12 @@ yydestroyGLRState (char const *yymsg, yyGLRState *yys]b4_user_formals[)
if (yydebug) if (yydebug)
{ {
if (yys->yysemantics.yyfirstVal) if (yys->yysemantics.yyfirstVal)
YYFPRINTF (stderr, "%s unresolved", yymsg); YYFPRINTF (stderr, "%s unresolved ", yymsg);
else else
YYFPRINTF (stderr, "%s incomplete", yymsg); YYFPRINTF (stderr, "%s incomplete ", yymsg);
YY_SYMBOL_PRINT ("", yystos[yys->yylrState], YY_NULLPTR, &yys->yyloc); yy_symbol_print (stderr, yystos[yys->yylrState],
YY_NULL]b4_locuser_args([&yys->yyloc])[);
YYFPRINTF (stderr, "\n");
} }
#endif #endif
@@ -910,18 +917,14 @@ yygetLRActions (yyStateNum yystate, int yytoken,
} }
} }
/** Compute post-reduction state.
* \param yystate the current state
* \param yysym the nonterminal to push on the stack
*/
static inline yyStateNum static inline yyStateNum
yyLRgotoState (yyStateNum yystate, yySymbol yysym) yyLRgotoState (yyStateNum yystate, yySymbol yylhs)
{ {
int yyr = yypgoto[yysym - YYNTOKENS] + yystate; int yyr = yypgoto[yylhs - YYNTOKENS] + yystate;
if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate) if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate)
return yytable[yyr]; return yytable[yyr];
else else
return yydefgoto[yysym - YYNTOKENS]; return yydefgoto[yylhs - YYNTOKENS];
} }
static inline yybool static inline yybool
@@ -963,7 +966,6 @@ yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate,
{ {
yySemanticOption* yynewOption = yySemanticOption* yynewOption =
&yynewGLRStackItem (yystackp, yyfalse)->yyoption; &yynewGLRStackItem (yystackp, yyfalse)->yyoption;
YYASSERT (!yynewOption->yyisState);
yynewOption->yystate = yyrhs; yynewOption->yystate = yyrhs;
yynewOption->yyrule = yyrule; yynewOption->yyrule = yyrule;
if (yystackp->yytops.yylookaheadNeeds[yyk]) if (yystackp->yytops.yylookaheadNeeds[yyk])
@@ -991,7 +993,7 @@ yyinitStateSet (yyGLRStateSet* yyset)
yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]); yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]);
if (! yyset->yystates) if (! yyset->yystates)
return yyfalse; return yyfalse;
yyset->yystates[0] = YY_NULLPTR; yyset->yystates[0] = YY_NULL;
yyset->yylookaheadNeeds = yyset->yylookaheadNeeds =
(yybool*) YYMALLOC (16 * sizeof yyset->yylookaheadNeeds[0]); (yybool*) YYMALLOC (16 * sizeof yyset->yylookaheadNeeds[0]);
if (! yyset->yylookaheadNeeds) if (! yyset->yylookaheadNeeds)
@@ -1021,8 +1023,8 @@ yyinitGLRStack (yyGLRStack* yystackp, size_t yysize)
if (!yystackp->yyitems) if (!yystackp->yyitems)
return yyfalse; return yyfalse;
yystackp->yynextFree = yystackp->yyitems; yystackp->yynextFree = yystackp->yyitems;
yystackp->yysplitPoint = YY_NULLPTR; yystackp->yysplitPoint = YY_NULL;
yystackp->yylastDeleted = YY_NULLPTR; yystackp->yylastDeleted = YY_NULL;
return yyinitStateSet (&yystackp->yytops); return yyinitStateSet (&yystackp->yytops);
} }
@@ -1061,10 +1063,10 @@ yyexpandGLRStack (yyGLRStack* yystackp)
{ {
yyGLRState* yys0 = &yyp0->yystate; yyGLRState* yys0 = &yyp0->yystate;
yyGLRState* yys1 = &yyp1->yystate; yyGLRState* yys1 = &yyp1->yystate;
if (yys0->yypred != YY_NULLPTR) if (yys0->yypred != YY_NULL)
yys1->yypred = yys1->yypred =
YYRELOC (yyp0, yyp1, yys0->yypred, yystate); YYRELOC (yyp0, yyp1, yys0->yypred, yystate);
if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != YY_NULLPTR) if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != YY_NULL)
yys1->yysemantics.yyfirstVal = yys1->yysemantics.yyfirstVal =
YYRELOC (yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption); YYRELOC (yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption);
} }
@@ -1072,18 +1074,18 @@ yyexpandGLRStack (yyGLRStack* yystackp)
{ {
yySemanticOption* yyv0 = &yyp0->yyoption; yySemanticOption* yyv0 = &yyp0->yyoption;
yySemanticOption* yyv1 = &yyp1->yyoption; yySemanticOption* yyv1 = &yyp1->yyoption;
if (yyv0->yystate != YY_NULLPTR) if (yyv0->yystate != YY_NULL)
yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate); yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate);
if (yyv0->yynext != YY_NULLPTR) if (yyv0->yynext != YY_NULL)
yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption); yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption);
} }
} }
if (yystackp->yysplitPoint != YY_NULLPTR) if (yystackp->yysplitPoint != YY_NULL)
yystackp->yysplitPoint = YYRELOC (yystackp->yyitems, yynewItems, yystackp->yysplitPoint = YYRELOC (yystackp->yyitems, yynewItems,
yystackp->yysplitPoint, yystate); yystackp->yysplitPoint, yystate);
for (yyn = 0; yyn < yystackp->yytops.yysize; yyn += 1) for (yyn = 0; yyn < yystackp->yytops.yysize; yyn += 1)
if (yystackp->yytops.yystates[yyn] != YY_NULLPTR) if (yystackp->yytops.yystates[yyn] != YY_NULL)
yystackp->yytops.yystates[yyn] = yystackp->yytops.yystates[yyn] =
YYRELOC (yystackp->yyitems, yynewItems, YYRELOC (yystackp->yyitems, yynewItems,
yystackp->yytops.yystates[yyn], yystate); yystackp->yytops.yystates[yyn], yystate);
@@ -1107,7 +1109,7 @@ yyfreeGLRStack (yyGLRStack* yystackp)
static inline void static inline void
yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys) yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys)
{ {
if (yystackp->yysplitPoint != YY_NULLPTR && yystackp->yysplitPoint > yys) if (yystackp->yysplitPoint != YY_NULL && yystackp->yysplitPoint > yys)
yystackp->yysplitPoint = yys; yystackp->yysplitPoint = yys;
} }
@@ -1115,9 +1117,9 @@ yyupdateSplit (yyGLRStack* yystackp, yyGLRState* yys)
static inline void static inline void
yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk) yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk)
{ {
if (yystackp->yytops.yystates[yyk] != YY_NULLPTR) if (yystackp->yytops.yystates[yyk] != YY_NULL)
yystackp->yylastDeleted = yystackp->yytops.yystates[yyk]; yystackp->yylastDeleted = yystackp->yytops.yystates[yyk];
yystackp->yytops.yystates[yyk] = YY_NULLPTR; yystackp->yytops.yystates[yyk] = YY_NULL;
} }
/** Undelete the last stack in *YYSTACKP that was marked as deleted. Can /** Undelete the last stack in *YYSTACKP that was marked as deleted. Can
@@ -1126,12 +1128,12 @@ yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk)
static void static void
yyundeleteLastStack (yyGLRStack* yystackp) yyundeleteLastStack (yyGLRStack* yystackp)
{ {
if (yystackp->yylastDeleted == YY_NULLPTR || yystackp->yytops.yysize != 0) if (yystackp->yylastDeleted == YY_NULL || yystackp->yytops.yysize != 0)
return; return;
yystackp->yytops.yystates[0] = yystackp->yylastDeleted; yystackp->yytops.yystates[0] = yystackp->yylastDeleted;
yystackp->yytops.yysize = 1; yystackp->yytops.yysize = 1;
YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n")); YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n"));
yystackp->yylastDeleted = YY_NULLPTR; yystackp->yylastDeleted = YY_NULL;
} }
static inline void static inline void
@@ -1141,7 +1143,7 @@ yyremoveDeletes (yyGLRStack* yystackp)
yyi = yyj = 0; yyi = yyj = 0;
while (yyj < yystackp->yytops.yysize) while (yyj < yystackp->yytops.yysize)
{ {
if (yystackp->yytops.yystates[yyi] == YY_NULLPTR) if (yystackp->yytops.yystates[yyi] == YY_NULL)
{ {
if (yyi == yyj) if (yyi == yyj)
{ {
@@ -1199,13 +1201,12 @@ yyglrShiftDefer (yyGLRStack* yystackp, size_t yyk, yyStateNum yylrState,
size_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule) size_t yyposn, yyGLRState* yyrhs, yyRuleNum yyrule)
{ {
yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate; yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
YYASSERT (yynewState->yyisState);
yynewState->yylrState = yylrState; yynewState->yylrState = yylrState;
yynewState->yyposn = yyposn; yynewState->yyposn = yyposn;
yynewState->yyresolved = yyfalse; yynewState->yyresolved = yyfalse;
yynewState->yypred = yystackp->yytops.yystates[yyk]; yynewState->yypred = yystackp->yytops.yystates[yyk];
yynewState->yysemantics.yyfirstVal = YY_NULLPTR; yynewState->yysemantics.yyfirstVal = YY_NULL;
yystackp->yytops.yystates[yyk] = yynewState; yystackp->yytops.yystates[yyk] = yynewState;
/* Invokes YY_RESERVE_GLRSTACK. */ /* Invokes YY_RESERVE_GLRSTACK. */
@@ -1265,7 +1266,7 @@ yydoAction (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
{ {
int yynrhs = yyrhsLength (yyrule); int yynrhs = yyrhsLength (yyrule);
if (yystackp->yysplitPoint == YY_NULLPTR) if (yystackp->yysplitPoint == YY_NULL)
{ {
/* Standard special case: single stack. */ /* Standard special case: single stack. */
yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk]; yyGLRStackItem* yyrhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
@@ -1317,13 +1318,14 @@ yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
{ {
size_t yyposn = yystackp->yytops.yystates[yyk]->yyposn; size_t yyposn = yystackp->yytops.yystates[yyk]->yyposn;
if (yyforceEval || yystackp->yysplitPoint == YY_NULLPTR) if (yyforceEval || yystackp->yysplitPoint == YY_NULL)
{ {
YYSTYPE yysval;]b4_locations_if([[ YYRESULTTAG yyflag;
YYLTYPE yyloc;]])[ YYSTYPE yysval;]b4_locations_if([
YYLTYPE yyloc;])[
YYRESULTTAG yyflag = yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[); yyflag = yydoAction (yystackp, yyk, yyrule, &yysval]b4_locuser_args([&yyloc])[);
if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULLPTR) if (yyflag == yyerr && yystackp->yysplitPoint != YY_NULL)
{ {
YYDPRINTF ((stderr, "Parse on stack %lu rejected by rule #%d.\n", YYDPRINTF ((stderr, "Parse on stack %lu rejected by rule #%d.\n",
(unsigned long int) yyk, yyrule - 1)); (unsigned long int) yyk, yyrule - 1));
@@ -1356,7 +1358,7 @@ yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
"Now in state %d.\n", "Now in state %d.\n",
(unsigned long int) yyk, yyrule - 1, yynewLRState)); (unsigned long int) yyk, yyrule - 1, yynewLRState));
for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1) for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULLPTR) if (yyi != yyk && yystackp->yytops.yystates[yyi] != YY_NULL)
{ {
yyGLRState *yysplit = yystackp->yysplitPoint; yyGLRState *yysplit = yystackp->yysplitPoint;
yyGLRState *yyp = yystackp->yytops.yystates[yyi]; yyGLRState *yyp = yystackp->yytops.yystates[yyi];
@@ -1383,7 +1385,7 @@ yyglrReduce (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
static size_t static size_t
yysplitStack (yyGLRStack* yystackp, size_t yyk) yysplitStack (yyGLRStack* yystackp, size_t yyk)
{ {
if (yystackp->yysplitPoint == YY_NULLPTR) if (yystackp->yysplitPoint == YY_NULL)
{ {
YYASSERT (yyk == 0); YYASSERT (yyk == 0);
yystackp->yysplitPoint = yystackp->yytops.yystates[yyk]; yystackp->yysplitPoint = yystackp->yytops.yystates[yyk];
@@ -1393,7 +1395,7 @@ yysplitStack (yyGLRStack* yystackp, size_t yyk)
yyGLRState** yynewStates; yyGLRState** yynewStates;
yybool* yynewLookaheadNeeds; yybool* yynewLookaheadNeeds;
yynewStates = YY_NULLPTR; yynewStates = YY_NULL;
if (yystackp->yytops.yycapacity if (yystackp->yytops.yycapacity
> (YYSIZEMAX / (2 * sizeof yynewStates[0]))) > (YYSIZEMAX / (2 * sizeof yynewStates[0])))
@@ -1404,7 +1406,7 @@ yysplitStack (yyGLRStack* yystackp, size_t yyk)
(yyGLRState**) YYREALLOC (yystackp->yytops.yystates, (yyGLRState**) YYREALLOC (yystackp->yytops.yystates,
(yystackp->yytops.yycapacity (yystackp->yytops.yycapacity
* sizeof yynewStates[0])); * sizeof yynewStates[0]));
if (yynewStates == YY_NULLPTR) if (yynewStates == YY_NULL)
yyMemoryExhausted (yystackp); yyMemoryExhausted (yystackp);
yystackp->yytops.yystates = yynewStates; yystackp->yytops.yystates = yynewStates;
@@ -1412,7 +1414,7 @@ yysplitStack (yyGLRStack* yystackp, size_t yyk)
(yybool*) YYREALLOC (yystackp->yytops.yylookaheadNeeds, (yybool*) YYREALLOC (yystackp->yytops.yylookaheadNeeds,
(yystackp->yytops.yycapacity (yystackp->yytops.yycapacity
* sizeof yynewLookaheadNeeds[0])); * sizeof yynewLookaheadNeeds[0]));
if (yynewLookaheadNeeds == YY_NULLPTR) if (yynewLookaheadNeeds == YY_NULL)
yyMemoryExhausted (yystackp); yyMemoryExhausted (yystackp);
yystackp->yytops.yylookaheadNeeds = yynewLookaheadNeeds; yystackp->yytops.yylookaheadNeeds = yynewLookaheadNeeds;
} }
@@ -1476,9 +1478,9 @@ yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1)
yySemanticOption* yyz1 = yys1->yysemantics.yyfirstVal; yySemanticOption* yyz1 = yys1->yysemantics.yyfirstVal;
while (yytrue) while (yytrue)
{ {
if (yyz1 == *yyz0p || yyz1 == YY_NULLPTR) if (yyz1 == *yyz0p || yyz1 == YY_NULL)
break; break;
else if (*yyz0p == YY_NULLPTR) else if (*yyz0p == YY_NULL)
{ {
*yyz0p = yyz1; *yyz0p = yyz1;
break; break;
@@ -1599,7 +1601,7 @@ yyreportTree (yySemanticOption* yyx, int yyindent)
for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred) for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred)
yystates[yyi] = yys; yystates[yyi] = yys;
if (yys == YY_NULLPTR) if (yys == YY_NULL)
{ {
yyleftmost_state.yyposn = 0; yyleftmost_state.yyposn = 0;
yystates[0] = &yyleftmost_state; yystates[0] = &yyleftmost_state;
@@ -1670,7 +1672,7 @@ yyresolveLocations (yyGLRState* yys1, int yyn1,
yyGLRStackItem yyrhsloc[1 + YYMAXRHS]; yyGLRStackItem yyrhsloc[1 + YYMAXRHS];
int yynrhs; int yynrhs;
yySemanticOption *yyoption = yys1->yysemantics.yyfirstVal; yySemanticOption *yyoption = yys1->yysemantics.yyfirstVal;
YYASSERT (yyoption != YY_NULLPTR); YYASSERT (yyoption != YY_NULL);
yynrhs = yyrhsLength (yyoption->yyrule); yynrhs = yyrhsLength (yyoption->yyrule);
if (yynrhs > 0) if (yynrhs > 0)
{ {
@@ -1729,7 +1731,7 @@ yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[)
YYRESULTTAG yyflag;]b4_locations_if([ YYRESULTTAG yyflag;]b4_locations_if([
YYLTYPE *yylocp = &yys->yyloc;])[ YYLTYPE *yylocp = &yys->yyloc;])[
for (yypp = &yyoptionList->yynext; *yypp != YY_NULLPTR; ) for (yypp = &yyoptionList->yynext; *yypp != YY_NULL; )
{ {
yySemanticOption* yyp = *yypp; yySemanticOption* yyp = *yypp;
@@ -1771,7 +1773,7 @@ yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[)
int yyprec = yydprec[yybest->yyrule]; int yyprec = yydprec[yybest->yyrule];
yyflag = yyresolveAction (yybest, yystackp, &yysval]b4_locuser_args[); yyflag = yyresolveAction (yybest, yystackp, &yysval]b4_locuser_args[);
if (yyflag == yyok) if (yyflag == yyok)
for (yyp = yybest->yynext; yyp != YY_NULLPTR; yyp = yyp->yynext) for (yyp = yybest->yynext; yyp != YY_NULL; yyp = yyp->yynext)
{ {
if (yyprec == yydprec[yyp->yyrule]) if (yyprec == yydprec[yyp->yyrule])
{ {
@@ -1798,14 +1800,14 @@ yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[)
yys->yysemantics.yysval = yysval; yys->yysemantics.yysval = yysval;
} }
else else
yys->yysemantics.yyfirstVal = YY_NULLPTR; yys->yysemantics.yyfirstVal = YY_NULL;
return yyflag; return yyflag;
} }
static YYRESULTTAG static YYRESULTTAG
yyresolveStack (yyGLRStack* yystackp]b4_user_formals[) yyresolveStack (yyGLRStack* yystackp]b4_user_formals[)
{ {
if (yystackp->yysplitPoint != YY_NULLPTR) if (yystackp->yysplitPoint != YY_NULL)
{ {
yyGLRState* yys; yyGLRState* yys;
int yyn; int yyn;
@@ -1825,10 +1827,10 @@ yycompressStack (yyGLRStack* yystackp)
{ {
yyGLRState* yyp, *yyq, *yyr; yyGLRState* yyp, *yyq, *yyr;
if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == YY_NULLPTR) if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == YY_NULL)
return; return;
for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = YY_NULLPTR; for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = YY_NULL;
yyp != yystackp->yysplitPoint; yyp != yystackp->yysplitPoint;
yyr = yyp, yyp = yyq, yyq = yyp->yypred) yyr = yyp, yyp = yyq, yyq = yyp->yypred)
yyp->yypred = yyr; yyp->yypred = yyr;
@@ -1836,10 +1838,10 @@ yycompressStack (yyGLRStack* yystackp)
yystackp->yyspaceLeft += yystackp->yynextFree - yystackp->yyitems; yystackp->yyspaceLeft += yystackp->yynextFree - yystackp->yyitems;
yystackp->yynextFree = ((yyGLRStackItem*) yystackp->yysplitPoint) + 1; yystackp->yynextFree = ((yyGLRStackItem*) yystackp->yysplitPoint) + 1;
yystackp->yyspaceLeft -= yystackp->yynextFree - yystackp->yyitems; yystackp->yyspaceLeft -= yystackp->yynextFree - yystackp->yyitems;
yystackp->yysplitPoint = YY_NULLPTR; yystackp->yysplitPoint = YY_NULL;
yystackp->yylastDeleted = YY_NULLPTR; yystackp->yylastDeleted = YY_NULL;
while (yyr != YY_NULLPTR) while (yyr != YY_NULL)
{ {
yystackp->yynextFree->yystate = *yyr; yystackp->yynextFree->yystate = *yyr;
yyr = yyr->yypred; yyr = yyr->yypred;
@@ -1854,7 +1856,7 @@ static YYRESULTTAG
yyprocessOneStack (yyGLRStack* yystackp, size_t yyk, yyprocessOneStack (yyGLRStack* yystackp, size_t yyk,
size_t yyposn]b4_pure_formals[) size_t yyposn]b4_pure_formals[)
{ {
while (yystackp->yytops.yystates[yyk] != YY_NULLPTR) while (yystackp->yytops.yystates[yyk] != YY_NULL)
{ {
yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState; yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState;
YYDPRINTF ((stderr, "Stack %lu Entering state %d\n", YYDPRINTF ((stderr, "Stack %lu Entering state %d\n",
@@ -1976,13 +1978,13 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
#else #else
{ {
yySymbol yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); yySymbol yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
size_t yysize0 = yytnamerr (YY_NULLPTR, yytokenName (yytoken)); size_t yysize0 = yytnamerr (YY_NULL, yytokenName (yytoken));
size_t yysize = yysize0; size_t yysize = yysize0;
yybool yysize_overflow = yyfalse; yybool yysize_overflow = yyfalse;
char* yymsg = YY_NULLPTR; char* yymsg = YY_NULL;
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
/* Internationalized format string. */ /* Internationalized format string. */
const char *yyformat = YY_NULLPTR; const char *yyformat = YY_NULL;
/* Arguments of yyformat. */ /* Arguments of yyformat. */
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
/* Number of reported tokens (one for the "unexpected", one per /* Number of reported tokens (one for the "unexpected", one per
@@ -2038,7 +2040,7 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
} }
yyarg[yycount++] = yytokenName (yyx); yyarg[yycount++] = yytokenName (yyx);
{ {
size_t yysz = yysize + yytnamerr (YY_NULLPTR, yytokenName (yyx)); size_t yysz = yysize + yytnamerr (YY_NULL, yytokenName (yyx));
yysize_overflow |= yysz < yysize; yysize_overflow |= yysz < yysize;
yysize = yysz; yysize = yysz;
} }
@@ -2116,7 +2118,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
{ {
yySymbol yytoken; yySymbol yytoken;
if (yychar == YYEOF) if (yychar == YYEOF)
yyFail (yystackp][]b4_lpure_args[, YY_NULLPTR); yyFail (yystackp][]b4_lpure_args[, YY_NULL);
if (yychar != YYEMPTY) if (yychar != YYEMPTY)
{]b4_locations_if([[ {]b4_locations_if([[
/* We throw away the lookahead, but the error range /* We throw away the lookahead, but the error range
@@ -2157,10 +2159,10 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
/* Reduce to one stack. */ /* Reduce to one stack. */
for (yyk = 0; yyk < yystackp->yytops.yysize; yyk += 1) for (yyk = 0; yyk < yystackp->yytops.yysize; yyk += 1)
if (yystackp->yytops.yystates[yyk] != YY_NULLPTR) if (yystackp->yytops.yystates[yyk] != YY_NULL)
break; break;
if (yyk >= yystackp->yytops.yysize) if (yyk >= yystackp->yytops.yysize)
yyFail (yystackp][]b4_lpure_args[, YY_NULLPTR); yyFail (yystackp][]b4_lpure_args[, YY_NULL);
for (yyk += 1; yyk < yystackp->yytops.yysize; yyk += 1) for (yyk += 1; yyk < yystackp->yytops.yysize; yyk += 1)
yymarkStackDeleted (yystackp, yyk); yymarkStackDeleted (yystackp, yyk);
yyremoveDeletes (yystackp); yyremoveDeletes (yystackp);
@@ -2168,7 +2170,7 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
/* Now pop stack until we find a state that shifts the error token. */ /* Now pop stack until we find a state that shifts the error token. */
yystackp->yyerrState = 3; yystackp->yyerrState = 3;
while (yystackp->yytops.yystates[0] != YY_NULLPTR) while (yystackp->yytops.yystates[0] != YY_NULL)
{ {
yyGLRState *yys = yystackp->yytops.yystates[0]; yyGLRState *yys = yystackp->yytops.yystates[0];
yyj = yypact[yys->yylrState]; yyj = yypact[yys->yylrState];
@@ -2192,14 +2194,14 @@ yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
} }
}]b4_locations_if([[ }]b4_locations_if([[
yystackp->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[ yystackp->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
if (yys->yypred != YY_NULLPTR) if (yys->yypred != YY_NULL)
yydestroyGLRState ("Error: popping", yys]b4_user_args[); yydestroyGLRState ("Error: popping", yys]b4_user_args[);
yystackp->yytops.yystates[0] = yys->yypred; yystackp->yytops.yystates[0] = yys->yypred;
yystackp->yynextFree -= 1; yystackp->yynextFree -= 1;
yystackp->yyspaceLeft += 1; yystackp->yyspaceLeft += 1;
} }
if (yystackp->yytops.yystates[0] == YY_NULLPTR) if (yystackp->yytops.yystates[0] == YY_NULL)
yyFail (yystackp][]b4_lpure_args[, YY_NULLPTR); yyFail (yystackp][]b4_lpure_args[, YY_NULL);
} }
#define YYCHK1(YYE) \ #define YYCHK1(YYE) \
@@ -2442,7 +2444,7 @@ b4_dollar_popdef])[]dnl
{ {
yyGLRState *yys = yystates[yyk]; yyGLRState *yys = yystates[yyk];
]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]] ]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
)[ if (yys->yypred != YY_NULLPTR) )[ if (yys->yypred != YY_NULL)
yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[); yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
yystates[yyk] = yys->yypred; yystates[yyk] = yys->yypred;
yystack.yynextFree -= 1; yystack.yynextFree -= 1;
@@ -2474,7 +2476,7 @@ yy_yypstack (yyGLRState* yys)
static void static void
yypstates (yyGLRState* yyst) yypstates (yyGLRState* yyst)
{ {
if (yyst == YY_NULLPTR) if (yyst == YY_NULL)
YYFPRINTF (stderr, "<null>"); YYFPRINTF (stderr, "<null>");
else else
yy_yypstack (yyst); yy_yypstack (yyst);
@@ -2488,7 +2490,7 @@ yypstack (yyGLRStack* yystackp, size_t yyk)
} }
#define YYINDEX(YYX) \ #define YYINDEX(YYX) \
((YYX) == YY_NULLPTR ? -1 : (yyGLRStackItem*) (YYX) - yystackp->yyitems) ((YYX) == YY_NULL ? -1 : (yyGLRStackItem*) (YYX) - yystackp->yyitems)
static void static void
@@ -2502,8 +2504,6 @@ yypdumpstack (yyGLRStack* yystackp)
(unsigned long int) (yyp - yystackp->yyitems)); (unsigned long int) (yyp - yystackp->yyitems));
if (*(yybool *) yyp) if (*(yybool *) yyp)
{ {
YYASSERT (yyp->yystate.yyisState);
YYASSERT (yyp->yyoption.yyisState);
YYFPRINTF (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld", YYFPRINTF (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld",
yyp->yystate.yyresolved, yyp->yystate.yylrState, yyp->yystate.yyresolved, yyp->yystate.yylrState,
(unsigned long int) yyp->yystate.yyposn, (unsigned long int) yyp->yystate.yyposn,
@@ -2515,8 +2515,6 @@ yypdumpstack (yyGLRStack* yystackp)
} }
else else
{ {
YYASSERT (!yyp->yystate.yyisState);
YYASSERT (!yyp->yyoption.yyisState);
YYFPRINTF (stderr, "Option. rule: %d, state: %ld, next: %ld", YYFPRINTF (stderr, "Option. rule: %d, state: %ld, next: %ld",
yyp->yyoption.yyrule - 1, yyp->yyoption.yyrule - 1,
(long int) YYINDEX (yyp->yyoption.yystate), (long int) YYINDEX (yyp->yyoption.yystate),
+63 -62
View File
@@ -157,7 +157,6 @@ m4_define([b4_shared_declarations],
]b4_bison_locations_if([[# include "location.hh"]])])[ ]b4_bison_locations_if([[# include "location.hh"]])])[
]b4_variant_if([b4_variant_includes])[ ]b4_variant_if([b4_variant_includes])[
]b4_attribute_define[
]b4_YYDEBUG_define[ ]b4_YYDEBUG_define[
]b4_namespace_open[ ]b4_namespace_open[
@@ -184,14 +183,14 @@ b4_location_define])])[
#if ]b4_api_PREFIX[DEBUG #if ]b4_api_PREFIX[DEBUG
/// The current debugging stream. /// The current debugging stream.
std::ostream& debug_stream () const YY_ATTRIBUTE_PURE; std::ostream& debug_stream () const;
/// Set the current debugging stream. /// Set the current debugging stream.
void set_debug_stream (std::ostream &); void set_debug_stream (std::ostream &);
/// Type for debugging levels. /// Type for debugging levels.
typedef int debug_level_type; typedef int debug_level_type;
/// The current debugging level. /// The current debugging level.
debug_level_type debug_level () const YY_ATTRIBUTE_PURE; debug_level_type debug_level () const;
/// Set the current debugging level. /// Set the current debugging level.
void set_debug_level (debug_level_type l); void set_debug_level (debug_level_type l);
#endif #endif
@@ -220,8 +219,8 @@ b4_location_define])])[
/// Compute post-reduction state. /// Compute post-reduction state.
/// \param yystate the current state /// \param yystate the current state
/// \param yysym the nonterminal to push on the stack /// \param yylhs the nonterminal to push on the stack
state_type yy_lr_goto_state_ (state_type yystate, int yysym); state_type yy_lr_goto_state_ (state_type yystate, int yylhs);
/// Whether the given \c yypact_ value indicates a defaulted state. /// Whether the given \c yypact_ value indicates a defaulted state.
/// \param yyvalue the value to check /// \param yyvalue the value to check
@@ -268,7 +267,7 @@ b4_location_define])])[
/// \brief Reclaim the memory associated to a symbol. /// \brief Reclaim the memory associated to a symbol.
/// \param yymsg Why this token is reclaimed. /// \param yymsg Why this token is reclaimed.
/// If null, print nothing. /// If null, print nothing.
/// \param yysym The symbol. /// \param s The symbol.
template <typename Base> template <typename Base>
void yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const; void yy_destroy_ (const char* yymsg, basic_symbol<Base>& yysym) const;
@@ -342,13 +341,13 @@ b4_location_define])])[
enum enum
{ {
yyeof_ = 0, yyeof_ = 0,
yylast_ = ]b4_last[, ///< Last index in yytable_. yylast_ = ]b4_last[, //< Last index in yytable_.
yynnts_ = ]b4_nterms_number[, ///< Number of nonterminal symbols. yynnts_ = ]b4_nterms_number[, //< Number of nonterminal symbols.
yyempty_ = -2, yyempty_ = -2,
yyfinal_ = ]b4_final_state_number[, ///< Termination state number. yyfinal_ = ]b4_final_state_number[, //< Termination state number.
yyterror_ = 1, yyterror_ = 1,
yyerrcode_ = 256, yyerrcode_ = 256,
yyntokens_ = ]b4_tokens_number[ ///< Number of tokens. yyntokens_ = ]b4_tokens_number[ //< Number of tokens.
}; };
]b4_parse_param_vars[ ]b4_parse_param_vars[
@@ -671,13 +670,13 @@ m4_if(b4_prefix, [yy], [],
#endif // ]b4_api_PREFIX[DEBUG #endif // ]b4_api_PREFIX[DEBUG
inline ]b4_parser_class_name[::state_type inline ]b4_parser_class_name[::state_type
]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yysym) ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs)
{ {
int yyr = yypgoto_[yysym - yyntokens_] + yystate; int yyr = yypgoto_[yylhs - yyntokens_] + yystate;
if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate) if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
return yytable_[yyr]; return yytable_[yyr];
else else
return yydefgoto_[yysym - yyntokens_]; return yydefgoto_[yylhs - yyntokens_];
} }
inline bool inline bool
@@ -700,7 +699,6 @@ m4_if(b4_prefix, [yy], [],
// State. // State.
int yyn; int yyn;
/// Length of the RHS of the rule being reduced.
int yylen = 0; int yylen = 0;
// Error handling. // Error handling.
@@ -713,6 +711,9 @@ m4_if(b4_prefix, [yy], [],
/// The locations where the error started and ended. /// The locations where the error started and ended.
stack_symbol_type yyerror_range[3];]])[ stack_symbol_type yyerror_range[3];]])[
/// $$ and @@$.
stack_symbol_type yylhs;
/// The return value of parse (). /// The return value of parse ().
int yyresult; int yyresult;
@@ -733,7 +734,7 @@ b4_dollar_popdef])[]dnl
location values to have been already stored, initialize these location values to have been already stored, initialize these
stacks with a primary value. */ stacks with a primary value. */
yystack_.clear (); yystack_.clear ();
yypush_ (YY_NULLPTR, 0, yyla); yypush_ (YY_NULL, 0, yyla);
// A new symbol was pushed on the stack. // A new symbol was pushed on the stack.
yynewstate: yynewstate:
@@ -813,55 +814,52 @@ b4_dollar_popdef])[]dnl
`-----------------------------*/ `-----------------------------*/
yyreduce: yyreduce:
yylen = yyr2_[yyn]; yylen = yyr2_[yyn];
{ yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([
stack_symbol_type yylhs; /* Variants are always initialized to an empty instance of the
yylhs.state = yy_lr_goto_state_(yystack_[yylen].state, yyr1_[yyn]);]b4_variant_if([ correct type. The default $$=$1 action is NOT applied when using
/* Variants are always initialized to an empty instance of the variants. */
correct type. The default '$$ = $1' action is NOT applied b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])],[
when using variants. */ /* If YYLEN is nonzero, implement the default value of the action:
b4_symbol_variant([[yyr1_@{yyn@}]], [yylhs.value], [build])], [ '$$ = $1'. Otherwise, use the top of the stack.
/* If YYLEN is nonzero, implement the default value of the
action: '$$ = $1'. Otherwise, use the top of the stack.
Otherwise, the following line sets YYLHS.VALUE to garbage. Otherwise, the following line sets YYLHS.VALUE to garbage.
This behavior is undocumented and Bison users should not rely This behavior is undocumented and Bison
upon it. */ users should not rely upon it. */
if (yylen) if (yylen)
yylhs.value = yystack_@{yylen - 1@}.value; yylhs.value = yystack_@{yylen - 1@}.value;
else else
yylhs.value = yystack_@{0@}.value;])[ yylhs.value = yystack_@{0@}.value;])[
]b4_locations_if([dnl ]b4_locations_if([dnl
[ [
// Compute the default @@$. // Compute the default @@$.
{
slice<stack_symbol_type, stack_type> slice (yystack_, yylen);
YYLLOC_DEFAULT (yylhs.location, slice, yylen);
}]])[
// Perform the reduction.
YY_REDUCE_PRINT (yyn);
try
{ {
slice<stack_symbol_type, stack_type> slice (yystack_, yylen); switch (yyn)
YYLLOC_DEFAULT (yylhs.location, slice, yylen); {
}]])[
// Perform the reduction.
YY_REDUCE_PRINT (yyn);
try
{
switch (yyn)
{
]b4_user_actions[ ]b4_user_actions[
default: default:
break; break;
} }
} }
catch (const syntax_error& yyexc) catch (const syntax_error& yyexc)
{ {
error (yyexc); error (yyexc);
YYERROR; YYERROR;
} }
YY_SYMBOL_PRINT ("-> $$ =", yylhs); YY_SYMBOL_PRINT ("-> $$ =", yylhs);
yypop_ (yylen); yypop_ (yylen);
yylen = 0; yylen = 0;
YY_STACK_PRINT (); YY_STACK_PRINT ();
// Shift the result of the reduction. // Shift the result of the reduction.
yypush_ (YY_NULLPTR, yylhs); yypush_ (YY_NULL, yylhs);
}
goto yynewstate; goto yynewstate;
/*--------------------------------------. /*--------------------------------------.
@@ -908,7 +906,10 @@ b4_dollar_popdef])[]dnl
code. */ code. */
if (false) if (false)
goto yyerrorlab;]b4_locations_if([[ goto yyerrorlab;]b4_locations_if([[
yyerror_range[1].location = yystack_[yylen - 1].location;]])[ yyerror_range[1].location = yystack_[yylen - 1].location;]])b4_variant_if([[
/* $$ was initialized before running the user action. */
YY_SYMBOL_PRINT ("Error: discarding", yylhs);
yylhs.~stack_symbol_type();]])[
/* Do not reclaim the symbols of the rule whose action triggered /* Do not reclaim the symbols of the rule whose action triggered
this YYERROR. */ this YYERROR. */
yypop_ (yylen); yypop_ (yylen);
@@ -987,11 +988,11 @@ b4_dollar_popdef])[]dnl
// Do not try to display the values of the reclaimed symbols, // Do not try to display the values of the reclaimed symbols,
// as their printer might throw an exception. // as their printer might throw an exception.
if (!yyempty) if (!yyempty)
yy_destroy_ (YY_NULLPTR, yyla); yy_destroy_ (YY_NULL, yyla);
while (1 < yystack_.size ()) while (1 < yystack_.size ())
{ {
yy_destroy_ (YY_NULLPTR, yystack_[0]); yy_destroy_ (YY_NULL, yystack_[0]);
yypop_ (); yypop_ ();
} }
throw; throw;
@@ -1073,7 +1074,7 @@ b4_error_verbose_if([state_type yystate, symbol_number_type yytoken],
} }
} }
char const* yyformat = YY_NULLPTR; char const* yyformat = YY_NULL;
switch (yycount) switch (yycount)
{ {
#define YYCASE_(N, S) \ #define YYCASE_(N, S) \
+8 -14
View File
@@ -453,19 +453,6 @@ b4_define_state])[
return yyerrstatus_ == 0; return yyerrstatus_ == 0;
} }
/** Compute post-reduction state.
* @@param yystate the current state
* @@param yysym the nonterminal to push on the stack
*/
private int yy_lr_goto_state_ (int yystate, int yysym)
{
int yyr = yypgoto_[yysym - yyntokens_] + yystate;
if (0 <= yyr && yyr <= yylast_ && yycheck_[yyr] == yystate)
return yytable_[yyr];
else
return yydefgoto_[yysym - yyntokens_];
}
private int yyaction (int yyn, YYStack yystack, int yylen) ]b4_maybe_throws([b4_throws])[ private int yyaction (int yyn, YYStack yystack, int yylen) ]b4_maybe_throws([b4_throws])[
{ {
]b4_yystype[ yyval; ]b4_yystype[ yyval;
@@ -496,7 +483,14 @@ b4_define_state])[
yylen = 0; yylen = 0;
/* Shift the result of the reduction. */ /* Shift the result of the reduction. */
int yystate = yy_lr_goto_state_ (yystack.stateAt (0), yyr1_[yyn]); yyn = yyr1_[yyn];
int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0);
if (0 <= yystate && yystate <= yylast_
&& yycheck_[yystate] == yystack.stateAt (0))
yystate = yytable_[yystate];
else
yystate = yydefgoto_[yyn - yyntokens_];
yystack.push (yystate, yyval]b4_locations_if([, yyloc])[); yystack.push (yystate, yyval]b4_locations_if([, yyloc])[);
return YYNEWSTATE; return YYNEWSTATE;
} }
+3 -3
View File
@@ -27,7 +27,7 @@ m4_define([b4_position_define],
{ {
public:]m4_ifdef([b4_location_constructors], [[ public:]m4_ifdef([b4_location_constructors], [[
/// Construct a position. /// Construct a position.
explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULLPTR, explicit position (]b4_percent_define_get([[filename_type]])[* f = YY_NULL,
unsigned int l = ]b4_location_initial_line[u, unsigned int l = ]b4_location_initial_line[u,
unsigned int c = ]b4_location_initial_column[u) unsigned int c = ]b4_location_initial_column[u)
: filename (f) : filename (f)
@@ -38,7 +38,7 @@ m4_define([b4_position_define],
]])[ ]])[
/// Initialization. /// Initialization.
void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULLPTR, void initialize (]b4_percent_define_get([[filename_type]])[* fn = YY_NULL,
unsigned int l = ]b4_location_initial_line[u, unsigned int l = ]b4_location_initial_line[u,
unsigned int c = ]b4_location_initial_column[u) unsigned int c = ]b4_location_initial_column[u)
{ {
@@ -178,7 +178,7 @@ m4_define([b4_location_define],
])[ ])[
/// Initialization. /// Initialization.
void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULLPTR, void initialize (]b4_percent_define_get([[filename_type]])[* f = YY_NULL,
unsigned int l = ]b4_location_initial_line[u, unsigned int l = ]b4_location_initial_line[u,
unsigned int c = ]b4_location_initial_column[u) unsigned int c = ]b4_location_initial_column[u)
{ {
+5 -3
View File
@@ -95,7 +95,7 @@ m4_define([b4_variant_define],
/// Empty construction. /// Empty construction.
variant ()]b4_parse_assert_if([ variant ()]b4_parse_assert_if([
: yytname_ (YY_NULLPTR)])[ : yytname_ (YY_NULL)])[
{} {}
/// Construct and fill. /// Construct and fill.
@@ -178,7 +178,8 @@ m4_define([b4_variant_define],
template <typename T> template <typename T>
void void
move (self_type& other) move (self_type& other)
{ {]b4_parse_assert_if([
YYASSERT (!yytname_);])[
build<T> (); build<T> ();
swap<T> (other); swap<T> (other);
other.destroy<T> (); other.destroy<T> ();
@@ -198,7 +199,7 @@ m4_define([b4_variant_define],
destroy () destroy ()
{ {
as<T> ().~T ();]b4_parse_assert_if([ as<T> ().~T ();]b4_parse_assert_if([
yytname_ = YY_NULLPTR;])[ yytname_ = YY_NULL;])[
} }
private: private:
@@ -320,6 +321,7 @@ b4_join(b4_symbol_if([$1], [has_type],
return symbol_type (b4_join([token::b4_symbol([$1], [id])], return symbol_type (b4_join([token::b4_symbol([$1], [id])],
b4_symbol_if([$1], [has_type], [v]), b4_symbol_if([$1], [has_type], [v]),
b4_locations_if([l]))); b4_locations_if([l])));
} }
])])]) ])])])
+1 -5
View File
@@ -201,8 +201,6 @@
<xsl:if test="$point = 0"> <xsl:if test="$point = 0">
<xsl:text> .</xsl:text> <xsl:text> .</xsl:text>
</xsl:if> </xsl:if>
<!-- RHS -->
<xsl:for-each select="rhs/symbol|rhs/empty"> <xsl:for-each select="rhs/symbol|rhs/empty">
<xsl:apply-templates select="."/> <xsl:apply-templates select="."/>
<xsl:if test="$point = position()"> <xsl:if test="$point = position()">
@@ -216,9 +214,7 @@
<xsl:value-of select="."/> <xsl:value-of select="."/>
</xsl:template> </xsl:template>
<xsl:template match="empty"> <xsl:template match="empty"/>
<xsl:text> %empty</xsl:text>
</xsl:template>
<xsl:template match="lookaheads"> <xsl:template match="lookaheads">
<xsl:text> [</xsl:text> <xsl:text> [</xsl:text>
+6 -1
View File
@@ -350,7 +350,12 @@
<xsl:if test="position() = $point + 1"> <xsl:if test="position() = $point + 1">
<xsl:text> .</xsl:text> <xsl:text> .</xsl:text>
</xsl:if> </xsl:if>
<xsl:apply-templates select="."/> <xsl:if test="$itemset = 'true' and name(.) != 'empty'">
<xsl:apply-templates select="."/>
</xsl:if>
<xsl:if test="$itemset != 'true'">
<xsl:apply-templates select="."/>
</xsl:if>
<xsl:if test="position() = last() and position() = $point"> <xsl:if test="position() = last() and position() = $point">
<xsl:text> .</xsl:text> <xsl:text> .</xsl:text>
</xsl:if> </xsl:if>
+7 -2
View File
@@ -532,7 +532,12 @@
<xsl:text> </xsl:text> <xsl:text> </xsl:text>
<span class="point">.</span> <span class="point">.</span>
</xsl:if> </xsl:if>
<xsl:apply-templates select="."/> <xsl:if test="$itemset = 'true' and name(.) != 'empty'">
<xsl:apply-templates select="."/>
</xsl:if>
<xsl:if test="$itemset != 'true'">
<xsl:apply-templates select="."/>
</xsl:if>
<xsl:if test="position() = last() and position() = $point"> <xsl:if test="position() = last() and position() = $point">
<xsl:text> </xsl:text> <xsl:text> </xsl:text>
<span class="point">.</span> <span class="point">.</span>
@@ -558,7 +563,7 @@
</xsl:template> </xsl:template>
<xsl:template match="empty"> <xsl:template match="empty">
<xsl:text> %empty</xsl:text> <xsl:text> &#949;</xsl:text>
</xsl:template> </xsl:template>
<xsl:template match="lookaheads"> <xsl:template match="lookaheads">
+6 -6
View File
@@ -1108,11 +1108,11 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
]b4_lac_if([[yytype_int16 *yyesa, yytype_int16 **yyes, ]b4_lac_if([[yytype_int16 *yyesa, yytype_int16 **yyes,
YYSIZE_T *yyes_capacity, ]])[yytype_int16 *yyssp, int yytoken) YYSIZE_T *yyes_capacity, ]])[yytype_int16 *yyssp, int yytoken)
{ {
YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
YYSIZE_T yysize = yysize0; YYSIZE_T yysize = yysize0;
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
/* Internationalized format string. */ /* Internationalized format string. */
const char *yyformat = YY_NULLPTR; const char *yyformat = YY_NULL;
/* Arguments of yyformat. */ /* Arguments of yyformat. */
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
/* Number of reported tokens (one for the "unexpected", one per /* Number of reported tokens (one for the "unexpected", one per
@@ -1187,7 +1187,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
} }
yyarg[yycount++] = yytname[yyx]; yyarg[yycount++] = yytname[yyx];
{ {
YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
if (! (yysize <= yysize1 if (! (yysize <= yysize1
&& yysize1 <= YYSTACK_ALLOC_MAXIMUM)) && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
return 2; return 2;
@@ -1271,7 +1271,7 @@ static char yypstate_allocated = 0;]])b4_pull_if([
b4_function_define([[yyparse]], [[int]], b4_parse_param)[ b4_function_define([[yyparse]], [[int]], b4_parse_param)[
{ {
return yypull_parse (YY_NULLPTR]m4_ifset([b4_parse_param], return yypull_parse (YY_NULL]m4_ifset([b4_parse_param],
[[, ]b4_args(b4_parse_param)])[); [[, ]b4_args(b4_parse_param)])[);
} }
@@ -1313,10 +1313,10 @@ b4_function_define([[yyparse]], [[int]], b4_parse_param)[
{ {
yypstate *yyps;]b4_pure_if([], [[ yypstate *yyps;]b4_pure_if([], [[
if (yypstate_allocated) if (yypstate_allocated)
return YY_NULLPTR;]])[ return YY_NULL;]])[
yyps = (yypstate *) malloc (sizeof *yyps); yyps = (yypstate *) malloc (sizeof *yyps);
if (!yyps) if (!yyps)
return YY_NULLPTR; return YY_NULL;
yyps->yynew = 1;]b4_pure_if([], [[ yyps->yynew = 1;]b4_pure_if([], [[
yypstate_allocated = 1;]])[ yypstate_allocated = 1;]])[
return yyps; return yyps;
+8 -14
View File
@@ -10065,16 +10065,18 @@ A category can be turned off by prefixing its name with @samp{no-}. For
instance, @option{-Wno-yacc} will hide the warnings about instance, @option{-Wno-yacc} will hide the warnings about
POSIX Yacc incompatibilities. POSIX Yacc incompatibilities.
@item -Werror @item -Werror[=@var{category}]
Turn enabled warnings for every @var{category} into errors, unless they are @itemx -Wno-error[=@var{category}]
explicitly disabled by @option{-Wno-error=@var{category}}. Enable warnings falling in @var{category}, and treat them as errors. If no
@var{category} is given, it defaults to making all enabled warnings into errors.
@item -Werror=@var{category}
Enable warnings falling in @var{category}, and treat them as errors.
@var{category} is the same as for @option{--warnings}, with the exception that @var{category} is the same as for @option{--warnings}, with the exception that
it may not be prefixed with @samp{no-} (see above). it may not be prefixed with @samp{no-} (see above).
Prefixed with @samp{no}, it deactivates the error treatment for this
@var{category}. However, the warning itself won't be disabled, or enabled, by
this option.
Note that the precedence of the @samp{=} and @samp{,} operators is such that Note that the precedence of the @samp{=} and @samp{,} operators is such that
the following commands are @emph{not} equivalent, as the first will not treat the following commands are @emph{not} equivalent, as the first will not treat
S/R conflicts as errors. S/R conflicts as errors.
@@ -10084,14 +10086,6 @@ $ bison -Werror=yacc,conflicts-sr input.y
$ bison -Werror=yacc,error=conflicts-sr input.y $ bison -Werror=yacc,error=conflicts-sr input.y
@end example @end example
@item -Wno-error
Do not turn enabled warnings for every @var{category} into errors, unless
they are explicitly enabled by @option{-Werror=@var{category}}.
@item -Wno-error=@var{category}
Deactivate the error treatment for this @var{category}. However, the warning
itself won't be disabled, or enabled, by this option.
@item -f [@var{feature}] @item -f [@var{feature}]
@itemx --feature[=@var{feature}] @itemx --feature[=@var{feature}]
Activate miscellaneous @var{feature}. @var{feature} can be one of: Activate miscellaneous @var{feature}. @var{feature} can be one of:
-2
View File
@@ -118,9 +118,7 @@ $(top_srcdir)/doc/bison.1: doc/bison.help doc/bison.x $(top_srcdir)/configure
fi fi
$(AM_V_at)rm -f $@*.t $(AM_V_at)rm -f $@*.t
if ENABLE_YACC
nodist_man_MANS = doc/yacc.1 nodist_man_MANS = doc/yacc.1
endif
## ----------------------------- ## ## ----------------------------- ##
## Graphviz examples generation. ## ## Graphviz examples generation. ##
+25 -25
View File
@@ -19,7 +19,7 @@
# Don't depend on $(BISON) otherwise we would rebuild these files # Don't depend on $(BISON) otherwise we would rebuild these files
# in srcdir, including during distcheck, which is forbidden. # in srcdir, including during distcheck, which is forbidden.
%D%/calc++-parser.stamp: $(BISON_IN) examples/calc++/calc++-parser.stamp: $(BISON_IN)
SUFFIXES += .yy .stamp SUFFIXES += .yy .stamp
.yy.stamp: .yy.stamp:
$(AM_V_YACC)rm -f $@ $(AM_V_YACC)rm -f $@
@@ -27,14 +27,14 @@ SUFFIXES += .yy .stamp
$(AM_V_at)$(YACCCOMPILE) -o $*.cc $< $(AM_V_at)$(YACCCOMPILE) -o $*.cc $<
$(AM_V_at)mv -f $@.tmp $@ $(AM_V_at)mv -f $@.tmp $@
$(calc_sources_generated): %D%/calc++-parser.stamp $(calc_sources_generated): examples/calc++/calc++-parser.stamp
@test -f $@ || rm -f %D%/calc++-parser.stamp @test -f $@ || rm -f examples/calc++/calc++-parser.stamp
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/calc++-parser.stamp @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/calc++/calc++-parser.stamp
CLEANFILES += \ CLEANFILES += \
$(calc_sources_generated) \ $(calc_sources_generated) \
%D%/calc++-parser.output \ examples/calc++/calc++-parser.output \
%D%/calc++-parser.stamp \ examples/calc++/calc++-parser.stamp \
%D%/calc++-scanner.cc examples/calc++/calc++-scanner.cc
## -------------------- ## ## -------------------- ##
@@ -42,35 +42,35 @@ CLEANFILES += \
## -------------------- ## ## -------------------- ##
# Avoid using BUILT_SOURCES which is too global. # Avoid using BUILT_SOURCES which is too global.
$(%C%_calc___OBJECTS): $(calc_sources_generated) $(examples_calc___calc___OBJECTS): $(calc_sources_generated)
calc_sources_extracted = \ calc_sources_extracted = \
%D%/calc++-driver.cc \ examples/calc++/calc++-driver.cc \
%D%/calc++-driver.hh \ examples/calc++/calc++-driver.hh \
%D%/calc++-scanner.ll \ examples/calc++/calc++-scanner.ll \
%D%/calc++.cc examples/calc++/calc++.cc
calc_extracted = \ calc_extracted = \
$(calc_sources_extracted) \ $(calc_sources_extracted) \
%D%/calc++-parser.yy examples/calc++/calc++-parser.yy
extracted += $(calc_extracted) extracted += $(calc_extracted)
calc_sources_generated = \ calc_sources_generated = \
%D%/calc++-parser.cc \ examples/calc++/calc++-parser.cc \
%D%/calc++-parser.hh \ examples/calc++/calc++-parser.hh \
%D%/location.hh \ examples/calc++/location.hh \
%D%/position.hh \ examples/calc++/position.hh \
%D%/stack.hh examples/calc++/stack.hh
calc_sources = \ calc_sources = \
$(calc_sources_extracted) \ $(calc_sources_extracted) \
$(calc_sources_generated) $(calc_sources_generated)
if FLEX_CXX_WORKS if BISON_CXX_WORKS
check_PROGRAMS += %D%/calc++ check_PROGRAMS += examples/calc++/calc++
nodist_%C%_calc___SOURCES = \ nodist_examples_calc___calc___SOURCES = \
$(calc_sources) $(calc_sources)
%C%_calc___CPPFLAGS = -I$(top_builddir)/%D% examples_calc___calc___CPPFLAGS = -I$(top_builddir)/examples/calc++
%C%_calc___CXXFLAGS = $(AM_CXXFLAGS) $(FLEX_SCANNER_CXXFLAGS) examples_calc___calc___CXXFLAGS = $(AM_CXXFLAGS) $(FLEX_SCANNER_CXXFLAGS)
dist_TESTS += %D%/calc++.test dist_TESTS += examples/calc++/calc++.test
else else
EXTRA_DIST += %D%/calc++.test EXTRA_DIST += examples/calc++/calc++.test
endif endif
+12 -12
View File
@@ -13,8 +13,8 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
dist_noinst_SCRIPTS = %D%/extexi %D%/test dist_noinst_SCRIPTS = examples/extexi examples/test
TEST_LOG_COMPILER = $(top_srcdir)/%D%/test TEST_LOG_COMPILER = $(top_srcdir)/examples/test
AM_CXXFLAGS = \ AM_CXXFLAGS = \
$(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS) $(WARN_CXXFLAGS) $(WARN_CXXFLAGS_TEST) $(WERROR_CXXFLAGS)
@@ -24,20 +24,20 @@ AM_CXXFLAGS = \
## ------------ ## ## ------------ ##
doc = $(top_srcdir)/doc/bison.texi doc = $(top_srcdir)/doc/bison.texi
extexi = $(top_srcdir)/%D%/extexi extexi = $(top_srcdir)/examples/extexi
extract = VERSION="$(VERSION)" $(PERL) $(extexi) $(doc) -- extract = VERSION="$(VERSION)" $(PERL) -f $(extexi) $(doc) --
extracted = extracted =
CLEANFILES += $(extracted) %D%/extracted.stamp CLEANFILES += $(extracted) examples/extracted.stamp
%D%/extracted.stamp: $(doc) $(extexi) examples/extracted.stamp: $(doc) $(extexi)
$(AM_V_GEN)rm -f $@ $@.tmp $(AM_V_GEN)rm -f $@ $@.tmp
$(AM_V_at)touch $@.tmp $(AM_V_at)touch $@.tmp
$(AM_V_at)$(extract) $(extracted) $(AM_V_at)$(extract) $(extracted)
$(AM_V_at)mv $@.tmp $@ $(AM_V_at)mv $@.tmp $@
$(extracted): %D%/extracted.stamp $(extracted): examples/extracted.stamp
@test -f $@ || rm -f %D%/extracted.stamp @test -f $@ || rm -f examples/extracted.stamp
@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) %D%/extracted.stamp @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) examples/extracted.stamp
include %D%/calc++/local.mk include examples/calc++/local.mk
include %D%/mfcalc/local.mk include examples/mfcalc/local.mk
include %D%/rpcalc/local.mk include examples/rpcalc/local.mk
+12 -8
View File
@@ -18,15 +18,19 @@
## -------------------- ## ## -------------------- ##
BUILT_SOURCES += $(mfcalc_sources) BUILT_SOURCES += $(mfcalc_sources)
CLEANFILES += %D%/mfcalc.[ch] %D%/mfcalc.output CLEANFILES += examples/mfcalc/mfcalc.[ch] examples/mfcalc/mfcalc.output
mfcalc_extracted = %D%/calc.h %D%/mfcalc.y mfcalc_extracted = \
mfcalc_sources = $(mfcalc_extracted) examples/mfcalc/calc.h \
examples/mfcalc/mfcalc.y
mfcalc_sources = \
$(mfcalc_extracted)
extracted += $(mfcalc_extracted) extracted += $(mfcalc_extracted)
check_PROGRAMS += %D%/mfcalc check_PROGRAMS += examples/mfcalc/mfcalc
%C%_mfcalc_LDADD = -lm examples_mfcalc_mfcalc_LDADD = -lm
nodist_%C%_mfcalc_SOURCES = $(mfcalc_sources) nodist_examples_mfcalc_mfcalc_SOURCES = \
$(mfcalc_sources)
%C%_mfcalc_CPPFLAGS = -I$(top_builddir)/%D% examples_mfcalc_mfcalc_CPPFLAGS = -I$(top_builddir)/examples/mfcalc
dist_TESTS += %D%/mfcalc.test dist_TESTS += examples/mfcalc/mfcalc.test
-1
View File
@@ -1,5 +1,4 @@
/calc.h /calc.h
/rpcalc
/rpcalc.c /rpcalc.c
/rpcalc.h /rpcalc.h
/rpcalc.output /rpcalc.output
+11 -8
View File
@@ -18,15 +18,18 @@
## -------------------- ## ## -------------------- ##
BUILT_SOURCES += $(rpcalc_sources) BUILT_SOURCES += $(rpcalc_sources)
CLEANFILES += %D%/rpcalc.[ch] %D%/rpcalc.output CLEANFILES += examples/rpcalc/rpcalc.[ch] examples/rpcalc/rpcalc.output
rpcalc_extracted = %D%/rpcalc.y rpcalc_extracted = \
rpcalc_sources = $(rpcalc_extracted) examples/rpcalc/rpcalc.y
rpcalc_sources = \
$(rpcalc_extracted)
extracted += $(rpcalc_extracted) extracted += $(rpcalc_extracted)
check_PROGRAMS += %D%/rpcalc check_PROGRAMS += examples/rpcalc/rpcalc
%C%_rpcalc_LDADD = -lm examples_rpcalc_rpcalc_LDADD = -lm
nodist_%C%_rpcalc_SOURCES = $(rpcalc_sources) nodist_examples_rpcalc_rpcalc_SOURCES = \
$(rpcalc_sources)
%C%_rpcalc_CPPFLAGS = -I$(top_builddir)/%D% examples_rpcalc_rpcalc_CPPFLAGS = -I$(top_builddir)/examples/rpcalc
dist_TESTS += %D%/rpcalc.test dist_TESTS += examples/rpcalc/rpcalc.test
+5 -11
View File
@@ -16,7 +16,7 @@
*/ */
%debug %debug
%language "c++" %skeleton "lalr1.cc"
%defines %defines
%define api.token.constructor %define api.token.constructor
%define api.value.type variant %define api.value.type variant
@@ -48,17 +48,11 @@ typedef std::list<std::string> strings_type;
namespace std namespace std
{ {
std::ostream& std::ostream&
operator<< (std::ostream& o, const strings_type& ss) operator<< (std::ostream& o, const strings_type& s)
{ {
o << "(" << &ss << ") {"; std::copy (s.begin (), s.end (),
const char *sep = ""; std::ostream_iterator<strings_type::value_type> (o, "\n"));
for (strings_type::const_iterator i = ss.begin(), end = ss.end(); return o;
i != end; ++i)
{
o << sep << *i;
sep = ", ";
}
return o << "}";
} }
} }
+1 -1
Submodule gnulib updated: 74540d44dc...03e96cc338
-2
View File
@@ -272,5 +272,3 @@
/sig-handler.c /sig-handler.c
/unistd.c /unistd.c
/wctype-h.c /wctype-h.c
/lstat.c
/unlink.c
+1 -3
View File
@@ -51,8 +51,6 @@ lib_libbison_a_SOURCES += \
lib/get-errno.c lib/get-errno.c
# The Yacc compatibility library. # The Yacc compatibility library.
if ENABLE_YACC lib_LIBRARIES = $(YACC_LIBRARY)
lib_LIBRARIES = lib/liby.a
EXTRA_LIBRARIES = lib/liby.a EXTRA_LIBRARIES = lib/liby.a
lib_liby_a_SOURCES = lib/main.c lib/yyerror.c lib_liby_a_SOURCES = lib/main.c lib/yyerror.c
endif
-3
View File
@@ -180,6 +180,3 @@
/obstack-printf.m4 /obstack-printf.m4
/extern-inline.m4 /extern-inline.m4
/non-recursive-gnulib-prefix-hack.m4 /non-recursive-gnulib-prefix-hack.m4
/absolute-header.m4
/lstat.m4
/unlink.m4
+12 -15
View File
@@ -242,7 +242,7 @@ AnnotationList__computePredecessorAnnotations (AnnotationList *self, state *s,
{ {
symbol_number contribution_token = symbol_number contribution_token =
InadequacyList__getContributionToken (self->inadequacyNode, ci) InadequacyList__getContributionToken (self->inadequacyNode, ci)
->number; ->content->number;
if (AnnotationList__isContributionAlways (self, ci)) if (AnnotationList__isContributionAlways (self, ci))
{ {
annotation_node->contributions[ci] = NULL; annotation_node->contributions[ci] = NULL;
@@ -541,19 +541,15 @@ AnnotationList__compute_from_inadequacies (
{ {
InadequacyList__prependTo (conflict_node, InadequacyList__prependTo (conflict_node,
&inadequacy_lists[s->number]); &inadequacy_lists[s->number]);
{ aver (AnnotationList__insertInto (
bool b = annotation_node, &annotation_lists[s->number],
AnnotationList__insertInto (annotation_node, s->nitems));
&annotation_lists[s->number],
s->nitems);
aver (b);
}
/* This aver makes sure the /* This aver makes sure the
AnnotationList__computeDominantContribution check above AnnotationList__computeDominantContribution check above
does discard annotations in the simplest case of a S/R does discard annotations in the simplest case of a S/R
conflict with no token precedence. */ conflict with no token precedence. */
aver (!bitset_test (shift_tokens, conflicted_token) aver (!bitset_test (shift_tokens, conflicted_token)
|| symbols[conflicted_token]->prec); || symbols[conflicted_token]->content->prec);
++annotation_counts[s->number]; ++annotation_counts[s->number];
if (contribution_count > *max_contributionsp) if (contribution_count > *max_contributionsp)
*max_contributionsp = contribution_count; *max_contributionsp = contribution_count;
@@ -599,7 +595,7 @@ AnnotationList__debug (AnnotationList const *self, size_t nitems, int spaces)
{ {
symbol_number token = symbol_number token =
InadequacyList__getContributionToken (a->inadequacyNode, ci) InadequacyList__getContributionToken (a->inadequacyNode, ci)
->number; ->content->number;
{ {
int j; int j;
for (j = 0; j < spaces+2; ++j) for (j = 0; j < spaces+2; ++j)
@@ -648,7 +644,7 @@ AnnotationList__computeLookaheadFilter (AnnotationList const *self,
Sbitset biter; Sbitset biter;
symbol_number token = symbol_number token =
InadequacyList__getContributionToken (self->inadequacyNode, ci) InadequacyList__getContributionToken (self->inadequacyNode, ci)
->number; ->content->number;
SBITSET__FOR_EACH (self->contributions[ci], nitems, biter, item) SBITSET__FOR_EACH (self->contributions[ci], nitems, biter, item)
bitset_set (lookahead_filter[item], token); bitset_set (lookahead_filter[item], token);
} }
@@ -683,7 +679,8 @@ AnnotationList__stateMakesContribution (AnnotationList const *self,
return false; return false;
{ {
symbol_number token = symbol_number token =
InadequacyList__getContributionToken (self->inadequacyNode, ci)->number; InadequacyList__getContributionToken (self->inadequacyNode, ci)
->content->number;
Sbitset__Index item; Sbitset__Index item;
Sbitset biter; Sbitset biter;
SBITSET__FOR_EACH (self->contributions[ci], nitems, biter, item) SBITSET__FOR_EACH (self->contributions[ci], nitems, biter, item)
@@ -713,7 +710,7 @@ AnnotationList__computeDominantContribution (AnnotationList const *self,
ContributionIndex ci; ContributionIndex ci;
int actioni; int actioni;
ContributionIndex ci_rr_dominator = ContributionIndex__none; ContributionIndex ci_rr_dominator = ContributionIndex__none;
int shift_precedence = token->prec; int shift_precedence = token->content->prec;
/* If the token has no precedence set, shift is always chosen. */ /* If the token has no precedence set, shift is always chosen. */
if (!shift_precedence) if (!shift_precedence)
@@ -743,7 +740,7 @@ AnnotationList__computeDominantContribution (AnnotationList const *self,
if (reduce_precedence if (reduce_precedence
&& (reduce_precedence < shift_precedence && (reduce_precedence < shift_precedence
|| (reduce_precedence == shift_precedence || (reduce_precedence == shift_precedence
&& token->assoc == right_assoc))) && token->content->prec_node->assoc == right_assoc)))
continue; continue;
if (!AnnotationList__stateMakesContribution (self, nitems, ci, if (!AnnotationList__stateMakesContribution (self, nitems, ci,
lookaheads)) lookaheads))
@@ -751,7 +748,7 @@ AnnotationList__computeDominantContribution (AnnotationList const *self,
/* This uneliminated reduction contributes, so see if it can cause /* This uneliminated reduction contributes, so see if it can cause
an error action. */ an error action. */
if (reduce_precedence == shift_precedence if (reduce_precedence == shift_precedence
&& token->assoc == non_assoc) && token->content->prec_node->assoc == non_assoc)
{ {
/* It's not possible to find split-stable domination over /* It's not possible to find split-stable domination over
shift after a potential %nonassoc. */ shift after a potential %nonassoc. */
+39 -63
View File
@@ -35,25 +35,14 @@ err_status complaint_status = status_none;
bool warnings_are_errors = false; bool warnings_are_errors = false;
/** Whether -Werror/-Wno-error was applied to a warning. */
typedef enum
{
errority_unset = 0, /** No explict status. */
errority_disabled = 1, /** Explictly disabled with -Wno-error=foo. */
errority_enabled = 2 /** Explictly enabled with -Werror=foo. */
} errority;
/** For each warning type, its errority. */
static errority errority_flag[warnings_size];
/** Diagnostics severity. */ /** Diagnostics severity. */
typedef enum typedef enum
{ {
severity_disabled = 0, /**< Explicitly disabled via -Wno-foo. */ severity_disabled = 0,
severity_unset = 1, /**< Unspecified status. */ severity_unset = 1,
severity_warning = 2, /**< A warning. */ severity_warning = 2,
severity_error = 3, /**< An error (continue, but die soon). */ severity_error = 3,
severity_fatal = 4 /**< Fatal error (die now). */ severity_fatal = 4
} severity; } severity;
@@ -114,26 +103,32 @@ warning_argmatch (char const *arg, size_t no, size_t err)
no = !no; no = !no;
} }
size_t b; if (no)
for (b = 0; b < warnings_size; ++b) {
if (value & 1 << b) size_t b;
{ for (b = 0; b < warnings_size; ++b)
if (err && no) if (value & 1 << b)
/* -Wno-error=foo. */
errority_flag[b] = errority_disabled;
else if (err && !no)
{ {
/* -Werror=foo: enables -Wfoo. */ if (err)
errority_flag[b] = errority_enabled; {
warnings_flag[b] = severity_warning; /* -Wno-error=foo: if foo enabled as an error,
make it a warning. */
if (warnings_flag[b] == severity_error)
warnings_flag[b] = severity_warning;
}
else
/* -Wno-foo. */
warnings_flag[b] = severity_disabled;
} }
else if (no) }
/* -Wno-foo. */ else
warnings_flag[b] = severity_disabled; {
else size_t b;
/* -Wfoo. */ for (b = 0; b < warnings_size; ++b)
warnings_flag[b] = severity_warning; if (value & 1 << b)
} /* -Wfoo and -Werror=foo. */
warnings_flag[b] = err ? severity_error : severity_warning;
}
} }
/** Decode a comma-separated list of arguments from -W. /** Decode a comma-separated list of arguments from -W.
@@ -150,13 +145,13 @@ warnings_argmatch (char *args)
if (STREQ (args, "error")) if (STREQ (args, "error"))
warnings_are_errors = true; warnings_are_errors = true;
else if (STREQ (args, "no-error")) else if (STREQ (args, "no-error"))
warnings_are_errors = false; {
warnings_are_errors = false;
warning_argmatch ("no-error=everything", 3, 6);
}
else else
{ {
/* The length of the possible 'no-' prefix: 3, or 0. */
size_t no = STRPREFIX_LIT ("no-", args) ? 3 : 0; size_t no = STRPREFIX_LIT ("no-", args) ? 3 : 0;
/* The length of the possible 'error=' (possibly after
'no-') prefix: 6, or 0. */
size_t err = STRPREFIX_LIT ("error=", args + no) ? 6 : 0; size_t err = STRPREFIX_LIT ("error=", args + no) ? 6 : 0;
warning_argmatch (args, no, err); warning_argmatch (args, no, err);
@@ -178,46 +173,27 @@ complain_init (void)
size_t b; size_t b;
for (b = 0; b < warnings_size; ++b) for (b = 0; b < warnings_size; ++b)
{ warnings_flag[b] = (1 << b & warnings_default
warnings_flag[b] = (1 << b & warnings_default ? severity_warning
? severity_warning : severity_unset);
: severity_unset);
errority_flag[b] = errority_unset;
}
} }
/* A diagnostic with FLAGS is about to be issued. With what severity?
(severity_fatal, severity_error, severity_disabled, or
severity_warning.) */
static severity static severity
warning_severity (warnings flags) warning_severity (warnings flags)
{ {
if (flags & fatal) if (flags & fatal)
/* Diagnostics about fatal errors. */
return severity_fatal; return severity_fatal;
else if (flags & complaint) else if (flags & complaint)
/* Diagnostics about errors. */
return severity_error; return severity_error;
else else
{ {
/* Diagnostics about warnings. */
severity res = severity_disabled; severity res = severity_disabled;
size_t b; size_t b;
for (b = 0; b < warnings_size; ++b) for (b = 0; b < warnings_size; ++b)
if (flags & 1 << b) if (flags & 1 << b)
{ res = res < warnings_flag[b] ? warnings_flag[b] : res;
res = res < warnings_flag[b] ? warnings_flag[b] : res; if (res == severity_warning && warnings_are_errors)
/* If the diagnostic is enabled, and -Werror is enabled, res = severity_error;
and -Wno-error=foo was not explicitly requested, this
is an error. */
if (res == severity_warning
&& (errority_flag[b] == errority_enabled
|| (warnings_are_errors
&& errority_flag[b] != errority_disabled)))
res = severity_error;
}
return res; return res;
} }
} }
+6 -6
View File
@@ -128,14 +128,14 @@ void deprecated_directive (location const *loc,
void duplicate_directive (char const *directive, void duplicate_directive (char const *directive,
location first, location second); location first, location second);
/** Warnings treated as errors shouldn't stop the execution as regular /** Warnings treated as errors shouldn't stop the execution as regular errors
errors should (because due to their nature, it is safe to go should (because due to their nature, it is safe to go on). Thus, there are
on). Thus, there are three possible execution statuses. */ three possible execution statuses. */
typedef enum typedef enum
{ {
status_none, /**< No diagnostic issued so far. */ status_none,
status_warning_as_error, /**< A warning was issued (but no error). */ status_warning_as_error,
status_complaint /**< An error was issued. */ status_complaint
} err_status; } err_status;
/** Whether an error was reported. */ /** Whether an error was reported. */
+81 -60
View File
@@ -53,7 +53,8 @@ enum conflict_resolution
reduce_resolution, reduce_resolution,
left_resolution, left_resolution,
right_resolution, right_resolution,
nonassoc_resolution nonassoc_resolution,
uncomparable_resolution
}; };
@@ -90,6 +91,7 @@ log_resolution (rule *r, symbol_number token,
break; break;
case nonassoc_resolution: case nonassoc_resolution:
case uncomparable_resolution:
obstack_printf (&solved_conflicts_obstack, obstack_printf (&solved_conflicts_obstack,
_(" Conflict between rule %d and token %s" _(" Conflict between rule %d and token %s"
" resolved as an error"), " resolved as an error"),
@@ -104,7 +106,7 @@ log_resolution (rule *r, symbol_number token,
case shift_resolution: case shift_resolution:
obstack_printf (&solved_conflicts_obstack, obstack_printf (&solved_conflicts_obstack,
" (%s < %s)", " (%s < %s)",
r->prec->tag, r->prec->symbol->tag,
symbols[token]->tag); symbols[token]->tag);
break; break;
@@ -112,7 +114,7 @@ log_resolution (rule *r, symbol_number token,
obstack_printf (&solved_conflicts_obstack, obstack_printf (&solved_conflicts_obstack,
" (%s < %s)", " (%s < %s)",
symbols[token]->tag, symbols[token]->tag,
r->prec->tag); r->prec->symbol->tag);
break; break;
case left_resolution: case left_resolution:
@@ -132,6 +134,12 @@ log_resolution (rule *r, symbol_number token,
" (%%nonassoc %s)", " (%%nonassoc %s)",
symbols[token]->tag); symbols[token]->tag);
break; break;
case uncomparable_resolution:
obstack_printf (&solved_conflicts_obstack,
" (%s uncomparable with %s)",
r->prec->symbol->tag,
symbols[token]->tag);
break;
} }
obstack_sgrow (&solved_conflicts_obstack, ".\n"); obstack_sgrow (&solved_conflicts_obstack, ".\n");
@@ -161,6 +169,7 @@ log_resolution (rule *r, symbol_number token,
xml_escape (symbols[token]->tag)); xml_escape (symbols[token]->tag));
break; break;
case uncomparable_resolution:
case nonassoc_resolution: case nonassoc_resolution:
obstack_printf (&solved_conflicts_xml_obstack, obstack_printf (&solved_conflicts_xml_obstack,
" <resolution rule=\"%d\" symbol=\"%s\"" " <resolution rule=\"%d\" symbol=\"%s\""
@@ -176,7 +185,7 @@ log_resolution (rule *r, symbol_number token,
case shift_resolution: case shift_resolution:
obstack_printf (&solved_conflicts_xml_obstack, obstack_printf (&solved_conflicts_xml_obstack,
"%s &lt; %s", "%s &lt; %s",
xml_escape_n (0, r->prec->tag), xml_escape_n (0, r->prec->symbol->tag),
xml_escape_n (1, symbols[token]->tag)); xml_escape_n (1, symbols[token]->tag));
break; break;
@@ -184,7 +193,7 @@ log_resolution (rule *r, symbol_number token,
obstack_printf (&solved_conflicts_xml_obstack, obstack_printf (&solved_conflicts_xml_obstack,
"%s &lt; %s", "%s &lt; %s",
xml_escape_n (0, symbols[token]->tag), xml_escape_n (0, symbols[token]->tag),
xml_escape_n (1, r->prec->tag)); xml_escape_n (1, r->prec->symbol->tag));
break; break;
case left_resolution: case left_resolution:
@@ -203,7 +212,13 @@ log_resolution (rule *r, symbol_number token,
obstack_printf (&solved_conflicts_xml_obstack, obstack_printf (&solved_conflicts_xml_obstack,
"%%nonassoc %s", "%%nonassoc %s",
xml_escape (symbols[token]->tag)); xml_escape (symbols[token]->tag));
break; break;
case uncomparable_resolution:
obstack_printf (&solved_conflicts_xml_obstack,
"%s uncomparable with %s",
xml_escape_n (0, symbols[token]->tag),
xml_escape_n (1, r->prec->symbol->tag));
break;
} }
obstack_sgrow (&solved_conflicts_xml_obstack, "</resolution>\n"); obstack_sgrow (&solved_conflicts_xml_obstack, "</resolution>\n");
@@ -243,7 +258,6 @@ flush_reduce (bitset lookahead_tokens, int token)
bitset_reset (lookahead_tokens, token); bitset_reset (lookahead_tokens, token);
} }
/*------------------------------------------------------------------. /*------------------------------------------------------------------.
| Attempt to resolve shift-reduce conflict for one rule by means of | | Attempt to resolve shift-reduce conflict for one rule by means of |
| precedence declarations. It has already been checked that the | | precedence declarations. It has already been checked that the |
@@ -263,66 +277,73 @@ resolve_sr_conflict (state *s, int ruleno, symbol **errors, int *nerrs)
reductions *reds = s->reductions; reductions *reds = s->reductions;
/* Find the rule to reduce by to get precedence of reduction. */ /* Find the rule to reduce by to get precedence of reduction. */
rule *redrule = reds->rules[ruleno]; rule *redrule = reds->rules[ruleno];
int redprec = redrule->prec->prec; prec_node *redprecsym = redrule->prec->prec_node;
bitset lookahead_tokens = reds->lookahead_tokens[ruleno]; bitset lookahead_tokens = reds->lookahead_tokens[ruleno];
for (i = 0; i < ntokens; i++) for (i = 0; i < ntokens; i++)
if (bitset_test (lookahead_tokens, i) if (bitset_test (lookahead_tokens, i)
&& bitset_test (lookahead_set, i) && bitset_test (lookahead_set, i))
&& symbols[i]->prec)
{ {
/* Shift-reduce conflict occurs for token number i if (redprecsym && symbols[i]->content->prec_node)
and it has a precedence.
The precedence of shifting is that of token i. */
if (symbols[i]->prec < redprec)
{ {
register_precedence (redrule->prec->number, i); /* Shift-reduce conflict occurs for token number i
log_resolution (redrule, i, reduce_resolution); and it has a precedence.
flush_shift (s, i); The precedence of shifting is that of token i. */
} if (is_prec_superior (redprecsym, symbols[i]->content->prec_node))
else if (symbols[i]->prec > redprec) {
{ register_precedence (redrule->prec->number, i);
register_precedence (i, redrule->prec->number); log_resolution (redrule, i, reduce_resolution);
log_resolution (redrule, i, shift_resolution); flush_shift (s, i);
flush_reduce (lookahead_tokens, i); }
else if (is_prec_superior (symbols[i]->content->prec_node,
redprecsym))
{
register_precedence (i, redrule->prec->number);
log_resolution (redrule, i, shift_resolution);
flush_reduce (lookahead_tokens, i);
}
else if (is_prec_equal (redprecsym, symbols[i]->content->prec_node))
/* Matching precedence levels.
For non-defined associativity, keep both: unexpected
associativity conflict.
For left associativity, keep only the reduction.
For right associativity, keep only the shift.
For nonassociativity, keep neither. */
switch (symbols[i]->content->prec_node->assoc)
{
case undef_assoc:
break;
case precedence_assoc:
break;
case right_assoc:
register_assoc (i, redrule->prec->number);
log_resolution (redrule, i, right_resolution);
flush_reduce (lookahead_tokens, i);
break;
case left_assoc:
register_assoc (i, redrule->prec->number);
log_resolution (redrule, i, left_resolution);
flush_shift (s, i);
break;
case non_assoc:
register_assoc (i, redrule->prec->number);
log_resolution (redrule, i, nonassoc_resolution);
flush_shift (s, i);
flush_reduce (lookahead_tokens, i);
/* Record an explicit error for this token. */
errors[(*nerrs)++] = symbols[i];
break;
}
else
log_resolution (redrule, i, uncomparable_resolution);
} }
else else
/* Matching precedence levels. log_resolution (redrule, i, uncomparable_resolution);
For non-defined associativity, keep both: unexpected
associativity conflict.
For left associativity, keep only the reduction.
For right associativity, keep only the shift.
For nonassociativity, keep neither. */
switch (symbols[i]->assoc)
{
case undef_assoc:
abort ();
case precedence_assoc:
break;
case right_assoc:
register_assoc (i, redrule->prec->number);
log_resolution (redrule, i, right_resolution);
flush_reduce (lookahead_tokens, i);
break;
case left_assoc:
register_assoc (i, redrule->prec->number);
log_resolution (redrule, i, left_resolution);
flush_shift (s, i);
break;
case non_assoc:
register_assoc (i, redrule->prec->number);
log_resolution (redrule, i, nonassoc_resolution);
flush_shift (s, i);
flush_reduce (lookahead_tokens, i);
/* Record an explicit error for this token. */
errors[(*nerrs)++] = symbols[i];
break;
}
} }
} }
@@ -354,7 +375,7 @@ set_conflicts (state *s, symbol **errors)
check for shift-reduce conflict, and try to resolve using check for shift-reduce conflict, and try to resolve using
precedence. */ precedence. */
for (i = 0; i < reds->num; ++i) for (i = 0; i < reds->num; ++i)
if (reds->rules[i]->prec && reds->rules[i]->prec->prec if (reds->rules[i]->prec /* && reds->rules[i]->prec->prec */
&& !bitset_disjoint_p (reds->lookahead_tokens[i], lookahead_set)) && !bitset_disjoint_p (reds->lookahead_tokens[i], lookahead_set))
resolve_sr_conflict (s, i, errors, &nerrs); resolve_sr_conflict (s, i, errors, &nerrs);
+15 -35
View File
@@ -51,17 +51,8 @@ char *spec_defines_file = NULL; /* for --defines. */
char *parser_file_name; char *parser_file_name;
/* All computed output file names. */ /* All computed output file names. */
typedef struct generated_file static char **file_names = NULL;
{ static int file_names_count = 0;
/** File name. */
char *name;
/** Whether is a generated source file (e.g., *.c, *.java...), as
opposed to the report file (e.g., *.output). When late errors
are detected, generated source files are removed. */
bool is_source;
} generated_file;
static generated_file *generated_files = NULL;
static int generated_files_size = 0;
uniqstr grammar_file = NULL; uniqstr grammar_file = NULL;
uniqstr current_file = NULL; uniqstr current_file = NULL;
@@ -341,21 +332,21 @@ compute_output_file_names (void)
{ {
if (! spec_graph_file) if (! spec_graph_file)
spec_graph_file = concat2 (all_but_tab_ext, ".dot"); spec_graph_file = concat2 (all_but_tab_ext, ".dot");
output_file_name_check (&spec_graph_file, false); output_file_name_check (&spec_graph_file);
} }
if (xml_flag) if (xml_flag)
{ {
if (! spec_xml_file) if (! spec_xml_file)
spec_xml_file = concat2 (all_but_tab_ext, ".xml"); spec_xml_file = concat2 (all_but_tab_ext, ".xml");
output_file_name_check (&spec_xml_file, false); output_file_name_check (&spec_xml_file);
} }
if (report_flag) if (report_flag)
{ {
if (!spec_verbose_file) if (!spec_verbose_file)
spec_verbose_file = concat2 (all_but_tab_ext, OUTPUT_EXT); spec_verbose_file = concat2 (all_but_tab_ext, OUTPUT_EXT);
output_file_name_check (&spec_verbose_file, false); output_file_name_check (&spec_verbose_file);
} }
free (all_but_tab_ext); free (all_but_tab_ext);
@@ -364,7 +355,7 @@ compute_output_file_names (void)
} }
void void
output_file_name_check (char **file_name, bool source) output_file_name_check (char **file_name)
{ {
bool conflict = false; bool conflict = false;
if (STREQ (*file_name, grammar_file)) if (STREQ (*file_name, grammar_file))
@@ -376,11 +367,11 @@ output_file_name_check (char **file_name, bool source)
else else
{ {
int i; int i;
for (i = 0; i < generated_files_size; i++) for (i = 0; i < file_names_count; i++)
if (STREQ (generated_files[i].name, *file_name)) if (STREQ (file_names[i], *file_name))
{ {
complain (NULL, Wother, _("conflicting outputs to file %s"), complain (NULL, Wother, _("conflicting outputs to file %s"),
quote (generated_files[i].name)); quote (*file_name));
conflict = true; conflict = true;
} }
} }
@@ -391,23 +382,12 @@ output_file_name_check (char **file_name, bool source)
} }
else else
{ {
generated_files = xnrealloc (generated_files, ++generated_files_size, file_names = xnrealloc (file_names, ++file_names_count,
sizeof *generated_files); sizeof *file_names);
generated_files[generated_files_size-1].name = xstrdup (*file_name); file_names[file_names_count-1] = xstrdup (*file_name);
generated_files[generated_files_size-1].is_source = source;
} }
} }
void
unlink_generated_sources (void)
{
int i;
for (i = 0; i < generated_files_size; i++)
if (generated_files[i].is_source)
/* Ignore errors. The file might not even exist. */
unlink (generated_files[i].name);
}
void void
output_file_names_free (void) output_file_names_free (void)
{ {
@@ -420,8 +400,8 @@ output_file_names_free (void)
free (dir_prefix); free (dir_prefix);
{ {
int i; int i;
for (i = 0; i < generated_files_size; i++) for (i = 0; i < file_names_count; i++)
free (generated_files[i].name); free (file_names[i]);
} }
free (generated_files); free (file_names);
} }
+1 -9
View File
@@ -63,15 +63,7 @@ extern char *all_but_ext;
void compute_output_file_names (void); void compute_output_file_names (void);
void output_file_names_free (void); void output_file_names_free (void);
void output_file_name_check (char **file_name);
/** Record that we generate file \a file_name.
* \param source whether this is a source file (*c, *.java...)
* as opposed to a report (*.output, *.dot...).
*/
void output_file_name_check (char **file_name, bool source);
/** Remove all the generated source files. */
void unlink_generated_sources (void);
FILE *xfopen (const char *name, char const *mode); FILE *xfopen (const char *name, char const *mode);
void xfclose (FILE *ptr); void xfclose (FILE *ptr);
+11 -9
View File
@@ -44,6 +44,8 @@ int nvars = 0;
symbol_number *token_translations = NULL; symbol_number *token_translations = NULL;
enum braces_state prec_braces = 0;
int max_user_token_number = 256; int max_user_token_number = 256;
bool bool
@@ -65,19 +67,19 @@ rule_useless_in_parser_p (rule const *r)
} }
void void
rule_lhs_print (rule const *r, symbol const *previous_lhs, FILE *out) rule_lhs_print (rule const *r, sym_content const *previous_lhs, FILE *out)
{ {
fprintf (out, " %3d ", r->number); fprintf (out, " %3d ", r->number);
if (previous_lhs != r->lhs) if (previous_lhs != r->lhs)
fprintf (out, "%s:", r->lhs->tag); fprintf (out, "%s:", r->lhs->symbol->tag);
else else
fprintf (out, "%*s|", (int) strlen (previous_lhs->tag), ""); fprintf (out, "%*s|", (int) strlen (previous_lhs->symbol->tag), "");
} }
void void
rule_lhs_print_xml (rule const *r, FILE *out, int level) rule_lhs_print_xml (rule const *r, FILE *out, int level)
{ {
xml_printf (out, level, "<lhs>%s</lhs>", r->lhs->tag); xml_printf (out, level, "<lhs>%s</lhs>", r->lhs->symbol->tag);
} }
size_t size_t
@@ -158,7 +160,7 @@ grammar_rules_partial_print (FILE *out, const char *title,
{ {
rule_number r; rule_number r;
bool first = true; bool first = true;
symbol *previous_lhs = NULL; sym_content *previous_lhs = NULL;
/* rule # : LHS -> RHS */ /* rule # : LHS -> RHS */
for (r = 0; r < nrules + nuseless_productions; r++) for (r = 0; r < nrules + nuseless_productions; r++)
@@ -209,7 +211,7 @@ grammar_rules_print_xml (FILE *out, int level)
rules[r].number, usefulness); rules[r].number, usefulness);
if (rules[r].precsym) if (rules[r].precsym)
fprintf (out, " percent_prec=\"%s\"", fprintf (out, " percent_prec=\"%s\"",
xml_escape (rules[r].precsym->tag)); xml_escape (rules[r].precsym->symbol->tag));
fputs (">\n", out); fputs (">\n", out);
} }
rule_lhs_print_xml (&rules[r], out, level + 3); rule_lhs_print_xml (&rules[r], out, level + 3);
@@ -239,7 +241,7 @@ grammar_dump (FILE *out, const char *title)
for (i = ntokens; i < nsyms; i++) for (i = ntokens; i < nsyms; i++)
fprintf (out, "%5d %5d %5d %s\n", fprintf (out, "%5d %5d %5d %s\n",
i, i,
symbols[i]->prec, symbols[i]->assoc, symbols[i]->content->prec, symbols[i]->content->prec_node->assoc,
symbols[i]->tag); symbols[i]->tag);
fprintf (out, "\n\n"); fprintf (out, "\n\n");
} }
@@ -262,7 +264,7 @@ grammar_dump (FILE *out, const char *title)
fprintf (out, "%3d (%2d, %2d, %2d, %2u-%2u) %2d ->", fprintf (out, "%3d (%2d, %2d, %2d, %2u-%2u) %2d ->",
i, i,
rule_i->prec ? rule_i->prec->prec : 0, rule_i->prec ? rule_i->prec->prec : 0,
rule_i->prec ? rule_i->prec->assoc : 0, rule_i->prec ? rule_i->prec->prec_node->assoc : 0,
rule_i->useful, rule_i->useful,
rhs_itemno, rhs_itemno,
rhs_itemno + rhs_count - 1, rhs_itemno + rhs_count - 1,
@@ -280,7 +282,7 @@ grammar_dump (FILE *out, const char *title)
rule_number r; rule_number r;
for (r = 0; r < nrules + nuseless_productions; r++) for (r = 0; r < nrules + nuseless_productions; r++)
{ {
fprintf (out, "%-5d %s:", r, rules[r].lhs->tag); fprintf (out, "%-5d %s:", r, rules[r].lhs->symbol->tag);
rule_rhs_print (&rules[r], out); rule_rhs_print (&rules[r], out);
fprintf (out, "\n"); fprintf (out, "\n");
} }
+16 -4
View File
@@ -117,6 +117,17 @@ typedef int item_number;
extern item_number *ritem; extern item_number *ritem;
extern unsigned int nritems; extern unsigned int nritems;
enum braces_state
{
default_braces_state,
gprec_seen,
group_name_seen,
braces_seen
};
/* Marker for the lexer and parser, to correctly interpret braces. */
extern enum braces_state prec_braces;
/* There is weird relationship between OT1H item_number and OTOH /* There is weird relationship between OT1H item_number and OTOH
symbol_number and rule_number: we store the latter in symbol_number and rule_number: we store the latter in
item_number. symbol_number values are stored as-is, while item_number. symbol_number values are stored as-is, while
@@ -180,17 +191,17 @@ typedef struct
except if some rules are useless. */ except if some rules are useless. */
rule_number number; rule_number number;
symbol *lhs; sym_content *lhs;
item_number *rhs; item_number *rhs;
/* This symbol provides both the associativity, and the precedence. */ /* This symbol provides both the associativity, and the precedence. */
symbol *prec; sym_content *prec;
int dprec; int dprec;
int merger; int merger;
/* This symbol was attached to the rule via %prec. */ /* This symbol was attached to the rule via %prec. */
symbol *precsym; sym_content *precsym;
location location; location location;
bool useful; bool useful;
@@ -220,7 +231,8 @@ bool rule_useless_in_parser_p (rule const *r);
/* Print this rule's number and lhs on OUT. If a PREVIOUS_LHS was /* Print this rule's number and lhs on OUT. If a PREVIOUS_LHS was
already displayed (by a previous call for another rule), avoid already displayed (by a previous call for another rule), avoid
useless repetitions. */ useless repetitions. */
void rule_lhs_print (rule const *r, symbol const *previous_lhs, FILE *out); void rule_lhs_print (rule const *r, sym_content const *previous_lhs,
FILE *out);
void rule_lhs_print_xml (rule const *r, FILE *out, int level); void rule_lhs_print_xml (rule const *r, FILE *out, int level);
/* Return the length of the RHS. */ /* Return the length of the RHS. */
+1 -1
View File
@@ -93,7 +93,7 @@ no_reduce_bitset_init (state const *s, bitset *no_reduce_set)
bitset_set (*no_reduce_set, TRANSITION_SYMBOL (s->transitions, n)); bitset_set (*no_reduce_set, TRANSITION_SYMBOL (s->transitions, n));
for (n = 0; n < s->errs->num; ++n) for (n = 0; n < s->errs->num; ++n)
if (s->errs->symbols[n]) if (s->errs->symbols[n])
bitset_set (*no_reduce_set, s->errs->symbols[n]->number); bitset_set (*no_reduce_set, s->errs->symbols[n]->content->number);
} }
static void static void
+2 -2
View File
@@ -424,7 +424,7 @@ ielr_item_has_lookahead (state *s, symbol_number lhs, size_t item,
if (item_number_is_rule_number (ritem[s->items[item] - 2])) if (item_number_is_rule_number (ritem[s->items[item] - 2]))
{ {
state **predecessor; state **predecessor;
aver (lhs != accept->number); aver (lhs != accept->content->number);
for (predecessor = predecessors[s->number]; for (predecessor = predecessors[s->number];
*predecessor; *predecessor;
++predecessor) ++predecessor)
@@ -580,7 +580,7 @@ typedef struct state_list {
static void static void
ielr_compute_goto_follow_set (bitsetv follow_kernel_items, ielr_compute_goto_follow_set (bitsetv follow_kernel_items,
bitsetv always_follows, state_list *s, bitsetv always_follows, state_list *s,
symbol *n, bitset follow_set) sym_content *n, bitset follow_set)
{ {
goto_number n_goto = map_goto (s->lr0Isocore->state->number, n->number); goto_number n_goto = map_goto (s->lr0Isocore->state->number, n->number);
bitset_copy (follow_set, always_follows[n_goto]); bitset_copy (follow_set, always_follows[n_goto]);
+23 -19
View File
@@ -67,13 +67,17 @@ static goto_number **includes;
static goto_list **lookback; static goto_list **lookback;
void void
set_goto_map (void) set_goto_map (void)
{ {
state_number s; state_number s;
goto_number *temp_map = xnmalloc (nvars + 1, sizeof *temp_map); goto_number *temp_map;
goto_map = xcalloc (nvars + 1, sizeof *goto_map); goto_map = xcalloc (nvars + 1, sizeof *goto_map);
temp_map = xnmalloc (nvars + 1, sizeof *temp_map);
ngotos = 0; ngotos = 0;
for (s = 0; s < nstates; ++s) for (s = 0; s < nstates; ++s)
{ {
@@ -128,13 +132,16 @@ set_goto_map (void)
goto_number goto_number
map_goto (state_number s0, symbol_number sym) map_goto (state_number s0, symbol_number sym)
{ {
goto_number low = goto_map[sym - ntokens]; goto_number high;
goto_number high = goto_map[sym - ntokens + 1] - 1; goto_number low;
goto_number middle;
state_number s;
low = goto_map[sym - ntokens];
high = goto_map[sym - ntokens + 1] - 1;
for (;;) for (;;)
{ {
goto_number middle;
state_number s;
aver (low <= high); aver (low <= high);
middle = (low + high) / 2; middle = (low + high) / 2;
s = from_state[middle]; s = from_state[middle];
@@ -405,6 +412,7 @@ static void
lookahead_tokens_print (FILE *out) lookahead_tokens_print (FILE *out)
{ {
state_number i; state_number i;
int j, k;
fprintf (out, "Lookahead tokens: BEGIN\n"); fprintf (out, "Lookahead tokens: BEGIN\n");
for (i = 0; i < nstates; ++i) for (i = 0; i < nstates; ++i)
{ {
@@ -413,25 +421,21 @@ lookahead_tokens_print (FILE *out)
int n_lookahead_tokens = 0; int n_lookahead_tokens = 0;
if (reds->lookahead_tokens) if (reds->lookahead_tokens)
{ for (k = 0; k < reds->num; ++k)
int j; if (reds->lookahead_tokens[k])
for (j = 0; j < reds->num; ++j) ++n_lookahead_tokens;
if (reds->lookahead_tokens[j])
++n_lookahead_tokens;
}
fprintf (out, "State %d: %d lookahead tokens\n", fprintf (out, "State %d: %d lookahead tokens\n",
i, n_lookahead_tokens); i, n_lookahead_tokens);
if (reds->lookahead_tokens) if (reds->lookahead_tokens)
{ for (j = 0; j < reds->num; ++j)
int j, k; BITSET_FOR_EACH (iter, reds->lookahead_tokens[j], k, 0)
for (j = 0; j < reds->num; ++j) {
BITSET_FOR_EACH (iter, reds->lookahead_tokens[j], k, 0) fprintf (out, " on %d (%s) -> rule %d\n",
fprintf (out, " on %d (%s) -> rule %d\n", k, symbols[k]->tag,
k, symbols[k]->tag, reds->rules[j]->number);
reds->rules[j]->number); };
}
} }
fprintf (out, "Lookahead tokens: END\n"); fprintf (out, "Lookahead tokens: END\n");
} }
+1 -3
View File
@@ -111,9 +111,7 @@ BUILT_SOURCES += \
## yacc. ## ## yacc. ##
## ------ ## ## ------ ##
if ENABLE_YACC bin_SCRIPTS = $(YACC_SCRIPT)
bin_SCRIPTS = src/yacc
endif
EXTRA_SCRIPTS = src/yacc EXTRA_SCRIPTS = src/yacc
MOSTLYCLEANFILES += src/yacc MOSTLYCLEANFILES += src/yacc
+1 -1
View File
@@ -188,7 +188,7 @@ location_caret (location loc, FILE *out)
/* 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. */
{ {
int c = getc (caret_info.source); char c = getc (caret_info.source);
if (c != EOF) if (c != EOF)
{ {
/* Quote the file, indent by a single column. */ /* Quote the file, indent by a single column. */
+7 -8
View File
@@ -299,9 +299,8 @@ muscle_location_grow (char const *key, location loc)
#define COMMON_DECODE(Value) \ #define COMMON_DECODE(Value) \
case '$': \ case '$': \
++(Value); aver (*(Value) == '['); \ aver (*++(Value) == ']'); \
++(Value); aver (*(Value) == ']'); \ aver (*++(Value) == '['); \
++(Value); aver (*(Value) == '['); \
obstack_sgrow (&muscle_obstack, "$"); \ obstack_sgrow (&muscle_obstack, "$"); \
break; \ break; \
case '@': \ case '@': \
@@ -350,7 +349,7 @@ location_decode (char const *value)
location loc; location loc;
aver (value); aver (value);
aver (*value == '['); aver (*value == '[');
++value; aver (*value == '['); aver (*++value == '[');
while (*++value) while (*++value)
switch (*value) switch (*value)
{ {
@@ -361,16 +360,16 @@ location_decode (char const *value)
case ']': case ']':
{ {
char *boundary_str; char *boundary_str;
++value; aver (*value == ']'); aver (*++value == ']');
boundary_str = obstack_finish0 (&muscle_obstack); boundary_str = obstack_finish0 (&muscle_obstack);
switch (*++value) switch (*++value)
{ {
case ',': case ',':
boundary_set_from_string (&loc.start, boundary_str); boundary_set_from_string (&loc.start, boundary_str);
obstack_free (&muscle_obstack, boundary_str); obstack_free (&muscle_obstack, boundary_str);
++value; aver (*value == ' '); aver (*++value == ' ');
++value; aver (*value == '['); aver (*++value == '[');
++value; aver (*value == '['); aver (*++value == '[');
break; break;
case '\0': case '\0':
boundary_set_from_string (&loc.end, boundary_str); boundary_set_from_string (&loc.end, boundary_str);
+12 -15
View File
@@ -149,7 +149,7 @@ prepare_symbols (void)
MUSCLE_INSERT_INT ("tokens_number", ntokens); MUSCLE_INSERT_INT ("tokens_number", ntokens);
MUSCLE_INSERT_INT ("nterms_number", nvars); MUSCLE_INSERT_INT ("nterms_number", nvars);
MUSCLE_INSERT_INT ("symbols_number", nsyms); MUSCLE_INSERT_INT ("symbols_number", nsyms);
MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number); MUSCLE_INSERT_INT ("undef_token_number", undeftoken->content->number);
MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number); MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
muscle_insert_symbol_number_table ("translate", muscle_insert_symbol_number_table ("translate",
@@ -197,7 +197,7 @@ prepare_symbols (void)
int i; int i;
int *values = xnmalloc (ntokens, sizeof *values); int *values = xnmalloc (ntokens, sizeof *values);
for (i = 0; i < ntokens; ++i) for (i = 0; i < ntokens; ++i)
values[i] = symbols[i]->user_token_number; values[i] = symbols[i]->content->user_token_number;
muscle_insert_int_table ("toknum", values, muscle_insert_int_table ("toknum", values,
values[0], 1, ntokens); values[0], 1, ntokens);
free (values); free (values);
@@ -283,9 +283,9 @@ prepare_states (void)
static int static int
symbol_type_name_cmp (const symbol **lhs, const symbol **rhs) symbol_type_name_cmp (const symbol **lhs, const symbol **rhs)
{ {
int res = uniqstr_cmp ((*lhs)->type_name, (*rhs)->type_name); int res = uniqstr_cmp ((*lhs)->content->type_name, (*rhs)->content->type_name);
if (!res) if (!res)
res = (*lhs)->number - (*rhs)->number; res = (*lhs)->content->number - (*rhs)->content->number;
return res; return res;
} }
@@ -320,8 +320,9 @@ type_names_output (FILE *out)
/* The index of the first symbol of the current type-name. */ /* The index of the first symbol of the current type-name. */
int i0 = i; int i0 = i;
fputs (i ? ",\n[" : "[", out); fputs (i ? ",\n[" : "[", out);
for (; i < nsyms && syms[i]->type_name == syms[i0]->type_name; ++i) for (; i < nsyms
fprintf (out, "%s%d", i != i0 ? ", " : "", syms[i]->number); && syms[i]->content->type_name == syms[i0]->content->type_name; ++i)
fprintf (out, "%s%d", i != i0 ? ", " : "", syms[i]->content->number);
fputs ("]", out); fputs ("]", out);
} }
fputs ("])\n\n", out); fputs ("])\n\n", out);
@@ -428,20 +429,21 @@ prepare_symbol_definitions (void)
MUSCLE_INSERT_STRING (key, sym->tag); MUSCLE_INSERT_STRING (key, sym->tag);
SET_KEY ("user_number"); SET_KEY ("user_number");
MUSCLE_INSERT_INT (key, sym->user_token_number); MUSCLE_INSERT_INT (key, sym->content->user_token_number);
SET_KEY ("is_token"); SET_KEY ("is_token");
MUSCLE_INSERT_INT (key, MUSCLE_INSERT_INT (key,
i < ntokens && sym != errtoken && sym != undeftoken); i < ntokens && sym != errtoken && sym != undeftoken);
SET_KEY ("number"); SET_KEY ("number");
MUSCLE_INSERT_INT (key, sym->number); MUSCLE_INSERT_INT (key, sym->content->number);
SET_KEY ("has_type"); SET_KEY ("has_type");
MUSCLE_INSERT_INT (key, !!sym->type_name); MUSCLE_INSERT_INT (key, !!sym->content->type_name);
SET_KEY ("type"); SET_KEY ("type");
MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : ""); MUSCLE_INSERT_STRING (key, sym->content->type_name
? sym->content->type_name : "");
{ {
int j; int j;
@@ -704,11 +706,6 @@ output (void)
/* Process the selected skeleton file. */ /* Process the selected skeleton file. */
output_skeleton (); output_skeleton ();
/* If late errors were generated, destroy the generated source
files. */
if (complaint_status)
unlink_generated_sources ();
obstack_free (&format_obstack, NULL); obstack_free (&format_obstack, NULL);
} }
+793 -658
View File
File diff suppressed because it is too large Load Diff
+64 -57
View File
@@ -52,7 +52,7 @@ extern int gram_debug;
#include "symlist.h" #include "symlist.h"
#include "symtab.h" #include "symtab.h"
#line 221 "src/parse-gram.y" /* yacc.c:1909 */ #line 233 "src/parse-gram.y" /* yacc.c:1909 */
typedef enum typedef enum
{ {
@@ -61,7 +61,7 @@ extern int gram_debug;
param_parse = 1 << 1, param_parse = 1 << 1,
param_both = param_lex | param_parse param_both = param_lex | param_parse
} param_type; } param_type;
#line 645 "src/parse-gram.y" /* yacc.c:1909 */ #line 723 "src/parse-gram.y" /* yacc.c:1909 */
#include "muscle-tab.h" #include "muscle-tab.h"
#line 68 "src/parse-gram.h" /* yacc.c:1909 */ #line 68 "src/parse-gram.h" /* yacc.c:1909 */
@@ -84,49 +84,54 @@ extern int gram_debug;
PERCENT_PRECEDENCE = 267, PERCENT_PRECEDENCE = 267,
PERCENT_PREC = 268, PERCENT_PREC = 268,
PERCENT_DPREC = 269, PERCENT_DPREC = 269,
PERCENT_MERGE = 270, PERCENT_GPREC = 270,
PERCENT_CODE = 271, PERCENT_PRECR = 271,
PERCENT_DEFAULT_PREC = 272, PERCENT_MERGE = 272,
PERCENT_DEFINE = 273, PERCENT_CODE = 273,
PERCENT_DEFINES = 274, PERCENT_DEFAULT_PREC = 274,
PERCENT_ERROR_VERBOSE = 275, PERCENT_DEFINE = 275,
PERCENT_EXPECT = 276, PERCENT_DEFINES = 276,
PERCENT_EXPECT_RR = 277, PERCENT_ERROR_VERBOSE = 277,
PERCENT_FLAG = 278, PERCENT_EXPECT = 278,
PERCENT_FILE_PREFIX = 279, PERCENT_EXPECT_RR = 279,
PERCENT_GLR_PARSER = 280, PERCENT_FLAG = 280,
PERCENT_INITIAL_ACTION = 281, PERCENT_FILE_PREFIX = 281,
PERCENT_LANGUAGE = 282, PERCENT_GLR_PARSER = 282,
PERCENT_NAME_PREFIX = 283, PERCENT_INITIAL_ACTION = 283,
PERCENT_NO_DEFAULT_PREC = 284, PERCENT_LANGUAGE = 284,
PERCENT_NO_LINES = 285, PERCENT_NAME_PREFIX = 285,
PERCENT_NONDETERMINISTIC_PARSER = 286, PERCENT_NO_DEFAULT_PREC = 286,
PERCENT_OUTPUT = 287, PERCENT_NO_LINES = 287,
PERCENT_REQUIRE = 288, PERCENT_NONDETERMINISTIC_PARSER = 288,
PERCENT_SKELETON = 289, PERCENT_OUTPUT = 289,
PERCENT_START = 290, PERCENT_REQUIRE = 290,
PERCENT_TOKEN_TABLE = 291, PERCENT_SKELETON = 291,
PERCENT_VERBOSE = 292, PERCENT_START = 292,
PERCENT_YACC = 293, PERCENT_TOKEN_TABLE = 293,
BRACED_CODE = 294, PERCENT_VERBOSE = 294,
BRACED_PREDICATE = 295, PERCENT_YACC = 295,
BRACKETED_ID = 296, BRACED_CODE = 296,
CHAR = 297, BRACED_PREDICATE = 297,
EPILOGUE = 298, BRACKETED_ID = 298,
EQUAL = 299, CHAR = 299,
ID = 300, EPILOGUE = 300,
ID_COLON = 301, EQUAL = 301,
PERCENT_PERCENT = 302, ID = 302,
PIPE = 303, ID_COLON = 303,
PROLOGUE = 304, PERCENT_PERCENT = 304,
SEMICOLON = 305, PIPE = 305,
TAG = 306, PROLOGUE = 306,
TAG_ANY = 307, SEMICOLON = 307,
TAG_NONE = 308, GT = 308,
INT = 309, TAG = 309,
PERCENT_PARAM = 310, TAG_ANY = 310,
PERCENT_UNION = 311, TAG_NONE = 311,
PERCENT_EMPTY = 312 LBRACE = 312,
RBRACE = 313,
INT = 314,
PERCENT_PARAM = 315,
PERCENT_UNION = 316,
PERCENT_EMPTY = 317
}; };
#endif #endif
@@ -135,27 +140,29 @@ extern int gram_debug;
typedef union GRAM_STYPE GRAM_STYPE; typedef union GRAM_STYPE GRAM_STYPE;
union GRAM_STYPE union GRAM_STYPE
{ {
#line 182 "src/parse-gram.y" /* yacc.c:1909 */ #line 187 "src/parse-gram.y" /* yacc.c:1909 */
unsigned char character; unsigned char character;
#line 186 "src/parse-gram.y" /* yacc.c:1909 */
char *code;
#line 191 "src/parse-gram.y" /* yacc.c:1909 */ #line 191 "src/parse-gram.y" /* yacc.c:1909 */
char *code;
#line 196 "src/parse-gram.y" /* yacc.c:1909 */
uniqstr uniqstr; uniqstr uniqstr;
#line 199 "src/parse-gram.y" /* yacc.c:1909 */ #line 204 "src/parse-gram.y" /* yacc.c:1909 */
int integer; int integer;
#line 203 "src/parse-gram.y" /* yacc.c:1909 */
symbol *symbol;
#line 208 "src/parse-gram.y" /* yacc.c:1909 */ #line 208 "src/parse-gram.y" /* yacc.c:1909 */
symbol *symbol;
#line 213 "src/parse-gram.y" /* yacc.c:1909 */
assoc assoc; assoc assoc;
#line 211 "src/parse-gram.y" /* yacc.c:1909 */ #line 216 "src/parse-gram.y" /* yacc.c:1909 */
symbol_list *list; symbol_list *list;
#line 214 "src/parse-gram.y" /* yacc.c:1909 */ #line 219 "src/parse-gram.y" /* yacc.c:1909 */
named_ref *named_ref; named_ref *named_ref;
#line 241 "src/parse-gram.y" /* yacc.c:1909 */ #line 224 "src/parse-gram.y" /* yacc.c:1909 */
prec_rel_comparator prec_rel_comparator;
#line 253 "src/parse-gram.y" /* yacc.c:1909 */
param_type param; param_type param;
#line 409 "src/parse-gram.y" /* yacc.c:1909 */ #line 423 "src/parse-gram.y" /* yacc.c:1909 */
code_props_type code_type; code_props_type code_type;
#line 647 "src/parse-gram.y" /* yacc.c:1909 */ #line 725 "src/parse-gram.y" /* yacc.c:1909 */
struct struct
{ {
@@ -163,7 +170,7 @@ code_props_type code_type;
muscle_kind kind; muscle_kind kind;
} value; } value;
#line 167 "src/parse-gram.h" /* yacc.c:1909 */ #line 174 "src/parse-gram.h" /* yacc.c:1909 */
}; };
# define GRAM_STYPE_IS_TRIVIAL 1 # define GRAM_STYPE_IS_TRIVIAL 1
# define GRAM_STYPE_IS_DECLARED 1 # define GRAM_STYPE_IS_DECLARED 1
+78
View File
@@ -130,6 +130,8 @@
%token PERCENT_PREC "%prec" %token PERCENT_PREC "%prec"
%token PERCENT_DPREC "%dprec" %token PERCENT_DPREC "%dprec"
%token PERCENT_GPREC "%gprec"
%token PERCENT_PRECR "%precr"
%token PERCENT_MERGE "%merge" %token PERCENT_MERGE "%merge"
/*----------------------. /*----------------------.
@@ -175,9 +177,12 @@
%token PIPE "|" %token PIPE "|"
%token PROLOGUE "%{...%}" %token PROLOGUE "%{...%}"
%token SEMICOLON ";" %token SEMICOLON ";"
%token GT ">"
%token TAG "<tag>" %token TAG "<tag>"
%token TAG_ANY "<*>" %token TAG_ANY "<*>"
%token TAG_NONE "<>" %token TAG_NONE "<>"
%token LBRACE "{"
%token RBRACE "}"
%union {unsigned char character;} %union {unsigned char character;}
%type <character> CHAR %type <character> CHAR
@@ -214,6 +219,13 @@
%union {named_ref *named_ref;} %union {named_ref *named_ref;}
%type <named_ref> named_ref.opt %type <named_ref> named_ref.opt
%type <uniqstr> prec_group_name.opt string_or_id
%union {prec_rel_comparator prec_rel_comparator;}
%type <prec_rel_comparator> prec_rel_comparator
%type <list> precedence_relation_symbols precedence_symbol
/*---------. /*---------.
| %param. | | %param. |
`---------*/ `---------*/
@@ -365,6 +377,8 @@ params:
grammar_declaration: grammar_declaration:
precedence_declaration precedence_declaration
| precedence_group_declaration
| precedence_relation_declaration
| symbol_declaration | symbol_declaration
| "%start" symbol | "%start" symbol
{ {
@@ -457,6 +471,30 @@ symbol_declaration:
} }
; ;
/* A group of symbols for precedence declaration */
precedence_group_declaration:
"%gprec" prec_group_name.opt
{
set_current_group ($2, &@2);
}
"{" precedence_declarations "}"
{
set_current_group (DEFAULT_GROUP_NAME, NULL);
}
;
/* Name for the precedence group. If none is present a new unique one is
generated. */
prec_group_name.opt:
%empty { $$ = new_anonymous_group_name (); }
| variable /* Just a string, maybe there's a better way? */
;
precedence_declarations:
precedence_declaration
| precedence_declarations precedence_declaration
;
precedence_declaration: precedence_declaration:
precedence_declarator tag.opt symbols.prec precedence_declarator tag.opt symbols.prec
{ {
@@ -484,6 +522,46 @@ tag.opt:
| TAG { current_type = $1; tag_seen = true; } | TAG { current_type = $1; tag_seen = true; }
; ;
/* Declaration of a precedence relation between two (lists of) tokens */
precedence_relation_declaration:
"%precr" precedence_relation_symbols
{ prec_braces = default_braces_state; }
prec_rel_comparator
precedence_relation_symbols
{ declare_precedence_relation ($2, $5, $4, @4); }
;
precedence_relation_symbols:
precedence_symbol { $$ = $1; }
| precedence_relation_symbols precedence_symbol
{ $$ = symbol_list_append ($1, $2); }
;
precedence_symbol:
string_or_id
{
if (is_prec_group ($1))
$$ = expand_symbol_group (symgroup_from_uniqstr($1, &@1), @1);
else
$$ = symbol_list_sym_new (symbol_from_uniqstr ($1, @1), @1);
}
| CHAR
{
$$ = symbol_list_sym_new (symbol_from_uniqstr (uniqstr_new (char_name ($1)), @1), @1);
}
;
string_or_id:
STRING { $$ = uniqstr_new (quotearg_style (c_quoting_style, $1)); }
| ID { $$ = $1; }
;
prec_rel_comparator:
">" { $$ = prec_superior; }
| "=" { $$ = prec_equal; }
| ">" ">" { $$ = prec_superior_strict; }
;
/* Just like symbols.1 but accept INT for the sake of POSIX. */ /* Just like symbols.1 but accept INT for the sake of POSIX. */
symbols.prec: symbols.prec:
symbol.prec symbol.prec
+38 -37
View File
@@ -65,39 +65,40 @@ print_core (FILE *out, int level, state *s)
sitems = itemset; sitems = itemset;
snritems = nitemset; snritems = nitemset;
if (!snritems) if (!snritems) {
{ xml_puts (out, level, "<itemset/>");
xml_puts (out, level, "<itemset/>"); return;
return; }
}
xml_puts (out, level, "<itemset>"); xml_puts (out, level, "<itemset>");
for (i = 0; i < snritems; i++) for (i = 0; i < snritems; i++)
{ {
bool printed = false; bool printed = false;
item_number *sp1 = ritem + sitems[i]; item_number *sp;
item_number *sp = sp1; item_number *sp1;
rule *r; rule_number r;
while (0 <= *sp) sp1 = sp = ritem + sitems[i];
while (*sp >= 0)
sp++; sp++;
r = &rules[item_number_as_rule_number (*sp)]; r = item_number_as_rule_number (*sp);
sp = r->rhs; sp = rules[r].rhs;
/* Display the lookahead tokens? */ /* Display the lookahead tokens? */
if (item_number_is_rule_number (*sp1)) if (item_number_is_rule_number (*sp1))
{ {
reductions *reds = s->reductions; reductions *reds = s->reductions;
int red = state_reduction_find (s, r); int red = state_reduction_find (s, &rules[r]);
/* Print item with lookaheads if there are. */ /* Print item with lookaheads if there are. */
if (reds->lookahead_tokens && red != -1) if (reds->lookahead_tokens && red != -1)
{ {
xml_printf (out, level + 1, xml_printf (out, level + 1,
"<item rule-number=\"%d\" point=\"%d\">", "<item rule-number=\"%d\" point=\"%d\">",
r->number, sp1 - sp); rules[r].number, sp1 - sp);
state_rule_lookahead_tokens_print_xml (s, r, state_rule_lookahead_tokens_print_xml (s, &rules[r],
out, level + 2); out, level + 2);
xml_puts (out, level + 1, "</item>"); xml_puts (out, level + 1, "</item>");
printed = true; printed = true;
@@ -105,10 +106,12 @@ print_core (FILE *out, int level, state *s)
} }
if (!printed) if (!printed)
xml_printf (out, level + 1, {
"<item rule-number=\"%d\" point=\"%d\"/>", xml_printf (out, level + 1,
r->number, "<item rule-number=\"%d\" point=\"%d\"/>",
sp1 - sp); rules[r].number,
sp1 - sp);
}
} }
xml_puts (out, level, "</itemset>"); xml_puts (out, level, "</itemset>");
} }
@@ -133,11 +136,10 @@ print_transitions (state *s, FILE *out, int level)
} }
/* Nothing to report. */ /* Nothing to report. */
if (!n) if (!n) {
{ xml_puts (out, level, "<transitions/>");
xml_puts (out, level, "<transitions/>"); return;
return; }
}
/* Report lookahead tokens and shifts. */ /* Report lookahead tokens and shifts. */
xml_puts (out, level, "<transitions>"); xml_puts (out, level, "<transitions>");
@@ -188,11 +190,10 @@ print_errs (FILE *out, int level, state *s)
count = true; count = true;
/* Nothing to report. */ /* Nothing to report. */
if (!count) if (!count) {
{ xml_puts (out, level, "<errors/>");
xml_puts (out, level, "<errors/>"); return;
return; }
}
/* Report lookahead tokens and errors. */ /* Report lookahead tokens and errors. */
xml_puts (out, level, "<errors>"); xml_puts (out, level, "<errors>");
@@ -259,7 +260,7 @@ print_reductions (FILE *out, int level, state *s)
bitset_set (no_reduce_set, TRANSITION_SYMBOL (trans, i)); bitset_set (no_reduce_set, TRANSITION_SYMBOL (trans, i));
for (i = 0; i < s->errs->num; ++i) for (i = 0; i < s->errs->num; ++i)
if (s->errs->symbols[i]) if (s->errs->symbols[i])
bitset_set (no_reduce_set, s->errs->symbols[i]->number); bitset_set (no_reduce_set, s->errs->symbols[i]->content->number);
if (default_reduction) if (default_reduction)
report = true; report = true;
@@ -286,11 +287,10 @@ print_reductions (FILE *out, int level, state *s)
} }
/* Nothing to report. */ /* Nothing to report. */
if (!report) if (!report) {
{ xml_puts (out, level, "<reductions/>");
xml_puts (out, level, "<reductions/>"); return;
return; }
}
xml_puts (out, level, "<reductions>"); xml_puts (out, level, "<reductions>");
@@ -388,11 +388,12 @@ print_grammar (FILE *out, int level)
/* Terminals */ /* Terminals */
xml_puts (out, level + 1, "<terminals>"); xml_puts (out, level + 1, "<terminals>");
for (i = 0; i < max_user_token_number + 1; i++) for (i = 0; i < max_user_token_number + 1; i++)
if (token_translations[i] != undeftoken->number) if (token_translations[i] != undeftoken->content->number)
{ {
char const *tag = symbols[token_translations[i]]->tag; char const *tag = symbols[token_translations[i]]->tag;
int precedence = symbols[token_translations[i]]->prec; int precedence = symbols[token_translations[i]]->content->prec;
assoc associativity = symbols[token_translations[i]]->assoc; assoc associativity = symbols[token_translations[i]]->content->prec_node
->assoc;
xml_indent (out, level + 2); xml_indent (out, level + 2);
fprintf (out, fprintf (out,
"<terminal symbol-number=\"%d\" token-number=\"%d\"" "<terminal symbol-number=\"%d\" token-number=\"%d\""
+7 -9
View File
@@ -72,7 +72,7 @@ print_core (FILE *out, state *s)
size_t i; size_t i;
item_number *sitems = s->items; item_number *sitems = s->items;
size_t snritems = s->nitems; size_t snritems = s->nitems;
symbol *previous_lhs = NULL; sym_content *previous_lhs = NULL;
/* Output all the items of a state, not only its kernel. */ /* Output all the items of a state, not only its kernel. */
if (report_flag & report_itemsets) if (report_flag & report_itemsets)
@@ -106,11 +106,8 @@ print_core (FILE *out, state *s)
for (sp = rules[r].rhs; sp < sp1; sp++) for (sp = rules[r].rhs; sp < sp1; sp++)
fprintf (out, " %s", symbols[*sp]->tag); fprintf (out, " %s", symbols[*sp]->tag);
fputs (" .", out); fputs (" .", out);
if (0 <= *rules[r].rhs) for (/* Nothing */; *sp >= 0; ++sp)
for (/* Nothing */; 0 <= *sp; ++sp) fprintf (out, " %s", symbols[*sp]->tag);
fprintf (out, " %s", symbols[*sp]->tag);
else
fprintf (out, " %%empty");
/* Display the lookahead tokens? */ /* Display the lookahead tokens? */
if (report_flag & report_lookahead_tokens if (report_flag & report_lookahead_tokens
@@ -226,7 +223,8 @@ print_reduction (FILE *out, size_t width,
if (!enabled) if (!enabled)
fputc ('[', out); fputc ('[', out);
if (r->number) if (r->number)
fprintf (out, _("reduce using rule %d (%s)"), r->number, r->lhs->tag); fprintf (out, _("reduce using rule %d (%s)"), r->number,
r->lhs->symbol->tag);
else else
fprintf (out, _("accept")); fprintf (out, _("accept"));
if (!enabled) if (!enabled)
@@ -260,7 +258,7 @@ print_reductions (FILE *out, state *s)
bitset_set (no_reduce_set, TRANSITION_SYMBOL (trans, i)); bitset_set (no_reduce_set, TRANSITION_SYMBOL (trans, i));
for (i = 0; i < s->errs->num; ++i) for (i = 0; i < s->errs->num; ++i)
if (s->errs->symbols[i]) if (s->errs->symbols[i])
bitset_set (no_reduce_set, s->errs->symbols[i]->number); bitset_set (no_reduce_set, s->errs->symbols[i]->content->number);
/* Compute the width of the lookahead token column. */ /* Compute the width of the lookahead token column. */
if (default_reduction) if (default_reduction)
@@ -411,7 +409,7 @@ print_grammar (FILE *out)
/* TERMINAL (type #) : rule #s terminal is on RHS */ /* TERMINAL (type #) : rule #s terminal is on RHS */
fprintf (out, "%s\n\n", _("Terminals, with rules where they appear")); fprintf (out, "%s\n\n", _("Terminals, with rules where they appear"));
for (i = 0; i < max_user_token_number + 1; i++) for (i = 0; i < max_user_token_number + 1; i++)
if (token_translations[i] != undeftoken->number) if (token_translations[i] != undeftoken->content->number)
{ {
const char *tag = symbols[token_translations[i]]->tag; const char *tag = symbols[token_translations[i]]->tag;
rule_number r; rule_number r;
+7 -9
View File
@@ -46,7 +46,7 @@ static void
print_core (struct obstack *oout, state *s) print_core (struct obstack *oout, state *s)
{ {
item_number const *sitems = s->items; item_number const *sitems = s->items;
symbol *previous_lhs = NULL; sym_content *previous_lhs = NULL;
size_t i; size_t i;
size_t snritems = s->nitems; size_t snritems = s->nitems;
@@ -72,11 +72,12 @@ print_core (struct obstack *oout, state *s)
r = &rules[item_number_as_rule_number (*sp)]; r = &rules[item_number_as_rule_number (*sp)];
obstack_printf (oout, "%3d ", r->number); obstack_printf (oout, "%3d ", r->number);
if (previous_lhs && UNIQSTR_EQ (previous_lhs->tag, r->lhs->tag)) if (previous_lhs && UNIQSTR_EQ (previous_lhs->symbol->tag,
r->lhs->symbol->tag))
obstack_printf (oout, "%*s| ", obstack_printf (oout, "%*s| ",
(int) strlen (previous_lhs->tag), ""); (int) strlen (previous_lhs->symbol->tag), "");
else else
obstack_printf (oout, "%s: ", escape (r->lhs->tag)); obstack_printf (oout, "%s: ", escape (r->lhs->symbol->tag));
previous_lhs = r->lhs; previous_lhs = r->lhs;
for (sp = r->rhs; sp < sp1; sp++) for (sp = r->rhs; sp < sp1; sp++)
@@ -84,11 +85,8 @@ print_core (struct obstack *oout, state *s)
obstack_1grow (oout, '.'); obstack_1grow (oout, '.');
if (0 <= *r->rhs) for (/* Nothing */; *sp >= 0; ++sp)
for (/* Nothing */; *sp >= 0; ++sp) obstack_printf (oout, " %s", escape (symbols[*sp]->tag));
obstack_printf (oout, " %s", escape (symbols[*sp]->tag));
else
obstack_printf (oout, " %%empty");
/* Experimental feature: display the lookahead tokens. */ /* Experimental feature: display the lookahead tokens. */
if (report_flag & report_lookahead_tokens if (report_flag & report_lookahead_tokens
+27 -26
View File
@@ -240,13 +240,13 @@ grammar_current_rule_begin (symbol *lhs, location loc,
current_rule = grammar_end; current_rule = grammar_end;
/* Mark the rule's lhs as a nonterminal if not already so. */ /* Mark the rule's lhs as a nonterminal if not already so. */
if (lhs->class == unknown_sym) if (lhs->content->class == unknown_sym)
{ {
lhs->class = nterm_sym; lhs->content->class = nterm_sym;
lhs->number = nvars; lhs->content->number = nvars;
++nvars; ++nvars;
} }
else if (lhs->class == token_sym) else if (lhs->content->class == token_sym)
complain (&loc, complaint, _("rule given for %s, which is a token"), complain (&loc, complaint, _("rule given for %s, which is a token"),
lhs->tag); lhs->tag);
} }
@@ -292,15 +292,15 @@ grammar_rule_check (const symbol_list *r)
Don't worry about the default action if $$ is untyped, since $$'s Don't worry about the default action if $$ is untyped, since $$'s
value can't be used. */ value can't be used. */
if (!r->action_props.code && r->content.sym->type_name) if (!r->action_props.code && r->content.sym->content->type_name)
{ {
symbol *first_rhs = r->next->content.sym; symbol *first_rhs = r->next->content.sym;
/* If $$ is being set in default way, report if any type mismatch. */ /* If $$ is being set in default way, report if any type mismatch. */
if (first_rhs) if (first_rhs)
{ {
char const *lhs_type = r->content.sym->type_name; char const *lhs_type = r->content.sym->content->type_name;
const char *rhs_type = const char *rhs_type =
first_rhs->type_name ? first_rhs->type_name : ""; first_rhs->content->type_name ? first_rhs->content->type_name : "";
if (!UNIQSTR_EQ (lhs_type, rhs_type)) if (!UNIQSTR_EQ (lhs_type, rhs_type))
complain (&r->location, Wother, complain (&r->location, Wother,
_("type clash on default action: <%s> != <%s>"), _("type clash on default action: <%s> != <%s>"),
@@ -350,7 +350,8 @@ grammar_rule_check (const symbol_list *r)
it for char literals and strings, which are always tokens. */ it for char literals and strings, which are always tokens. */
if (r->ruleprec if (r->ruleprec
&& r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"' && r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"'
&& r->ruleprec->status != declared && !r->ruleprec->prec) && r->ruleprec->content->status != declared
&& !r->ruleprec->content->prec)
complain (&r->location, Wother, complain (&r->location, Wother,
_("token for %%prec is not defined: %s"), r->ruleprec->tag); _("token for %%prec is not defined: %s"), r->ruleprec->tag);
} }
@@ -517,8 +518,8 @@ grammar_current_rule_symbol_append (symbol *sym, location loc,
p = grammar_symbol_append (sym, loc); p = grammar_symbol_append (sym, loc);
if (name) if (name)
assign_named_ref (p, name); assign_named_ref (p, name);
if (sym->status == undeclared || sym->status == used) if (sym->content->status == undeclared || sym->content->status == used)
sym->status = needed; sym->content->status = needed;
} }
/* Attach an ACTION to the current rule. */ /* Attach an ACTION to the current rule. */
@@ -558,11 +559,11 @@ packgram (void)
for (p = grammar; p; p = p->next) for (p = grammar; p; p = p->next)
{ {
symbol *ruleprec = p->ruleprec; symbol *ruleprec = p->ruleprec;
record_merge_function_type (p->merger, p->content.sym->type_name, record_merge_function_type (p->merger, p->content.sym->content->type_name,
p->merger_declaration_location); p->merger_declaration_location);
rules[ruleno].user_number = ruleno; rules[ruleno].user_number = ruleno;
rules[ruleno].number = ruleno; rules[ruleno].number = ruleno;
rules[ruleno].lhs = p->content.sym; rules[ruleno].lhs = p->content.sym->content;
rules[ruleno].rhs = ritem + itemno; rules[ruleno].rhs = ritem + itemno;
rules[ruleno].prec = NULL; rules[ruleno].prec = NULL;
rules[ruleno].dprec = p->dprec; rules[ruleno].dprec = p->dprec;
@@ -604,11 +605,11 @@ packgram (void)
/* item_number = symbol_number. /* item_number = symbol_number.
But the former needs to contain more: negative rule numbers. */ But the former needs to contain more: negative rule numbers. */
ritem[itemno++] = ritem[itemno++] =
symbol_number_as_item_number (p->content.sym->number); symbol_number_as_item_number (p->content.sym->content->number);
/* A rule gets by default the precedence and associativity /* A rule gets by default the precedence and associativity
of its last token. */ of its last token. */
if (p->content.sym->class == token_sym && default_prec) if (p->content.sym->content->class == token_sym && default_prec)
rules[ruleno].prec = p->content.sym; rules[ruleno].prec = p->content.sym->content;
} }
} }
@@ -616,8 +617,8 @@ packgram (void)
the specified symbol's precedence replaces the default. */ the specified symbol's precedence replaces the default. */
if (ruleprec) if (ruleprec)
{ {
rules[ruleno].precsym = ruleprec; rules[ruleno].precsym = ruleprec->content;
rules[ruleno].prec = ruleprec; rules[ruleno].prec = ruleprec->content;
} }
/* An item ends by the rule number (negated). */ /* An item ends by the rule number (negated). */
ritem[itemno++] = rule_number_as_item_number (ruleno); ritem[itemno++] = rule_number_as_item_number (ruleno);
@@ -647,19 +648,19 @@ reader (void)
/* Construct the accept symbol. */ /* Construct the accept symbol. */
accept = symbol_get ("$accept", empty_location); accept = symbol_get ("$accept", empty_location);
accept->class = nterm_sym; accept->content->class = nterm_sym;
accept->number = nvars++; accept->content->number = nvars++;
/* Construct the error token */ /* Construct the error token */
errtoken = symbol_get ("error", empty_location); errtoken = symbol_get ("error", empty_location);
errtoken->class = token_sym; errtoken->content->class = token_sym;
errtoken->number = ntokens++; errtoken->content->number = ntokens++;
/* Construct a token that represents all undefined literal tokens. /* Construct a token that represents all undefined literal tokens.
It is always token number 2. */ It is always token number 2. */
undeftoken = symbol_get ("$undefined", empty_location); undeftoken = symbol_get ("$undefined", empty_location);
undeftoken->class = token_sym; undeftoken->content->class = token_sym;
undeftoken->number = ntokens++; undeftoken->content->number = ntokens++;
gram_in = xfopen (grammar_file, "r"); gram_in = xfopen (grammar_file, "r");
@@ -721,10 +722,10 @@ check_and_convert_grammar (void)
if (!endtoken) if (!endtoken)
{ {
endtoken = symbol_get ("$end", empty_location); endtoken = symbol_get ("$end", empty_location);
endtoken->class = token_sym; endtoken->content->class = token_sym;
endtoken->number = 0; endtoken->content->number = 0;
/* Value specified by POSIX. */ /* Value specified by POSIX. */
endtoken->user_token_number = 0; endtoken->content->user_token_number = 0;
} }
/* Report any undefined symbols and consider them nonterminals. */ /* Report any undefined symbols and consider them nonterminals. */
+9 -9
View File
@@ -163,9 +163,9 @@ inaccessable_symbols (void)
Pp = bitset_create (nrules, BITSET_FIXED); Pp = bitset_create (nrules, BITSET_FIXED);
/* If the start symbol isn't useful, then nothing will be useful. */ /* If the start symbol isn't useful, then nothing will be useful. */
if (bitset_test (N, accept->number - ntokens)) if (bitset_test (N, accept->content->number - ntokens))
{ {
bitset_set (V, accept->number); bitset_set (V, accept->content->number);
while (1) while (1)
{ {
@@ -196,9 +196,9 @@ inaccessable_symbols (void)
V = Vp; V = Vp;
/* Tokens 0, 1, and 2 are internal to Bison. Consider them useful. */ /* Tokens 0, 1, and 2 are internal to Bison. Consider them useful. */
bitset_set (V, endtoken->number); /* end-of-input token */ bitset_set (V, endtoken->content->number); /* end-of-input token */
bitset_set (V, errtoken->number); /* error token */ bitset_set (V, errtoken->content->number); /* error token */
bitset_set (V, undeftoken->number); /* some undefined token */ bitset_set (V, undeftoken->content->number); /* some undefined token */
bitset_free (P); bitset_free (P);
P = Pp; P = Pp;
@@ -298,7 +298,7 @@ nonterminals_reduce (void)
if (!bitset_test (V, i)) if (!bitset_test (V, i))
{ {
nontermmap[i - ntokens] = n++; nontermmap[i - ntokens] = n++;
if (symbols[i]->status != used) if (symbols[i]->content->status != used)
complain (&symbols[i]->location, Wother, complain (&symbols[i]->location, Wother,
_("nonterminal useless in grammar: %s"), _("nonterminal useless in grammar: %s"),
symbols[i]->tag); symbols[i]->tag);
@@ -310,7 +310,7 @@ nonterminals_reduce (void)
symbol **symbols_sorted = xnmalloc (nvars, sizeof *symbols_sorted); symbol **symbols_sorted = xnmalloc (nvars, sizeof *symbols_sorted);
for (i = ntokens; i < nsyms; i++) for (i = ntokens; i < nsyms; i++)
symbols[i]->number = nontermmap[i - ntokens]; symbols[i]->content->number = nontermmap[i - ntokens];
for (i = ntokens; i < nsyms; i++) for (i = ntokens; i < nsyms; i++)
symbols_sorted[nontermmap[i - ntokens] - ntokens] = symbols[i]; symbols_sorted[nontermmap[i - ntokens] - ntokens] = symbols[i];
for (i = ntokens; i < nsyms; i++) for (i = ntokens; i < nsyms; i++)
@@ -328,7 +328,7 @@ nonterminals_reduce (void)
*rhsp = symbol_number_as_item_number (nontermmap[*rhsp *rhsp = symbol_number_as_item_number (nontermmap[*rhsp
- ntokens]); - ntokens]);
} }
accept->number = nontermmap[accept->number - ntokens]; accept->content->number = nontermmap[accept->content->number - ntokens];
} }
nsyms -= nuseless_nonterminals; nsyms -= nuseless_nonterminals;
@@ -415,7 +415,7 @@ reduce_grammar (void)
reduce_print (); reduce_print ();
if (!bitset_test (N, accept->number - ntokens)) if (!bitset_test (N, accept->content->number - ntokens))
complain (&startsymbol_location, fatal, complain (&startsymbol_location, fatal,
_("start symbol %s does not derive any sentence"), _("start symbol %s does not derive any sentence"),
startsymbol->tag); startsymbol->tag);
+5 -13
View File
@@ -342,19 +342,8 @@ show_sub_message (warnings warning,
{ {
static struct obstack msg_buf; static struct obstack msg_buf;
const char *tail = explicit_bracketing ? "" : cp + strlen (var->id); const char *tail = explicit_bracketing ? "" : cp + strlen (var->id);
const char *id; const char *id = var->hidden_by ? var->hidden_by->id : var->id;
location id_loc; location id_loc = var->hidden_by ? var->hidden_by->loc : var->loc;
if (var->hidden_by)
{
id = var->hidden_by->id;
id_loc = var->hidden_by->loc;
}
else
{
id = var->id;
id_loc = var->loc;
}
/* Create the explanation message. */ /* Create the explanation message. */
obstack_init (&msg_buf); obstack_init (&msg_buf);
@@ -584,6 +573,9 @@ parse_ref (char *cp, symbol_list *rule, int rule_length,
return INVALID_REF; return INVALID_REF;
} }
} }
/* Not reachable. */
return INVALID_REF;
} }
/* Keeps track of the maximum number of semantic values to the left of /* Keeps track of the maximum number of semantic values to the left of
+18 -1
View File
@@ -223,6 +223,10 @@ eqopt ([[:space:]]*=)?
"%fixed-output-files" return PERCENT_YACC; "%fixed-output-files" return PERCENT_YACC;
"%initial-action" return PERCENT_INITIAL_ACTION; "%initial-action" return PERCENT_INITIAL_ACTION;
"%glr-parser" return PERCENT_GLR_PARSER; "%glr-parser" return PERCENT_GLR_PARSER;
"%gprec" {
prec_braces = gprec_seen;
return PERCENT_GPREC;
}
"%language" return PERCENT_LANGUAGE; "%language" return PERCENT_LANGUAGE;
"%left" return PERCENT_LEFT; "%left" return PERCENT_LEFT;
"%lex-param" RETURN_PERCENT_PARAM(lex); "%lex-param" RETURN_PERCENT_PARAM(lex);
@@ -239,6 +243,7 @@ eqopt ([[:space:]]*=)?
"%parse-param" RETURN_PERCENT_PARAM(parse); "%parse-param" RETURN_PERCENT_PARAM(parse);
"%prec" return PERCENT_PREC; "%prec" return PERCENT_PREC;
"%precedence" return PERCENT_PRECEDENCE; "%precedence" return PERCENT_PRECEDENCE;
"%precr" return PERCENT_PRECR;
"%printer" return PERCENT_PRINTER; "%printer" return PERCENT_PRINTER;
"%pure-parser" RETURN_PERCENT_FLAG("api.pure"); "%pure-parser" RETURN_PERCENT_FLAG("api.pure");
"%require" return PERCENT_REQUIRE; "%require" return PERCENT_REQUIRE;
@@ -266,17 +271,24 @@ eqopt ([[:space:]]*=)?
"%pure"[-_]"parser" DEPRECATED("%pure-parser"); "%pure"[-_]"parser" DEPRECATED("%pure-parser");
"%token"[-_]"table" DEPRECATED("%token-table"); "%token"[-_]"table" DEPRECATED("%token-table");
"%"{id} { "%"{id}|"%"{notletter}([[:graph:]])+ {
complain (loc, complaint, _("invalid directive: %s"), quote (yytext)); complain (loc, complaint, _("invalid directive: %s"), quote (yytext));
} }
"=" return EQUAL; "=" return EQUAL;
"|" return PIPE; "|" return PIPE;
";" return SEMICOLON; ";" return SEMICOLON;
"}" return RBRACE;
">" return GT;
{id} { {id} {
val->uniqstr = uniqstr_new (yytext); val->uniqstr = uniqstr_new (yytext);
id_loc = *loc; id_loc = *loc;
if (prec_braces == gprec_seen)
{
prec_braces = group_name_seen;
return ID;
}
bracketed_id_str = NULL; bracketed_id_str = NULL;
BEGIN SC_AFTER_IDENTIFIER; BEGIN SC_AFTER_IDENTIFIER;
} }
@@ -307,6 +319,11 @@ eqopt ([[:space:]]*=)?
/* Code in between braces. */ /* Code in between braces. */
"{" { "{" {
if (prec_braces == gprec_seen || prec_braces == group_name_seen)
{
prec_braces = braces_seen;
return LBRACE;
}
STRING_GROW; STRING_GROW;
nesting = 0; nesting = 0;
code_start = loc->start; code_start = loc->start;
+2 -3
View File
@@ -244,9 +244,8 @@ at_output (int argc, char *argv[], char **out_namep, int *out_linenop)
xfclose (yyout); xfclose (yyout);
} }
*out_namep = xstrdup (argv[1]); *out_namep = xstrdup (argv[1]);
output_file_name_check (out_namep, true); output_file_name_check (out_namep);
/* If there were errors, do not generate the output. */ yyout = xfopen (*out_namep, "w");
yyout = xfopen (complaint_status ? "/dev/null" : *out_namep, "w");
*out_linenop = 1; *out_linenop = 1;
} }
+1 -1
View File
@@ -135,7 +135,7 @@ typedef struct
/* Is the TRANSITIONS->states[Num] labelled by the error token? */ /* Is the TRANSITIONS->states[Num] labelled by the error token? */
# define TRANSITION_IS_ERROR(Transitions, Num) \ # define TRANSITION_IS_ERROR(Transitions, Num) \
(TRANSITION_SYMBOL (Transitions, Num) == errtoken->number) (TRANSITION_SYMBOL (Transitions, Num) == errtoken->content->number)
/* When resolving a SR conflicts, if the reduction wins, the shift is /* When resolving a SR conflicts, if the reduction wins, the shift is
disabled. */ disabled. */
+3 -3
View File
@@ -205,7 +205,7 @@ symbol_list_n_type_name_get (symbol_list *l, location loc, int n)
return NULL; return NULL;
} }
aver (l->content_type == SYMLIST_SYMBOL); aver (l->content_type == SYMLIST_SYMBOL);
return l->content.sym->type_name; return l->content.sym->content->type_name;
} }
bool bool
@@ -223,8 +223,8 @@ symbol_list_code_props_set (symbol_list *node, code_props_type kind,
{ {
case SYMLIST_SYMBOL: case SYMLIST_SYMBOL:
symbol_code_props_set (node->content.sym, kind, cprops); symbol_code_props_set (node->content.sym, kind, cprops);
if (node->content.sym->status == undeclared) if (node->content.sym->content->status == undeclared)
node->content.sym->status = used; node->content.sym->content->status = used;
break; break;
case SYMLIST_TYPE: case SYMLIST_TYPE:
semantic_type_code_props_set semantic_type_code_props_set
+607 -157
View File
File diff suppressed because it is too large Load Diff
+114 -8
View File
@@ -31,6 +31,8 @@
# include "scan-code.h" # include "scan-code.h"
# include "uniqstr.h" # include "uniqstr.h"
typedef struct symbol_list symbol_list;
/*----------. /*----------.
| Symbols. | | Symbols. |
`----------*/ `----------*/
@@ -50,6 +52,7 @@ typedef int symbol_number;
typedef struct symbol symbol; typedef struct symbol symbol;
typedef struct sym_content sym_content;
/* Declaration status of a symbol. /* Declaration status of a symbol.
@@ -61,6 +64,8 @@ typedef struct symbol symbol;
When status are checked at the end, "declared" symbols are fine, When status are checked at the end, "declared" symbols are fine,
"used" symbols trigger warnings, otherwise it's an error. */ "used" symbols trigger warnings, otherwise it's an error. */
typedef struct prec_node prec_node;
typedef enum typedef enum
{ {
/** Used in the input file for an unknown reason (error). */ /** Used in the input file for an unknown reason (error). */
@@ -82,8 +87,6 @@ enum code_props_type
enum { CODE_PROPS_SIZE = 2 }; enum { CODE_PROPS_SIZE = 2 };
/* When extending this structure, be sure to complete
symbol_check_alias_consistency. */
struct symbol struct symbol
{ {
/** The key, name of the symbol. */ /** The key, name of the symbol. */
@@ -91,6 +94,20 @@ struct symbol
/** The location of its first occurrence. */ /** The location of its first occurrence. */
location location; location location;
/* Points to the other in the symbol-string pair for an alias. */
symbol *alias;
/** Whether this symbol is the alias of another or not. */
bool is_alias;
/** All the info about the pointed symbol is there. */
sym_content *content;
};
struct sym_content
{
symbol *symbol;
/** Its \c \%type. /** Its \c \%type.
Beware that this is the type_name as was entered by the user, Beware that this is the type_name as was entered by the user,
@@ -112,17 +129,21 @@ struct symbol
code_props props[CODE_PROPS_SIZE]; code_props props[CODE_PROPS_SIZE];
symbol_number number; symbol_number number;
location prec_location;
/* Not used anymore, to remove. */
int prec; int prec;
assoc assoc;
int user_token_number; int user_token_number;
/* Points to the other in the symbol-string pair for an alias.
Special value USER_NUMBER_HAS_STRING_ALIAS in the symbol half of the
symbol-string pair for an alias. */
symbol *alias;
symbol_class class; symbol_class class;
status status; status status;
/* The next element in the symbol precedence group. */
sym_content *group_next;
/* The graph node containing all the precedence information for this
symbol. */
prec_node *prec_node;
}; };
/** Undefined user number. */ /** Undefined user number. */
@@ -277,6 +298,91 @@ void print_precedence_warnings (void);
void register_assoc (graphid i, graphid j); void register_assoc (graphid i, graphid j);
/*------------------.
| Groups of symbols |
`------------------*/
#define DEFAULT_GROUP_NAME uniqstr_new ("__default__")
typedef struct symgroup symgroup;
struct symgroup
{
/** The name of the group. */
uniqstr tag;
/** The list of symbols in the group. */
sym_content * symbol_list;
location location;
} ;
/** Get a dummy name for an anonymous group. */
uniqstr new_anonymous_group_name (void);
/** Set the current group in the token precedence declaration to a new group
* with this name */
void set_current_group (const uniqstr name, location *loc);
/** Get or create the group by that name. The location information is used for
* creation when available. */
symgroup *
symgroup_from_uniqstr (const uniqstr key, location *loc);
/** Check if there is a symbol precedence group by that name. */
bool
is_prec_group (const uniqstr key);
/*----------------------------------.
| Graph of precedence relationships |
`----------------------------------*/
typedef struct prec_link prec_link;
struct prec_link
{
prec_node *target;
bool transitive;
prec_link *next;
};
struct prec_node
{
symbol *symbol;
/** Associativity for the symbol. */
assoc assoc;
location prec_location;
prec_link *sons;
prec_link *equals;
};
typedef enum prec_rel_comparator prec_rel_comparator;
enum prec_rel_comparator
{
prec_equal,
prec_superior,
prec_superior_strict,
};
/** Declare a precedence relationship between the symbols of the two lists,
* as defined by the operator. */
void
declare_precedence_relation (symbol_list *l1, symbol_list *l2,
prec_rel_comparator c, location loc);
/** Return the list of symbols contained in the group. */
symbol_list *
expand_symbol_group (symgroup * group, location loc);
/** Check if s1 and s2 have the same precedence level. */
bool is_prec_equal (prec_node * s1, prec_node * s2);
/** Check if from > to . */
bool is_prec_superior (prec_node * from, prec_node * to);
/*-----------------. /*-----------------.
| Semantic types. | | Semantic types. |
`-----------------*/ `-----------------*/
+2 -2
View File
@@ -290,7 +290,7 @@ action_row (state *s)
/* Do not use any default reduction if there is a shift for /* Do not use any default reduction if there is a shift for
error */ error */
if (sym == errtoken->number) if (sym == errtoken->content->number)
nodefault = true; nodefault = true;
} }
@@ -300,7 +300,7 @@ action_row (state *s)
for (i = 0; i < errp->num; i++) for (i = 0; i < errp->num; i++)
{ {
symbol *sym = errp->symbols[i]; symbol *sym = errp->symbols[i];
actrow[sym->number] = ACTION_NUMBER_MINIMUM; actrow[sym->content->number] = ACTION_NUMBER_MINIMUM;
} }
/* Turn off default reductions where requested by the user. See /* Turn off default reductions where requested by the user. See
+1 -2
View File
@@ -77,8 +77,7 @@ uniqstr_vsprintf (char const *format, ...)
void void
uniqstr_assert (char const *str) uniqstr_assert (char const *str)
{ {
uniqstr s = hash_lookup (uniqstrs_table, str); if (!hash_lookup (uniqstrs_table, str))
if (!s || s != str)
{ {
error (0, 0, error (0, 0,
"not a uniqstr: %s", quotearg (str)); "not a uniqstr: %s", quotearg (str));
+1 -3
View File
@@ -20,8 +20,6 @@
#ifndef UNIQSTR_H_ #ifndef UNIQSTR_H_
# define UNIQSTR_H_ # define UNIQSTR_H_
# include <stdio.h>
/*-----------------------------------------. /*-----------------------------------------.
| Pointers to unique copies of C strings. | | Pointers to unique copies of C strings. |
`-----------------------------------------*/ `-----------------------------------------*/
@@ -35,7 +33,7 @@ uniqstr uniqstr_new (char const *str);
strings, use UNIQSTR_CONCAT, which is a convenient wrapper around strings, use UNIQSTR_CONCAT, which is a convenient wrapper around
this function. */ this function. */
uniqstr uniqstr_vsprintf (char const *format, ...) uniqstr uniqstr_vsprintf (char const *format, ...)
_GL_ATTRIBUTE_FORMAT_PRINTF (1, 2); __attribute__ ((__format__ (__printf__, 1, 2)));
/* Two uniqstr values have the same value iff they are the same. */ /* Two uniqstr values have the same value iff they are the same. */
# define UNIQSTR_EQ(Ustr1, Ustr2) (!!((Ustr1) == (Ustr2))) # define UNIQSTR_EQ(Ustr1, Ustr2) (!!((Ustr1) == (Ustr2)))
+1 -1
View File
@@ -596,7 +596,7 @@ thing:
; ;
%% %%
/* Alias to ARGV[1]. */ /* Alias to ARGV[1]. */
const char *source = YY_NULLPTR; const char *source = YY_NULL;
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
+2 -1
View File
@@ -72,12 +72,13 @@ int main ()
std::cout << "Works" << std::endl; std::cout << "Works" << std::endl;
} }
EOF EOF
ls
$CXX $CXXFLAGS $CPPFLAGS $LDFLAGS $LIBS -o conftest conftest.cc $CXX $CXXFLAGS $CPPFLAGS $LDFLAGS $LIBS -o conftest conftest.cc
case $? in case $? in
0);; 0);;
*) BISON_CXX_WORKS="as_fn_error 77 cannot-compile-simple-program";; *) BISON_CXX_WORKS="as_fn_error 77 cannot-compile-simple-program";;
esac esac
rm -fr conftest* rm -f conftest*
fi fi
# Whether the compiler supports POSIXLY_CORRECT defined. # Whether the compiler supports POSIXLY_CORRECT defined.
+47 -62
View File
@@ -174,10 +174,11 @@ AT_CLEANUP
m4_pushdef([AT_TEST], m4_pushdef([AT_TEST],
[AT_SETUP([Variants $1]) [AT_SETUP([Variants $1])
AT_BISON_OPTION_PUSHDEFS([%debug $1]) AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" %debug $1])
# Store strings and integers in a list of strings. # Store strings and integers in a list of strings.
AT_DATA_GRAMMAR([list.y], AT_DATA_GRAMMAR([list.y],
[[%debug [[%debug
%skeleton "lalr1.cc"
%define api.value.type variant %define api.value.type variant
]m4_bpatsubst([$1], [\\n], [ ]m4_bpatsubst([$1], [\\n], [
])[ ])[
@@ -243,7 +244,7 @@ typedef std::list<std::string> strings_type;
// digraph for the left square bracket. // digraph for the left square bracket.
%type <::std::list<std::string>> list result; %type <::std::list<std::string>> list result;
%printer { yyo << $$; } %printer { yyo << $][$; }
<int> <::std::string> <::std::list<std::string>>; <int> <::std::string> <::std::list<std::string>>;
%% %%
@@ -253,13 +254,13 @@ result:
list: list:
/* nothing */ { /* Generates an empty string list */ } /* nothing */ { /* Generates an empty string list */ }
| list item { std::swap ($$,$][1); $$.push_back ($][2); } | list item { std::swap ($][$,$][1); $$.push_back ($][2); }
| list error { std::swap ($$,$][1); } | list error { std::swap ($][$,$][1); }
; ;
item: item:
TEXT { std::swap ($$,$][1); } TEXT { std::swap ($][$,$][1); }
| NUMBER { if ($][1 == 3) YYERROR; else $$ = string_cast ($][1); } | NUMBER { if ($][1 == 3) YYERROR; else $][$ = string_cast ($][1); }
; ;
%% %%
]AT_TOKEN_CTOR_IF([], ]AT_TOKEN_CTOR_IF([],
@@ -319,13 +320,13 @@ AT_BISON_OPTION_POPDEFS
AT_CLEANUP AT_CLEANUP
]) ])
AT_TEST([[%skeleton "lalr1.cc" ]]) AT_TEST([])
AT_TEST([[%skeleton "lalr1.cc" %define parse.assert]]) AT_TEST([%define parse.assert])
AT_TEST([[%skeleton "lalr1.cc" %locations %define parse.assert]]) AT_TEST([%locations %define parse.assert])
AT_TEST([[%skeleton "lalr1.cc" %define parse.assert %code {\n#define TWO_STAGE_BUILD\n}]]) AT_TEST([[%define parse.assert %code {\n#define TWO_STAGE_BUILD\n}]])
AT_TEST([[%skeleton "lalr1.cc" %define parse.assert %define api.token.constructor]]) AT_TEST([[%define parse.assert %define api.token.constructor]])
AT_TEST([[%skeleton "lalr1.cc" %define parse.assert %define api.token.constructor %define api.token.prefix {TOK_}]]) AT_TEST([[%define parse.assert %define api.token.constructor %define api.token.prefix {TOK_}]])
AT_TEST([[%skeleton "lalr1.cc" %locations %define parse.assert %define api.token.constructor %define api.token.prefix {TOK_}]]) AT_TEST([[%locations %define parse.assert %define api.token.constructor %define api.token.prefix {TOK_}]])
m4_popdef([AT_TEST]) m4_popdef([AT_TEST])
@@ -649,14 +650,11 @@ AT_CLEANUP
## Exception safety. ## ## Exception safety. ##
## ------------------ ## ## ------------------ ##
# AT_TEST([BISON-DIRECTIVES = ''], [WITH-RECOVERY = "with"]) # AT_TEST([BISON-DIRECTIVES])
# ---------------------------------------------------------- # ---------------------------
# Check that no object is leaked when exceptions are thrown. # Check that no object is leaked when exceptions are thrown.
# WITH-RECOVERY = "with" or "without".
m4_pushdef([AT_TEST], m4_pushdef([AT_TEST],
[AT_SETUP([[Exception safety $2 error recovery $1]]) [AT_SETUP([[Exception safety $1]])
AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR
AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" $1]) AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" $1])
@@ -670,43 +668,27 @@ $1
#include <cassert> #include <cassert>
#include <cstdlib> // size_t and getenv. #include <cstdlib> // size_t and getenv.
#include <iostream> #include <iostream>
#include <set> #include <list>
bool debug = false; bool debug = false;
/// A class that tracks its instances. /// A class that counts its number of instances.
struct Object struct Object
{ {
char val; char val;
Object ()
: val ('?')
{
log (this, "Object::Object");
Object::instances.insert (this);
}
Object (const Object& that)
: val (that.val)
{
log (this, "Object::Object");
Object::instances.insert (this);
}
Object (char v) Object (char v)
: val (v) : val (v)
{ {
Object::instances.push_back(this);
log (this, "Object::Object"); log (this, "Object::Object");
Object::instances.insert (this);
} }
~Object () Object ()
: val ('?')
{ {
log (this, "Object::~Object"); Object::instances.push_back(this);
objects::const_iterator i = instances.find (this); log (this, "Object::Object");
// Make sure this object is alive.
assert (i != instances.end ());
Object::instances.erase (i);
} }
Object& operator= (char v) Object& operator= (char v)
@@ -715,8 +697,14 @@ $1
return *this; return *this;
} }
~Object ()
{
Object::instances.remove (this);
log (this, "Object::~Object");
}
// Static part. // Static part.
typedef std::set<const Object*> objects; typedef std::list<const Object*> objects;
static objects instances; static objects instances;
static bool static bool
@@ -796,23 +784,22 @@ $1
start: list {]AT_VARIANT_IF([], [ delete $][1]; )[}; start: list {]AT_VARIANT_IF([], [ delete $][1]; )[};
list: list:
item { $$ = $][1; } item { $][$ = $][1; }
// Right recursion to load the stack. // Right recursion to load the stack.
| item list { $$ = $][1; ]AT_VARIANT_IF([], [delete $][2]; )[} | item list { $][$ = $][1; ]AT_VARIANT_IF([], [delete $][2]; )[}
; ;
item: item:
'a' { $$ = $][1; } 'a' { $$][ = $][1; }
| 'e' { YYUSE ($$); YYUSE($][1); error ("syntax error"); } | 'e' { YYUSE ($][$); YYUSE($][1); error ("syntax error"); }
// Not just 'E', otherwise we reduce when 'E' is the lookahead, and // Not just 'E', otherwise we reduce when 'E' is the lookahead, and
// then the stack is emptied, defeating the point of the test. // then the stack is emptied, defeating the point of the test.
| 'E' 'a' { YYUSE($][1); $$ = $][2; } | 'E' 'a' { YYUSE($][1); $][$ = $][2; }
| 'R' { ]AT_VARIANT_IF([], [$$ = YY_NULLPTR; delete $][1]; )[YYERROR; } | 'R' { ]AT_VARIANT_IF([], [$][$ = YY_NULL; delete $][1]; )[YYERROR; }
| 'p' { $$ = $][1; } | 'p' { $][$ = $][1; }
| 's' { $$ = $][1; throw std::runtime_error ("reduction"); } | 's' { $][$ = $][1; throw std::runtime_error ("reduction"); }
| 'T' { ]AT_VARIANT_IF([], [$$ = YY_NULLPTR; delete $][1]; )[YYABORT; } | 'T' { ]AT_VARIANT_IF([], [$][$ = YY_NULL; delete $][1]; )[YYABORT; }
]m4_if([$2], [with], | error { ]AT_VARIANT_IF([], [$][$ = YY_NULL; ])[yyerrok; }
[[| error { $$ = ]AT_VARIANT_IF([], [new ])[Object ('R'); yyerrok; }]])[
; ;
%% %%
@@ -832,8 +819,7 @@ yylex (yy::parser::semantic_type *lvalp)
case 'l': case 'l':
throw std::runtime_error ("yylex"); throw std::runtime_error ("yylex");
default: default:
lvalp->]AT_VARIANT_IF([build (Object (res))], lvalp]AT_VARIANT_IF([->build (res)], [->obj = new Object (res)])[;
[obj = new Object (res)])[;
// Fall through. // Fall through.
case 0: case 0:
return res; return res;
@@ -880,7 +866,7 @@ main (int argc, const char *argv[])
{ {
std::cerr << "unknown exception caught" << std::endl; std::cerr << "unknown exception caught" << std::endl;
} }
Object::log (YY_NULLPTR, "end"); Object::log (YY_NULL, "end");
assert (Object::empty()); assert (Object::empty());
return res; return res;
} }
@@ -915,17 +901,16 @@ AT_PARSER_CHECK([[./input aaaaE]], [[2]], [[]],
AT_PARSER_CHECK([[./input aaaaT]], [[1]]) AT_PARSER_CHECK([[./input aaaaT]], [[1]])
AT_PARSER_CHECK([[./input aaaaR]], [m4_if([$2], [with], [0], [1])]) # There is error-recovery, so exit success.
AT_PARSER_CHECK([[./input aaaaR]], [[0]])
AT_BISON_OPTION_POPDEFS AT_BISON_OPTION_POPDEFS
AT_CLEANUP AT_CLEANUP
]) ])
AT_TEST([], [with]) AT_TEST
AT_TEST([], [without]) AT_TEST([%define api.value.type variant])
AT_TEST([%define api.value.type variant], [with])
AT_TEST([%define api.value.type variant], [without])
m4_popdef([AT_TEST]) m4_popdef([AT_TEST])
+158 -12
View File
@@ -17,6 +17,152 @@
AT_BANNER([[Conflicts.]]) AT_BANNER([[Conflicts.]])
## ----------------- ##
## Precedence groups ##
## ----------------- ##
# Sample use case of precedence groups and relations, working.
AT_SETUP([Precedence groups])
AT_DATA_GRAMMAR([[input.y]],
[[%token CARET "^"
%token NUM BOOL '^' OR AND
%left '+' '-'
%gprec {
%right CARET
}
%gprec boolean {
%left OR
%left AND
}
%left '*' '/'
%precr boolean >> "^"
%precr CARET > '*' '/' '-' '+'
%%
stmt:
exp
| bool_exp
exp:
NUM
| exp '+' exp
| exp '-' exp
| exp '*' exp
| exp '/' exp
| exp "^" exp
bool_exp:
BOOL
| bool_exp AND bool_exp
| bool_exp OR bool_exp
| bool_exp CARET bool_exp
]])
AT_BISON_CHECK([[--report=all -o input.c input.y]], 0, [])
AT_CLEANUP
## -------------------------------- ##
## Conflicting precedence relations ##
## -------------------------------- ##
AT_SETUP([Conflicting precedence relations])
AT_DATA_GRAMMAR([[input.y]],
[[%token TOKEN
%precedence A
%precedence B
%precedence C
%precedence D E
%gprec group {
%precedence F
%precedence G
}
%precr B = C
%precr A > B
%precr C > B
%precr F > G
%precr F > A
%%
exp:
TOKEN
| exp A exp
| exp B exp
| exp C exp
| exp D exp
| exp E exp
| exp F exp
| exp G exp
]])
AT_BISON_CHECK([[-Wall -o input.c input.y]], 0, [],
[[input.y:20.10: warning: contradicting declaration: B = C is in conflict with the previous declaration: B > C [-Wprecedence]
input.y:21.10: warning: contradicting declaration: A > B is in conflict with the previous declaration: A < B [-Wprecedence]
input.y:22.10: warning: contradicting declaration: C > B is in conflict with the previous declaration: C = B [-Wprecedence]
input.y:23.10: warning: contradicting declaration: F > G is in conflict with the previous declaration: F < G [-Wprecedence]
input.y: warning: 27 shift/reduce conflicts [-Wconflicts-sr]
]])
AT_CLEANUP
## ------------------------------ ##
## Duplicate precedence relations ##
## ------------------------------ ##
AT_SETUP([Duplicate precedence relations])
AT_DATA_GRAMMAR([[input.y]],
[[%token TOKEN
%precedence A
%precedence B
%precedence C
%precedence D E
%gprec group {
%precedence F
%precedence G
}
%precr D = E
%precr B > A
%precr C > B
%precr G > F
%precr F > A
%precr C > group
%precr C > F
%%
exp:
TOKEN
| exp A exp
| exp B exp
| exp C exp
| exp D exp
| exp E exp
| exp F exp
| exp G exp
]])
AT_BISON_CHECK([[-Wall -o input.c input.y]], 0, [],
[[input.y:20.10: warning: duplicate declaration of the precedence relationship D = E [-Wprecedence]
input.y:20.10: warning: duplicate declaration of the precedence relationship E = D [-Wprecedence]
input.y:21.10: warning: duplicate declaration of the precedence relationship B > A [-Wprecedence]
input.y:22.10: warning: duplicate declaration of the precedence relationship C > B [-Wprecedence]
input.y:23.10: warning: duplicate declaration of the precedence relationship G > F [-Wprecedence]
input.y:26.10: warning: duplicate declaration of the precedence relationship C > F [-Wprecedence]
input.y: warning: 23 shift/reduce conflicts [-Wconflicts-sr]
]])
AT_CLEANUP
## ------------------------- ## ## ------------------------- ##
## Token declaration order. ## ## Token declaration order. ##
## ------------------------- ## ## ------------------------- ##
@@ -1447,7 +1593,7 @@ State 0
0 $accept: . start $end 0 $accept: . start $end
1 start: . resolved_conflict 'a' reported_conflicts 'a' 1 start: . resolved_conflict 'a' reported_conflicts 'a'
2 resolved_conflict: . 'a' unreachable1 2 resolved_conflict: . 'a' unreachable1
3 | . %empty ['a'] 3 | . ['a']
$default reduce using rule 3 (resolved_conflict) $default reduce using rule 3 (resolved_conflict)
@@ -1483,7 +1629,7 @@ State 4
1 start: resolved_conflict 'a' . reported_conflicts 'a' 1 start: resolved_conflict 'a' . reported_conflicts 'a'
8 reported_conflicts: . 'a' 8 reported_conflicts: . 'a'
9 | . 'a' 9 | . 'a'
10 | . %empty ['a'] 10 | . ['a']
'a' shift, and go to state 5 'a' shift, and go to state 5
@@ -1576,11 +1722,11 @@ AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0,
6 | . empty_c1 'c' 6 | . empty_c1 'c'
7 | . empty_c2 'c' 7 | . empty_c2 'c'
8 | . empty_c3 'c' 8 | . empty_c3 'c'
9 empty_a: . %empty ['a'] 9 empty_a: . ['a']
10 empty_b: . %empty [] 10 empty_b: . []
11 empty_c1: . %empty [] 11 empty_c1: . []
12 empty_c2: . %empty [] 12 empty_c2: . []
13 empty_c3: . %empty ['c'] 13 empty_c3: . ['c']
'b' shift, and go to state 1 'b' shift, and go to state 1
@@ -1652,11 +1798,11 @@ AT_CHECK([[cat input.output | sed -n '/^State 0$/,/^State 1$/p']], 0,
6 | . empty_c1 'c' 6 | . empty_c1 'c'
7 | . empty_c2 'c' 7 | . empty_c2 'c'
8 | . empty_c3 'c' 8 | . empty_c3 'c'
9 empty_a: . %empty [] 9 empty_a: . []
10 empty_b: . %empty [] 10 empty_b: . []
11 empty_c1: . %empty [] 11 empty_c1: . []
12 empty_c2: . %empty ['c'] 12 empty_c2: . ['c']
13 empty_c3: . %empty ['c'] 13 empty_c3: . ['c']
'a' error (nonassociative) 'a' error (nonassociative)
'b' error (nonassociative) 'b' error (nonassociative)
+7 -7
View File
@@ -94,19 +94,19 @@ prog :
stmt : expr ';' $2 { $$ = ]$[1; } stmt : expr ';' $2 { $$ = ]$[1; }
| decl $3 | decl $3
| error ';' { $$ = new_nterm ("<error>", YY_NULLPTR, YY_NULLPTR, YY_NULLPTR); } | error ';' { $$ = new_nterm ("<error>", YY_NULL, YY_NULL, YY_NULL); }
| '@' { YYACCEPT; } | '@' { YYACCEPT; }
; ;
expr : ID expr : ID
| TYPENAME '(' expr ')' | TYPENAME '(' expr ')'
{ $$ = new_nterm ("<cast>(%s,%s)", ]$[3, ]$[1, YY_NULLPTR); } { $$ = new_nterm ("<cast>(%s,%s)", ]$[3, ]$[1, YY_NULL); }
| expr '+' expr { $$ = new_nterm ("+(%s,%s)", ]$[1, ]$[3, YY_NULLPTR); } | expr '+' expr { $$ = new_nterm ("+(%s,%s)", ]$[1, ]$[3, YY_NULL); }
| expr '=' expr { $$ = new_nterm ("=(%s,%s)", ]$[1, ]$[3, YY_NULLPTR); } | expr '=' expr { $$ = new_nterm ("=(%s,%s)", ]$[1, ]$[3, YY_NULL); }
; ;
decl : TYPENAME declarator ';' decl : TYPENAME declarator ';'
{ $$ = new_nterm ("<declare>(%s,%s)", ]$[1, ]$[2, YY_NULLPTR); } { $$ = new_nterm ("<declare>(%s,%s)", ]$[1, ]$[2, YY_NULL); }
| TYPENAME declarator '=' expr ';' | TYPENAME declarator '=' expr ';'
{ $$ = new_nterm ("<init-declare>(%s,%s,%s)", ]$[1, { $$ = new_nterm ("<init-declare>(%s,%s,%s)", ]$[1,
]$[2, ]$[4); } ]$[2, ]$[4); }
@@ -195,7 +195,7 @@ main (int argc, char **argv)
{ {
colNum += 1; colNum += 1;
tok = c; tok = c;
yylval = YY_NULLPTR; yylval = YY_NULL;
}]AT_LOCATION_IF([[ }]AT_LOCATION_IF([[
yylloc.last_column = colNum-1;]])[ yylloc.last_column = colNum-1;]])[
return tok; return tok;
@@ -287,7 +287,7 @@ m4_bmatch([$2], [stmtMerge],
[[static YYSTYPE [[static YYSTYPE
stmtMerge (YYSTYPE x0, YYSTYPE x1) stmtMerge (YYSTYPE x0, YYSTYPE x1)
{ {
return new_nterm ("<OR>(%s,%s)", x0, x1, YY_NULLPTR); return new_nterm ("<OR>(%s,%s)", x0, x1, YY_NULL);
} }
]]) ]])
) )
+4 -4
View File
@@ -484,7 +484,7 @@ dnl - 61 -> 328: reduce -> shift on '*', '/', and '%'
NAME [reduce using rule 152 (opt_variable)] NAME [reduce using rule 152 (opt_variable)]
'$' [reduce using rule 152 (opt_variable)] '$' [reduce using rule 152 (opt_variable)]
@@ -5379,7 +5379,7 @@ @@ -5385,7 +5385,7 @@
156 | . '$' non_post_simp_exp 156 | . '$' non_post_simp_exp
NAME shift, and go to state 9 NAME shift, and go to state 9
@@ -493,7 +493,7 @@ dnl - 61 -> 328: reduce -> shift on '*', '/', and '%'
NAME [reduce using rule 152 (opt_variable)] NAME [reduce using rule 152 (opt_variable)]
'$' [reduce using rule 152 (opt_variable)] '$' [reduce using rule 152 (opt_variable)]
@@ -5399,7 +5399,7 @@ @@ -5405,7 +5405,7 @@
156 | . '$' non_post_simp_exp 156 | . '$' non_post_simp_exp
NAME shift, and go to state 9 NAME shift, and go to state 9
@@ -502,7 +502,7 @@ dnl - 61 -> 328: reduce -> shift on '*', '/', and '%'
NAME [reduce using rule 152 (opt_variable)] NAME [reduce using rule 152 (opt_variable)]
'$' [reduce using rule 152 (opt_variable)] '$' [reduce using rule 152 (opt_variable)]
@@ -6214,7 +6214,7 @@ @@ -6220,7 +6220,7 @@
156 | . '$' non_post_simp_exp 156 | . '$' non_post_simp_exp
NAME shift, and go to state 9 NAME shift, and go to state 9
@@ -511,7 +511,7 @@ dnl - 61 -> 328: reduce -> shift on '*', '/', and '%'
NAME [reduce using rule 152 (opt_variable)] NAME [reduce using rule 152 (opt_variable)]
'$' [reduce using rule 152 (opt_variable)] '$' [reduce using rule 152 (opt_variable)]
@@ -11099,3 +11099,274 @@ @@ -11117,3 +11117,274 @@
45 statement: LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement . 45 statement: LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement .
$default reduce using rule 45 (statement) $default reduce using rule 45 (statement)
+2 -32
View File
@@ -67,7 +67,7 @@ static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1)
return 0; return 0;
} }
const char *input = YY_NULLPTR; const char *input = YY_NULL;
int int
main (int argc, const char* argv[]) main (int argc, const char* argv[])
@@ -304,7 +304,7 @@ MergeRule (int x0, int x1)
} }
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
FILE *input = YY_NULLPTR; FILE *input = YY_NULL;
int P[] = { P1, P2 }; int P[] = { P1, P2 };
int O[] = { O1, O2 }; int O[] = { O1, O2 };
@@ -1749,33 +1749,3 @@ Cleanup: popping token 'a' ()
]) ])
AT_CLEANUP AT_CLEANUP
## ----------------------------------------------------------------- ##
## Predicates. ##
## ##
## http://lists.gnu.org/archive/html/bug-bison/2013-10/msg00004.html ##
## ----------------------------------------------------------------- ##
AT_SETUP([Predicates])
# FIXME: We need genuine test cases with uses of %?.
AT_DATA_GRAMMAR([input.y],
[[%glr-parser
%expect-rr 1
%%
// Exercise "%?{...}" and "%? {...}".
widget:
%? {new_syntax} "widget" id new_args { $$ = f($3, $4); }
| %?{!new_syntax} "widget" id old_args { $$ = f($3, $4); }
;
id:;
new_args:;
old_args:;
%%
]])
AT_BISON_CHECK([[input.y]])
AT_CLEANUP
+2 -6
View File
@@ -223,13 +223,9 @@ AT_CHECK([[$PERL -n -0777 -e '
s{/\*.*?\*/}{}gs; s{/\*.*?\*/}{}gs;
s{//.*}{}g; s{//.*}{}g;
s{\b(YYChar s{\b(YYChar
|YYPUSH_MORE(?:_DEFINED)? |YYPUSH_MORE(_DEFINED)?
|YYUSE
|YY_ATTRIBUTE(?:_PURE|_UNUSED)?
|YY_IGNORE_MAYBE_UNINITIALIZED_(?:BEGIN|END)
|YY_INITIAL_VALUE
|YY_\w+_INCLUDED |YY_\w+_INCLUDED
|YY_NULLPTR |YY_NULL
|(defined|if)\ YYDEBUG |(defined|if)\ YYDEBUG
)\b}{}gx; )\b}{}gx;
while (/^(.*YY.*)$/gm) while (/^(.*YY.*)$/gm)
+23 -30
View File
@@ -64,14 +64,13 @@ AT_CHECK([[$PERL -pi -e 's/\\(\d{3})/chr(oct($1))/ge' input.y || exit 77]])
AT_BISON_CHECK([input.y], [1], [], AT_BISON_CHECK([input.y], [1], [],
[[input.y:1.1-2: error: invalid characters: '\0\001\002\377?' [[input.y:1.1-2: error: invalid characters: '\0\001\002\377?'
input.y:3.1: error: invalid character: '?' input.y:3.1: error: invalid character: '?'
input.y:4.14: error: invalid character: '}' input.y:4.14: error: syntax error, unexpected }
input.y:5.1: error: invalid character: '%' input.y:5.1: error: invalid character: '%'
input.y:5.2: error: invalid character: '&' input.y:5.2: error: invalid character: '&'
input.y:6.1-17: error: invalid directive: '%a-does-not-exist' input.y:6.1-17: error: invalid directive: '%a-does-not-exist'
input.y:7.1: error: invalid character: '%' input.y:7.1: error: invalid character: '%'
input.y:7.2: error: invalid character: '-' input.y:7.2: error: invalid character: '-'
input.y:8.1-9.0: error: missing '%}' at end of file input.y:8.1-9.0: error: missing '%}' at end of file
input.y:8.1-9.0: error: syntax error, unexpected %{...%}
]]) ]])
AT_CLEANUP AT_CLEANUP
@@ -672,25 +671,25 @@ exp: foo;
]]) ]])
AT_BISON_CHECK([-fcaret input.y], [1], [], AT_BISON_CHECK([-fcaret input.y], [1], [],
[[input.y:8.7-11: error: %type redeclaration for foo [[input.y:8.7-11: error: %type redeclaration for "foo"
%type <baz> "foo" %type <baz> "foo"
^^^^^ ^^^^^
input.y:3.7-11: previous declaration input.y:3.7-11: previous declaration
%type <bar> foo %type <bar> foo
^^^^^ ^^^^^
input.y:10.13-17: error: %destructor redeclaration for foo input.y:9.10-14: error: %printer redeclaration for "foo"
%destructor {baz} "foo"
^^^^^
input.y:5.13-17: previous declaration
%destructor {bar} foo
^^^^^
input.y:9.10-14: error: %printer redeclaration for foo
%printer {baz} "foo" %printer {baz} "foo"
^^^^^ ^^^^^
input.y:4.10-14: previous declaration input.y:4.10-14: previous declaration
%printer {bar} foo %printer {bar} foo
^^^^^ ^^^^^
input.y:11.1-5: error: %left redeclaration for foo input.y:10.13-17: error: %destructor redeclaration for "foo"
%destructor {baz} "foo"
^^^^^
input.y:5.13-17: previous declaration
%destructor {bar} foo
^^^^^
input.y:11.1-5: error: %left redeclaration for "foo"
%left "foo" %left "foo"
^^^^^ ^^^^^
input.y:6.1-5: previous declaration input.y:6.1-5: previous declaration
@@ -956,9 +955,15 @@ without_period: "WITHOUT.PERIOD";
AT_BISON_OPTION_POPDEFS AT_BISON_OPTION_POPDEFS
# POSIX Yacc accept periods, but not dashes. # POSIX Yacc accept periods, but not dashes.
AT_BISON_CHECK([--yacc input.y], [1], [], AT_BISON_CHECK([--yacc -Wno-error input.y], [], [],
[[input.y:9.8-16: error: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Werror=yacc] [[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc]
input.y:20.8-16: error: POSIX Yacc forbids dashes in symbol names: with-dash [-Werror=yacc] input.y:20.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc]
]])
# So warn about them.
AT_BISON_CHECK([-Wyacc input.y], [], [],
[[input.y:9.8-16: warning: POSIX Yacc forbids dashes in symbol names: WITH-DASH [-Wyacc]
input.y:20.8-16: warning: POSIX Yacc forbids dashes in symbol names: with-dash [-Wyacc]
]]) ]])
# Dashes are fine for GNU Bison. # Dashes are fine for GNU Bison.
@@ -1762,11 +1767,11 @@ AT_BISON_CHECK([[-Dparse.lac.memory-trace=full input.y]],
AT_CLEANUP AT_CLEANUP
## ---------------------- ## ## --------------------------------------------- ##
## -Werror combinations. ## ## -Werror is not affected by -Wnone and -Wall. ##
## ---------------------- ## ## --------------------------------------------- ##
AT_SETUP([[-Werror combinations]]) AT_SETUP([[-Werror is not affected by -Wnone and -Wall]])
AT_DATA([[input.y]], AT_DATA([[input.y]],
[[%% [[%%
@@ -1792,18 +1797,6 @@ AT_BISON_CHECK([[-Werror,no-all,other input.y]], [[1]], [[]],
[[input.y:2.15: error: stray '$' [-Werror=other] [[input.y:2.15: error: stray '$' [-Werror=other]
]]) ]])
# Check that -Wno-error keeps warnings enabled, but non fatal.
AT_BISON_CHECK([[-Werror -Wno-error=other input.y]], [[0]], [[]],
[[input.y:2.15: warning: stray '$' [-Wother]
]])
AT_BISON_CHECK([[-Wno-error=other -Werror input.y]], [[0]], [[]],
[[input.y:2.15: warning: stray '$' [-Wother]
]])
AT_BISON_CHECK([[-Werror=other -Wno-other input.y]], [[0]], [[]],
[[]])
AT_CLEANUP AT_CLEANUP
+4 -9
View File
@@ -725,23 +725,18 @@ AT_CLEANUP
AT_SETUP([Java constructor init and init_throws]) AT_SETUP([Java constructor init and init_throws])
m4_pushdef([AT_Witness],
[super("Test Thread"); if (true) throw new InterruptedException();])
AT_CHECK_JAVA_MINIMAL([[ AT_CHECK_JAVA_MINIMAL([[
%define extends {Thread} %define extends {Thread}
%code init { ]AT_Witness[ } %code init { super("Test Thread"); if (true) throw new InterruptedException(); }
%define init_throws {InterruptedException} %define init_throws {InterruptedException}
%lex-param {int lex_param}]]) %lex-param {int lex_param}]])
AT_CHECK([[grep ']AT_Witness[' YYParser.java]], 0, [ignore]) AT_CHECK([[grep -q 'super("Test Thread"); if (true) throw new InterruptedException();' YYParser.java]])
AT_CHECK_JAVA_MINIMAL_W_LEXER([[ AT_CHECK_JAVA_MINIMAL_W_LEXER([[
%define extends {Thread} %define extends {Thread}
%code init { ]AT_Witness[ } %code init { super("Test Thread"); if (true) throw new InterruptedException(); }
%define init_throws {InterruptedException}]], [], [[return EOF;]]) %define init_throws {InterruptedException}]], [], [[return EOF;]])
AT_CHECK([[grep ']AT_Witness[' YYParser.java]], 0, [ignore]) AT_CHECK([[grep -q 'super("Test Thread"); if (true) throw new InterruptedException();' YYParser.java]])
m4_popdef([AT_Witness])
AT_CLEANUP AT_CLEANUP
+1 -47
View File
@@ -635,12 +635,9 @@ m4_define([AT_BISON_CHECK_],
# ---------------------------------------------------------- # ----------------------------------------------------------
# Check that warnings (if some are expected) are correctly # Check that warnings (if some are expected) are correctly
# turned into errors with -Werror, etc. # turned into errors with -Werror, etc.
#
# When -Wno-error is used, the rules are really different, don't try.
m4_define([AT_BISON_CHECK_WARNINGS], m4_define([AT_BISON_CHECK_WARNINGS],
[m4_if(m4_bregexp([$4], [: warning: ]), [-1], [], [m4_if(m4_bregexp([$4], [: warning: ]), [-1], [],
m4_bregexp([$1], [-Wno-error=]), [-1], [m4_null_if([$2], [AT_BISON_CHECK_WARNINGS_($@)])])])
[m4_null_if([$2], [AT_BISON_CHECK_WARNINGS_($@)])])])
m4_define([AT_BISON_CHECK_WARNINGS_], m4_define([AT_BISON_CHECK_WARNINGS_],
[[# Defining POSIXLY_CORRECT causes bison to complain if options are [[# Defining POSIXLY_CORRECT causes bison to complain if options are
@@ -875,49 +872,6 @@ AT_PARSER_CHECK([./c-and-cxx])
]) ])
# AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR
# ------------------------------------
# Check that we can expect exceptions to be handled properly.
# GCC 4.3 and 4.4 fail https://trac.macports.org/ticket/40853.
m4_define([AT_SKIP_IF_EXCEPTION_SUPPORT_IS_POOR],
[AT_DATA_SOURCE([exception.cc],
[[#include <iostream>
#include <stdexcept>
void foo()
{
try
{
throw std::runtime_error("foo");
}
catch (...)
{
std::cerr << "Inner caught" << std::endl;
throw;
}
}
int main()
{
try
{
foo();
}
catch (...)
{
std::cerr << "Outer caught" << std::endl;
return 0;
}
return 1;
}
]])
AT_COMPILE_CXX([exception])
# The "empty" quadrigraph is to protect from cfg.mk's
# sc_at_parser_check.
AT_CHECK([@&t@./exception || exit 77], [0], [], [ignore])
])
## ---------------------------- ## ## ---------------------------- ##
## Running a generated parser. ## ## Running a generated parser. ##
## ---------------------------- ## ## ---------------------------- ##
+1 -4
View File
@@ -85,7 +85,7 @@ $(TESTSUITE): $(TESTSUITE_AT)
# Move into tests/ so that testsuite.dir etc. be created there. # Move into tests/ so that testsuite.dir etc. be created there.
RUN_TESTSUITE = $(TESTSUITE) -C tests $(TESTSUITEFLAGS) RUN_TESTSUITE = $(TESTSUITE) -C tests $(TESTSUITEFLAGS)
check_SCRIPTS = $(BISON) tests/atconfig tests/atlocal check_SCRIPTS = $(BISON) tests/atconfig tests/atlocal
RUN_TESTSUITE_deps = all $(TESTSUITE) $(check_SCRIPTS) RUN_TESTSUITE_deps = $(TESTSUITE) $(check_SCRIPTS)
clean-local: clean-local-tests clean-local: clean-local-tests
clean-local-tests: clean-local-tests:
@@ -126,6 +126,3 @@ maintainer-push-check:
maintainer-xml-check: maintainer-xml-check:
$(MAKE) $(AM_MAKEFLAGS) maintainer-check \ $(MAKE) $(AM_MAKEFLAGS) maintainer-check \
TESTSUITEFLAGS='BISON_TEST_XML=1 $(TESTSUITEFLAGS)' TESTSUITEFLAGS='BISON_TEST_XML=1 $(TESTSUITEFLAGS)'
.PHONY: maintainer-release-check
maintainer-release-check: maintainer-check maintainer-push-check maintainer-xml-check
+19 -38
View File
@@ -17,23 +17,12 @@
AT_BANNER([[Output file names.]]) AT_BANNER([[Output file names.]])
# AT_CHECK_FILES(EXPECTED-FILES, [IGNORED-FILES])
# -----------------------------------------------
# Check that the current directory contains FILE... (sorted).
m4_define([AT_CHECK_FILES],
[AT_CHECK([[find . -type f |
$PERL -ne '
s,\./,,; chomp;
push @file, $_ unless m{^($2|testsuite.log)$};
END { print join (" ", sort @file), "\n" }']],
[], [$1
])])
# AT_CHECK_OUTPUT(INPUT-FILE, [DIRECTIVES], [FLAGS], EXPECTED-FILES, [STATUS], # AT_CHECK_OUTPUT(INPUT-FILE, [DIRECTIVES], [FLAGS], EXPECTED-FILES, [SHELLIO],
# [ADDITIONAL-TESTS], [PRE-TESTS]) # [ADDITIONAL-TESTS], [PRE-TESTS])
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
m4_define([AT_CHECK_OUTPUT], m4_define([AT_CHECK_OUTPUT],
[AT_SETUP([[Output files: ]$2 $3])[ [AT_SETUP([[Output files: ]$2 $3 $5])[
]$7[ ]$7[
for file in ]$1 $4[; do for file in ]$1 $4[; do
case $file in case $file in
@@ -43,12 +32,18 @@ done
]AT_DATA([$1], ]AT_DATA([$1],
[$2[ [$2[
%% %%
foo: %empty {}; foo: {};
]])[ ]])[
]AT_BISON_CHECK([$3 $1], [$5], [], [ignore])[ ]AT_BISON_CHECK([$3 $1 $5], 0)[
# Ignore the files non-generated files # Ignore the files non-generated files
]AT_CHECK_FILES([$4], [$1])[ ]AT_CHECK([[find . -type f |
$PERL -ne '
s,\./,,; chomp;
push @file, $_ unless m{^($1|testsuite.log)$};
END { print join (" ", sort @file), "\n" }']],
[], [$4
])[
]$6[ ]$6[
]AT_CLEANUP[ ]AT_CLEANUP[
]]) ]])
@@ -59,9 +54,9 @@ AT_CHECK_OUTPUT([foo.y], [], [-dv],
# Some versions of Valgrind (at least valgrind-3.6.0.SVN-Debian) report # Some versions of Valgrind (at least valgrind-3.6.0.SVN-Debian) report
# "fgrep: write error: Bad file descriptor" when stdout is closed, so we # "fgrep: write error: Bad file descriptor" when stdout is closed, so we
# skip this test group during maintainer-check-valgrind. # skip this test group during maintainer-check-valgrind.
AT_CHECK_OUTPUT([foo.y], [], [-dv >&-], AT_CHECK_OUTPUT([foo.y], [], [-dv],
[foo.output foo.tab.c foo.tab.h], [foo.output foo.tab.c foo.tab.h],
[], [], [>&-], [],
[AT_CHECK([[case "$PREBISON" in *valgrind*) exit 77;; esac]])]) [AT_CHECK([[case "$PREBISON" in *valgrind*) exit 77;; esac]])])
AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.c], AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.c],
@@ -119,20 +114,6 @@ AT_CHECK_OUTPUT([foo.yy], [],
[-o foo.c++ --graph=foo.gph], [-o foo.c++ --graph=foo.gph],
[foo.c++ foo.gph]) [foo.c++ foo.gph])
# Do not generate code when there are early errors (even warnings as
# errors).
AT_CHECK_OUTPUT([foo.y], [%type <foo> useless],
[--defines --graph --xml --report=all -Wall -Werror],
[foo.dot foo.output foo.xml],
[1])
# Do not generate code when there are late errors (even warnings as
# errors).
AT_CHECK_OUTPUT([foo.y], [%define useless],
[--defines --graph --xml --report=all -Wall -Werror],
[foo.dot foo.output foo.xml],
[1])
## ------------ ## ## ------------ ##
## C++ output. ## ## C++ output. ##
@@ -309,7 +290,7 @@ a: ;
b: 'b'; b: 'b';
]], ]],
[[ [[
0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a '?' b\l 2 a: . %empty\l"] 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a '?' b\l 2 a: .\l"]
0 -> 1 [style=dashed label="exp"] 0 -> 1 [style=dashed label="exp"]
0 -> 2 [style=dashed label="a"] 0 -> 2 [style=dashed label="a"]
0 -> "0R2" [style=solid] 0 -> "0R2" [style=solid]
@@ -351,7 +332,7 @@ empty_b: %prec 'b';
empty_c: %prec 'c'; empty_c: %prec 'c';
]], ]],
[[ [[
0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . %empty ['a']\l 8 empty_b: . %empty ['b']\l 9 empty_c: . %empty ['c']\l"] 0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . ['a']\l 8 empty_b: . ['b']\l 9 empty_c: . ['c']\l"]
0 -> 1 [style=solid label="'a'"] 0 -> 1 [style=solid label="'a'"]
0 -> 2 [style=solid label="'b'"] 0 -> 2 [style=solid label="'b'"]
0 -> 3 [style=solid label="'c'"] 0 -> 3 [style=solid label="'c'"]
@@ -418,7 +399,7 @@ empty_b: %prec 'b';
empty_c: %prec 'c'; empty_c: %prec 'c';
]], ]],
[[ [[
0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . %empty ['a']\l 8 empty_b: . %empty []\l 9 empty_c: . %empty []\l"] 0 [label="State 0\n\l 0 $accept: . start $end\l 1 start: . 'a'\l 2 | . empty_a 'a'\l 3 | . 'b'\l 4 | . empty_b 'b'\l 5 | . 'c'\l 6 | . empty_c 'c'\l 7 empty_a: . ['a']\l 8 empty_b: . []\l 9 empty_c: . []\l"]
0 -> 1 [style=solid label="'b'"] 0 -> 1 [style=solid label="'b'"]
0 -> 2 [style=solid label="'c'"] 0 -> 2 [style=solid label="'c'"]
0 -> 3 [style=dashed label="start"] 0 -> 3 [style=dashed label="start"]
@@ -466,7 +447,7 @@ a: ;
b: ; b: ;
]], ]],
[[ [[
0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a\l 2 | . b\l 3 a: . %empty [$end]\l 4 b: . %empty [$end]\l"] 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a\l 2 | . b\l 3 a: . [$end]\l 4 b: . [$end]\l"]
0 -> 1 [style=dashed label="exp"] 0 -> 1 [style=dashed label="exp"]
0 -> 2 [style=dashed label="a"] 0 -> 2 [style=dashed label="a"]
0 -> 3 [style=dashed label="b"] 0 -> 3 [style=dashed label="b"]
@@ -499,7 +480,7 @@ b: ;
c: ; c: ;
]], ]],
[[ [[
0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a ';'\l 2 | . a ';'\l 3 | . a '.'\l 4 | . b '?'\l 5 | . b '!'\l 6 | . c '?'\l 7 | . c ';'\l 8 a: . %empty [';', '.']\l 9 b: . %empty ['?', '!']\l 10 c: . %empty [';', '?']\l"] 0 [label="State 0\n\l 0 $accept: . exp $end\l 1 exp: . a ';'\l 2 | . a ';'\l 3 | . a '.'\l 4 | . b '?'\l 5 | . b '!'\l 6 | . c '?'\l 7 | . c ';'\l 8 a: . [';', '.']\l 9 b: . ['?', '!']\l 10 c: . [';', '?']\l"]
0 -> 1 [style=dashed label="exp"] 0 -> 1 [style=dashed label="exp"]
0 -> 2 [style=dashed label="a"] 0 -> 2 [style=dashed label="a"]
0 -> 3 [style=dashed label="b"] 0 -> 3 [style=dashed label="b"]
@@ -614,7 +595,7 @@ imm: '0';
"11R7d" [label="R7", fillcolor=5, shape=diamond, style=filled] "11R7d" [label="R7", fillcolor=5, shape=diamond, style=filled]
11 -> "11R7" [style=solid] 11 -> "11R7" [style=solid]
"11R7" [label="R7", fillcolor=3, shape=diamond, style=filled] "11R7" [label="R7", fillcolor=3, shape=diamond, style=filled]
12 [label="State 12\n\l 4 ifexp: \"if\" exp \"then\" exp . elseexp\l 5 elseexp: . \"else\" exp\l 6 | . %empty [$end, \"then\", \"else\", '+']\l 7 opexp: exp . '+' exp\l"] 12 [label="State 12\n\l 4 ifexp: \"if\" exp \"then\" exp . elseexp\l 5 elseexp: . \"else\" exp\l 6 | . [$end, \"then\", \"else\", '+']\l 7 opexp: exp . '+' exp\l"]
12 -> 13 [style=solid label="\"else\""] 12 -> 13 [style=solid label="\"else\""]
12 -> 9 [style=solid label="'+'"] 12 -> 9 [style=solid label="'+'"]
12 -> 14 [style=dashed label="elseexp"] 12 -> 14 [style=dashed label="elseexp"]
+5 -5
View File
@@ -57,12 +57,12 @@ main (void)
/* yypstate_delete used to leak ps->yyss if the stack was reallocated but the /* yypstate_delete used to leak ps->yyss if the stack was reallocated but the
parse did not return on success, syntax error, or memory exhaustion. */ parse did not return on success, syntax error, or memory exhaustion. */
ps = yypstate_new (); ps = yypstate_new ();
assert (yypush_parse (ps, 'a', YY_NULLPTR) == YYPUSH_MORE); assert (yypush_parse (ps, 'a', YY_NULL) == YYPUSH_MORE);
yypstate_delete (ps); yypstate_delete (ps);
ps = yypstate_new (); ps = yypstate_new ();
assert (yypush_parse (ps, 'a', YY_NULLPTR) == YYPUSH_MORE); assert (yypush_parse (ps, 'a', YY_NULL) == YYPUSH_MORE);
assert (yypush_parse (ps, 'b', YY_NULLPTR) == YYPUSH_MORE); assert (yypush_parse (ps, 'b', YY_NULL) == YYPUSH_MORE);
yypstate_delete (ps); yypstate_delete (ps);
return 0; return 0;
@@ -111,11 +111,11 @@ main (void)
{ {
yypstate *ps = yypstate_new (); yypstate *ps = yypstate_new ();
assert (ps); assert (ps);
assert (yypstate_new () == YY_NULLPTR); assert (yypstate_new () == YY_NULL);
]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[;
yychar = 0; yychar = 0;
assert (yypush_parse (ps) == 0); assert (yypush_parse (ps) == 0);
assert (yypstate_new () == YY_NULLPTR); assert (yypstate_new () == YY_NULL);
]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[; ]m4_if([$1], [[both]], [[assert (yyparse () == 2)]])[;
yypstate_delete (ps); yypstate_delete (ps);
} }
+5 -5
View File
@@ -1057,7 +1057,7 @@ State 12
4 A: 'a' 'a' . B 4 A: 'a' 'a' . B
5 B: . 'a' 5 B: . 'a'
6 | . %empty ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[ 6 | . ]AT_COND_CASE([[LALR]], [[['a', 'b']]], [[['a']]])[
]AT_COND_CASE([[canonical LR]], [['a']], ]AT_COND_CASE([[canonical LR]], [['a']],
[[$default]])[ reduce using rule 6 (B) [[$default]])[ reduce using rule 6 (B)
@@ -1087,7 +1087,7 @@ State 15
4 A: 'a' 'a' . B 4 A: 'a' 'a' . B
5 B: . 'a' 5 B: . 'a'
6 | . %empty [$end] 6 | . [$end]
7 c: 'a' 'a' . 'b' 7 c: 'a' 'a' . 'b'
'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[20]], 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[20]],
@@ -1150,7 +1150,7 @@ State 22]])[
4 A: 'a' 'a' . B 4 A: 'a' 'a' . B
5 B: . 'a' 5 B: . 'a'
6 | . %empty ['b'] 6 | . ['b']
'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[23]], 'a' shift, and go to state ]AT_COND_CASE([[canonical LR]], [[23]],
[[16]])[ [[16]])[
@@ -1575,8 +1575,8 @@ State 3
1 start: a . b 1 start: a . b
2 | a . b 'a' 2 | a . b 'a'
3 | a . c 'b' 3 | a . c 'b'
5 b: . %empty [$end, 'a'] 5 b: . [$end, 'a']
6 c: . %empty ['b']]AT_COND_CASE([[most]], [[ 6 c: . ['b']]AT_COND_CASE([[most]], [[
'b' reduce using rule 6 (c) 'b' reduce using rule 6 (c)
$default reduce using rule 5 (b)]], [[ $default reduce using rule 5 (b)]], [[
+2 -3
View File
@@ -405,14 +405,13 @@ default: 'a' }
AT_BISON_CHECK([input.y], [1], [], AT_BISON_CHECK([input.y], [1], [],
[[input.y:2.1: error: invalid character: '?' [[input.y:2.1: error: invalid character: '?'
input.y:3.14: error: invalid character: '}' input.y:3.14: error: syntax error, unexpected }
input.y:4.1: error: invalid character: '%' input.y:4.1: error: invalid character: '%'
input.y:4.2: error: invalid character: '&' input.y:4.2: error: invalid character: '&'
input.y:5.1-17: error: invalid directive: '%a-does-not-exist' input.y:5.1-17: error: invalid directive: '%a-does-not-exist'
input.y:6.1: error: invalid character: '%' input.y:6.1: error: invalid character: '%'
input.y:6.2: error: invalid character: '-' input.y:6.2: error: invalid character: '-'
input.y:7.1-8.0: error: missing '%}' at end of file input.y:7.1-8.0: error: missing '%}' at end of file
input.y:7.1-8.0: error: syntax error, unexpected %{...%}
]]) ]])
AT_CLEANUP AT_CLEANUP
@@ -770,7 +769,7 @@ static const yytype_uint8 yyrline[] =
static const char *const yytname[] = static const char *const yytname[] =
{ {
"$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"", "$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"",
"\"else\"", "$accept", "statement", "struct_stat", "if", "else", YY_NULLPTR "\"else\"", "$accept", "statement", "struct_stat", "if", "else", YY_NULL
}; };
static const yytype_uint16 yytoknum[] = static const yytype_uint16 yytoknum[] =
{ {