mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-08-10 19:25:15 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
534497f54b | ||
|
|
a62a7b014c | ||
|
|
de1a2f20dd | ||
|
|
afcc58c63e | ||
|
|
d3ae5af6ec | ||
|
|
41dfa1cbf0 | ||
|
|
b7171c45f4 | ||
|
|
ac953ff80a | ||
|
|
facb910cbd | ||
|
|
8faace8d1d | ||
|
|
9cdcbdf2cf | ||
|
|
45c64fa627 | ||
|
|
58b465ae5f | ||
|
|
d116722c54 | ||
|
|
1d678854a4 | ||
|
|
28c4075b58 | ||
|
|
aa94def12d | ||
|
|
0fcc2e9a74 | ||
|
|
94a6225578 | ||
|
|
02798ba13d | ||
|
|
8e13c5c03b | ||
|
|
266cdc3025 |
+1
-1
@@ -1 +1 @@
|
|||||||
2.7.1
|
2.7.91
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
GNU Bison NEWS
|
GNU Bison NEWS
|
||||||
|
|
||||||
* Noteworthy changes in release 2.7.90 (2013-05-30) [beta]
|
* Noteworthy changes in release 3.0 (2013-07-25) [stable]
|
||||||
|
|
||||||
** WARNING: Future backward-incompatibilities!
|
** WARNING: Future backward-incompatibilities!
|
||||||
|
|
||||||
@@ -516,11 +516,13 @@ GNU Bison NEWS
|
|||||||
|
|
||||||
** Java skeleton improvements
|
** Java skeleton improvements
|
||||||
|
|
||||||
Contributed by Paolo Bonzini.
|
|
||||||
|
|
||||||
The constants for token names were moved to the Lexer interface. Also, it
|
The constants for token names were moved to the Lexer interface. Also, it
|
||||||
is possible to add code to the parser's constructors using "%code init"
|
is possible to add code to the parser's constructors using "%code init"
|
||||||
and "%define init_throws".
|
and "%define init_throws".
|
||||||
|
Contributed by Paolo Bonzini.
|
||||||
|
|
||||||
|
The Java skeleton now supports push parsing.
|
||||||
|
Contributed by Dennis Heimbigner.
|
||||||
|
|
||||||
** C++ skeletons improvements
|
** C++ skeletons improvements
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Print a version string.
|
# Print a version string.
|
||||||
scriptversion=2013-05-08.20; # UTC
|
scriptversion=2013-07-03.20; # UTC
|
||||||
|
|
||||||
# Bootstrap this package from checked-out sources.
|
# Bootstrap this package from checked-out sources.
|
||||||
|
|
||||||
@@ -256,12 +256,12 @@ esac
|
|||||||
# Extra files from gnulib, which override files from other sources.
|
# Extra files from gnulib, which override files from other sources.
|
||||||
test -z "${gnulib_extra_files}" && \
|
test -z "${gnulib_extra_files}" && \
|
||||||
gnulib_extra_files="
|
gnulib_extra_files="
|
||||||
$build_aux/install-sh
|
build-aux/install-sh
|
||||||
$build_aux/mdate-sh
|
build-aux/mdate-sh
|
||||||
$build_aux/texinfo.tex
|
build-aux/texinfo.tex
|
||||||
$build_aux/depcomp
|
build-aux/depcomp
|
||||||
$build_aux/config.guess
|
build-aux/config.guess
|
||||||
$build_aux/config.sub
|
build-aux/config.sub
|
||||||
doc/INSTALL
|
doc/INSTALL
|
||||||
"
|
"
|
||||||
|
|
||||||
@@ -551,7 +551,7 @@ 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 test -d .git && (git --version) >/dev/null 2>/dev/null ; 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 (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
|
elif (git-merge-changelog --version) >/dev/null 2>/dev/null ; then
|
||||||
@@ -574,13 +574,17 @@ git_modules_config () {
|
|||||||
test -f .gitmodules && git config --file .gitmodules "$@"
|
test -f .gitmodules && git config --file .gitmodules "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
gnulib_path=$(git_modules_config submodule.gnulib.path)
|
if $use_git; then
|
||||||
test -z "$gnulib_path" && gnulib_path=gnulib
|
gnulib_path=$(git_modules_config submodule.gnulib.path)
|
||||||
|
test -z "$gnulib_path" && gnulib_path=gnulib
|
||||||
|
fi
|
||||||
|
|
||||||
# Get gnulib files.
|
# Get gnulib files. Populate $GNULIB_SRCDIR, possibly updating a
|
||||||
|
# submodule, for use in the rest of the script.
|
||||||
|
|
||||||
case ${GNULIB_SRCDIR--} in
|
case ${GNULIB_SRCDIR--} in
|
||||||
-)
|
-)
|
||||||
|
# Note that $use_git is necessarily true in this case.
|
||||||
if git_modules_config submodule.gnulib.url >/dev/null; then
|
if git_modules_config submodule.gnulib.url >/dev/null; then
|
||||||
echo "$0: getting gnulib files..."
|
echo "$0: getting gnulib files..."
|
||||||
git submodule init || exit $?
|
git submodule init || exit $?
|
||||||
@@ -601,8 +605,8 @@ case ${GNULIB_SRCDIR--} in
|
|||||||
GNULIB_SRCDIR=$gnulib_path
|
GNULIB_SRCDIR=$gnulib_path
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
# Use GNULIB_SRCDIR as a reference.
|
# Use GNULIB_SRCDIR directly or as a reference.
|
||||||
if test -d "$GNULIB_SRCDIR"/.git && \
|
if $use_git && test -d "$GNULIB_SRCDIR"/.git && \
|
||||||
git_modules_config submodule.gnulib.url >/dev/null; then
|
git_modules_config submodule.gnulib.url >/dev/null; then
|
||||||
echo "$0: getting gnulib files..."
|
echo "$0: getting gnulib files..."
|
||||||
if git submodule -h|grep -- --reference > /dev/null; then
|
if git submodule -h|grep -- --reference > /dev/null; then
|
||||||
@@ -628,6 +632,9 @@ case ${GNULIB_SRCDIR--} in
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# $GNULIB_SRCDIR now points to the version of gnulib to use, and
|
||||||
|
# we no longer need to use git or $gnulib_path below here.
|
||||||
|
|
||||||
if $bootstrap_sync; then
|
if $bootstrap_sync; then
|
||||||
cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || {
|
cmp -s "$0" "$GNULIB_SRCDIR/build-aux/bootstrap" || {
|
||||||
echo "$0: updating bootstrap and restarting..."
|
echo "$0: updating bootstrap and restarting..."
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# Linux seattle 2.6.32-5-amd64 #1 SMP Thu Mar 22 17:26:33 UTC 2012
|
||||||
|
# x86_64 GNU/Linux
|
||||||
|
{
|
||||||
|
index
|
||||||
|
Memcheck:Cond
|
||||||
|
fun:index
|
||||||
|
fun:expand_dynamic_string_token
|
||||||
|
fun:_dl_map_object
|
||||||
|
fun:map_doit
|
||||||
|
fun:_dl_catch_error
|
||||||
|
fun:do_preload
|
||||||
|
fun:dl_main
|
||||||
|
fun:_dl_sysdep_start
|
||||||
|
fun:_dl_start
|
||||||
|
obj:/lib/ld-2.11.3.so
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
build-aux/cross-options.pl \
|
build-aux/cross-options.pl \
|
||||||
build-aux/darwin11.4.0.valgrind \
|
build-aux/darwin11.4.0.valgrind \
|
||||||
|
build-aux/linux-gnu.valgrind \
|
||||||
build-aux/move-if-change \
|
build-aux/move-if-change \
|
||||||
build-aux/prev-version.txt \
|
build-aux/prev-version.txt \
|
||||||
build-aux/update-b4-copyright
|
build-aux/update-b4-copyright
|
||||||
|
|||||||
+8
-2
@@ -230,10 +230,16 @@ case $VALGRIND:$host_os in
|
|||||||
'':*) ;;
|
'':*) ;;
|
||||||
*:darwin*)
|
*:darwin*)
|
||||||
# See README-hacking.
|
# See README-hacking.
|
||||||
# VALGRIND+=' --suppressions=$(abs_top_srcdir)/build-aux/darwin11.4.0.valgrind'
|
# VALGRIND+='-q --suppressions=$(abs_top_srcdir)/build-aux/darwin11.4.0.valgrind'
|
||||||
VALGRIND=;;
|
VALGRIND=;;
|
||||||
*:*)
|
*:*)
|
||||||
AC_SUBST([VALGRIND_PREBISON], ["$VALGRIND -q"]);;
|
suppfile=build-aux/$host_os.valgrind
|
||||||
|
if test -f "$srcdir/$suppfile"; then
|
||||||
|
VALGRIND="$VALGRIND --gen-suppressions=all"
|
||||||
|
VALGRIND="$VALGRIND --suppressions=\$(abs_top_srcdir)/$suppfile"
|
||||||
|
fi
|
||||||
|
AC_SUBST([VALGRIND_PREBISON], ["$VALGRIND -q"])
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
AM_MISSING_PROG([AUTOM4TE], [autom4te])
|
AM_MISSING_PROG([AUTOM4TE], [autom4te])
|
||||||
|
|||||||
@@ -221,6 +221,25 @@ m4_define([b4_attribute_define],
|
|||||||
#else
|
#else
|
||||||
# define YYUSE(E) /* empty */
|
# define YYUSE(E) /* empty */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
|
||||||
|
/* Suppress an incorrect diagnostic about yylval being uninitialized. */
|
||||||
|
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
|
||||||
|
_Pragma ("GCC diagnostic push") \
|
||||||
|
_Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
|
||||||
|
_Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
|
||||||
|
# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
|
||||||
|
_Pragma ("GCC diagnostic pop")
|
||||||
|
#else
|
||||||
|
# define YY_INITIAL_VALUE(Value) Value
|
||||||
|
#endif
|
||||||
|
#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
|
||||||
|
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
|
||||||
|
# define YY_IGNORE_MAYBE_UNINITIALIZED_END
|
||||||
|
#endif
|
||||||
|
#ifndef YY_INITIAL_VALUE
|
||||||
|
# define YY_INITIAL_VALUE(Value) /* Nothing. */
|
||||||
|
#endif
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
@@ -446,7 +465,9 @@ m4_ifset([b4_parse_param], [, b4_parse_param]))[
|
|||||||
yymsg = "Deleting";
|
yymsg = "Deleting";
|
||||||
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
|
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
|
||||||
|
|
||||||
|
YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
|
||||||
]b4_symbol_actions([destructor])[
|
]b4_symbol_actions([destructor])[
|
||||||
|
YY_IGNORE_MAYBE_UNINITIALIZED_END
|
||||||
}]dnl
|
}]dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -456,9 +477,9 @@ m4_ifset([b4_parse_param], [, b4_parse_param]))[
|
|||||||
# Define the "yy_symbol_print" function.
|
# Define the "yy_symbol_print" function.
|
||||||
m4_define_default([b4_yy_symbol_print_define],
|
m4_define_default([b4_yy_symbol_print_define],
|
||||||
[[
|
[[
|
||||||
/*--------------------------------.
|
/*----------------------------------------.
|
||||||
| Print this symbol on YYOUTPUT. |
|
| Print this symbol's value on YYOUTPUT. |
|
||||||
`--------------------------------*/
|
`----------------------------------------*/
|
||||||
|
|
||||||
]b4_function_define([yy_symbol_value_print],
|
]b4_function_define([yy_symbol_value_print],
|
||||||
[static void],
|
[static void],
|
||||||
|
|||||||
+259
-70
@@ -20,7 +20,8 @@ m4_include(b4_pkgdatadir/[java.m4])
|
|||||||
b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java],
|
b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java],
|
||||||
[b4_skeleton])])
|
[b4_skeleton])])
|
||||||
|
|
||||||
# We don't depend on %debug in Java, but pacify warnings about non-used flags.
|
# We do not depend on %debug in Java, but pacify warnings about
|
||||||
|
# non-used flags.
|
||||||
b4_parse_trace_if([0], [0])
|
b4_parse_trace_if([0], [0])
|
||||||
|
|
||||||
m4_define([b4_symbol_no_destructor_assert],
|
m4_define([b4_symbol_no_destructor_assert],
|
||||||
@@ -30,6 +31,57 @@ m4_define([b4_symbol_no_destructor_assert],
|
|||||||
[b4_symbol_action_location([$1], [destructor])])])])
|
[b4_symbol_action_location([$1], [destructor])])])])
|
||||||
b4_symbol_foreach([b4_symbol_no_destructor_assert])
|
b4_symbol_foreach([b4_symbol_no_destructor_assert])
|
||||||
|
|
||||||
|
# Setup some macros for api.push-pull.
|
||||||
|
b4_percent_define_default([[api.push-pull]], [[pull]])
|
||||||
|
b4_percent_define_check_values([[[[api.push-pull]],
|
||||||
|
[[pull]], [[push]], [[both]]]])
|
||||||
|
|
||||||
|
# Define m4 conditional macros that encode the value
|
||||||
|
# of the api.push-pull flag.
|
||||||
|
b4_define_flag_if([pull]) m4_define([b4_pull_flag], [[1]])
|
||||||
|
b4_define_flag_if([push]) m4_define([b4_push_flag], [[1]])
|
||||||
|
m4_case(b4_percent_define_get([[api.push-pull]]),
|
||||||
|
[pull], [m4_define([b4_push_flag], [[0]])],
|
||||||
|
[push], [m4_define([b4_pull_flag], [[0]])])
|
||||||
|
|
||||||
|
# Define a macro to be true when api.push-pull has the value "both".
|
||||||
|
m4_define([b4_both_if],[b4_push_if([b4_pull_if([$1],[$2])],[$2])])
|
||||||
|
|
||||||
|
# Handle BISON_USE_PUSH_FOR_PULL for the test suite. So that push parsing
|
||||||
|
# tests function as written, do not let BISON_USE_PUSH_FOR_PULL modify the
|
||||||
|
# behavior of Bison at all when push parsing is already requested.
|
||||||
|
b4_define_flag_if([use_push_for_pull])
|
||||||
|
b4_use_push_for_pull_if([
|
||||||
|
b4_push_if([m4_define([b4_use_push_for_pull_flag], [[0]])],
|
||||||
|
[m4_define([b4_push_flag], [[1]])])])
|
||||||
|
|
||||||
|
# Define a macro to encapsulate the parse state variables.
|
||||||
|
# This allows them to be defined either in parse() when doing
|
||||||
|
# pull parsing, or as class instance variable when doing push parsing.
|
||||||
|
m4_define([b4_define_state],[[
|
||||||
|
/* Lookahead and lookahead in internal form. */
|
||||||
|
int yychar = yyempty_;
|
||||||
|
int yytoken = 0;
|
||||||
|
|
||||||
|
/* State. */
|
||||||
|
int yyn = 0;
|
||||||
|
int yylen = 0;
|
||||||
|
int yystate = 0;
|
||||||
|
YYStack yystack = new YYStack ();
|
||||||
|
int label = YYNEWSTATE;
|
||||||
|
|
||||||
|
/* Error handling. */
|
||||||
|
int yynerrs_ = 0;
|
||||||
|
]b4_locations_if([/* The location where the error started. */
|
||||||
|
b4_location_type yyerrloc = null;
|
||||||
|
|
||||||
|
/* Location. */
|
||||||
|
b4_location_type yylloc = new b4_location_type (null, null);])[
|
||||||
|
|
||||||
|
/* Semantic value of the lookahead. */
|
||||||
|
]b4_yystype[ yylval = null;
|
||||||
|
]])
|
||||||
|
|
||||||
b4_output_begin([b4_parser_file_name])
|
b4_output_begin([b4_parser_file_name])
|
||||||
b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
|
b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
|
||||||
[2007-2013])
|
[2007-2013])
|
||||||
@@ -55,7 +107,9 @@ b4_percent_define_get3([implements], [ implements ])[
|
|||||||
{
|
{
|
||||||
]b4_identification[
|
]b4_identification[
|
||||||
]b4_error_verbose_if([[
|
]b4_error_verbose_if([[
|
||||||
/** True if verbose error messages are enabled. */
|
/**
|
||||||
|
* True if verbose error messages are enabled.
|
||||||
|
*/
|
||||||
private boolean yyErrorVerbose = true;
|
private boolean yyErrorVerbose = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -76,18 +130,24 @@ b4_locations_if([[
|
|||||||
* A class defining a pair of positions. Positions, defined by the
|
* A class defining a pair of positions. Positions, defined by the
|
||||||
* <code>]b4_position_type[</code> class, denote a point in the input.
|
* <code>]b4_position_type[</code> class, denote a point in the input.
|
||||||
* Locations represent a part of the input through the beginning
|
* Locations represent a part of the input through the beginning
|
||||||
* and ending positions. */
|
* and ending positions.
|
||||||
|
*/
|
||||||
public class ]b4_location_type[ {
|
public class ]b4_location_type[ {
|
||||||
/** The first, inclusive, position in the range. */
|
/**
|
||||||
|
* The first, inclusive, position in the range.
|
||||||
|
*/
|
||||||
public ]b4_position_type[ begin;
|
public ]b4_position_type[ begin;
|
||||||
|
|
||||||
/** The first position beyond the range. */
|
/**
|
||||||
|
* The first position beyond the range.
|
||||||
|
*/
|
||||||
public ]b4_position_type[ end;
|
public ]b4_position_type[ end;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a <code>]b4_location_type[</code> denoting an empty range located at
|
* Create a <code>]b4_location_type[</code> denoting an empty range located at
|
||||||
* a given point.
|
* a given point.
|
||||||
* @@param loc The position at which the range is anchored. */
|
* @@param loc The position at which the range is anchored.
|
||||||
|
*/
|
||||||
public ]b4_location_type[ (]b4_position_type[ loc) {
|
public ]b4_location_type[ (]b4_position_type[ loc) {
|
||||||
this.begin = this.end = loc;
|
this.begin = this.end = loc;
|
||||||
}
|
}
|
||||||
@@ -95,7 +155,8 @@ b4_locations_if([[
|
|||||||
/**
|
/**
|
||||||
* Create a <code>]b4_location_type[</code> from the endpoints of the range.
|
* Create a <code>]b4_location_type[</code> from the endpoints of the range.
|
||||||
* @@param begin The first position included in the range.
|
* @@param begin The first position included in the range.
|
||||||
* @@param end The first position beyond the range. */
|
* @@param end The first position beyond the range.
|
||||||
|
*/
|
||||||
public ]b4_location_type[ (]b4_position_type[ begin, ]b4_position_type[ end) {
|
public ]b4_location_type[ (]b4_position_type[ begin, ]b4_position_type[ end) {
|
||||||
this.begin = begin;
|
this.begin = begin;
|
||||||
this.end = end;
|
this.end = end;
|
||||||
@@ -104,7 +165,8 @@ b4_locations_if([[
|
|||||||
/**
|
/**
|
||||||
* Print a representation of the location. For this to be correct,
|
* Print a representation of the location. For this to be correct,
|
||||||
* <code>]b4_position_type[</code> should override the <code>equals</code>
|
* <code>]b4_position_type[</code> should override the <code>equals</code>
|
||||||
* method. */
|
* method.
|
||||||
|
*/
|
||||||
public String toString () {
|
public String toString () {
|
||||||
if (begin.equals (end))
|
if (begin.equals (end))
|
||||||
return begin.toString ();
|
return begin.toString ();
|
||||||
@@ -136,24 +198,28 @@ b4_locations_if([[
|
|||||||
|
|
||||||
]b4_locations_if([[/**
|
]b4_locations_if([[/**
|
||||||
* Method to retrieve the beginning position of the last scanned token.
|
* Method to retrieve the beginning position of the last scanned token.
|
||||||
* @@return the position at which the last scanned token starts. */
|
* @@return the position at which the last scanned token starts.
|
||||||
|
*/
|
||||||
]b4_position_type[ getStartPos ();
|
]b4_position_type[ getStartPos ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to retrieve the ending position of the last scanned token.
|
* Method to retrieve the ending position of the last scanned token.
|
||||||
* @@return the first position beyond the last scanned token. */
|
* @@return the first position beyond the last scanned token.
|
||||||
|
*/
|
||||||
]b4_position_type[ getEndPos ();]])[
|
]b4_position_type[ getEndPos ();]])[
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to retrieve the semantic value of the last scanned token.
|
* Method to retrieve the semantic value of the last scanned token.
|
||||||
* @@return the semantic value of the last scanned token. */
|
* @@return the semantic value of the last scanned token.
|
||||||
|
*/
|
||||||
]b4_yystype[ getLVal ();
|
]b4_yystype[ getLVal ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry point for the scanner. Returns the token identifier corresponding
|
* Entry point for the scanner. Returns the token identifier corresponding
|
||||||
* to the next token and prepares to return the semantic value
|
* to the next token and prepares to return the semantic value
|
||||||
* ]b4_locations_if([and beginning/ending positions ])[of the token.
|
* ]b4_locations_if([and beginning/ending positions ])[of the token.
|
||||||
* @@return the token identifier corresponding to the next token. */
|
* @@return the token identifier corresponding to the next token.
|
||||||
|
*/
|
||||||
int yylex () ]b4_maybe_throws([b4_lex_throws])[;
|
int yylex () ]b4_maybe_throws([b4_lex_throws])[;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -162,7 +228,8 @@ b4_locations_if([[
|
|||||||
*
|
*
|
||||||
* ]b4_locations_if([[@@param loc The location of the element to which the
|
* ]b4_locations_if([[@@param loc The location of the element to which the
|
||||||
* error message is related]])[
|
* error message is related]])[
|
||||||
* @@param msg The string for the error message. */
|
* @@param msg The string for the error message.
|
||||||
|
*/
|
||||||
void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String msg);]
|
void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String msg);]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,7 +237,9 @@ b4_locations_if([[
|
|||||||
]b4_percent_code_get([[lexer]])[
|
]b4_percent_code_get([[lexer]])[
|
||||||
}
|
}
|
||||||
|
|
||||||
]])[/** The object doing lexical analysis for us. */
|
]])[/**
|
||||||
|
* The object doing lexical analysis for us.
|
||||||
|
*/
|
||||||
private Lexer yylexer;
|
private Lexer yylexer;
|
||||||
]
|
]
|
||||||
b4_parse_param_vars
|
b4_parse_param_vars
|
||||||
@@ -336,34 +405,49 @@ b4_lexer_if([[
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returned by a Bison action in order to stop the parsing process and
|
* Returned by a Bison action in order to stop the parsing process and
|
||||||
* return success (<tt>true</tt>). */
|
* return success (<tt>true</tt>).
|
||||||
|
*/
|
||||||
public static final int YYACCEPT = 0;
|
public static final int YYACCEPT = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returned by a Bison action in order to stop the parsing process and
|
* Returned by a Bison action in order to stop the parsing process and
|
||||||
* return failure (<tt>false</tt>). */
|
* return failure (<tt>false</tt>).
|
||||||
|
*/
|
||||||
public static final int YYABORT = 1;
|
public static final int YYABORT = 1;
|
||||||
|
|
||||||
|
]b4_push_if([
|
||||||
|
/**
|
||||||
|
* Returned by a Bison action in order to request a new token.
|
||||||
|
*/
|
||||||
|
public static final int YYPUSH_MORE = 4;])[
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returned by a Bison action in order to start error recovery without
|
* Returned by a Bison action in order to start error recovery without
|
||||||
* printing an error message. */
|
* printing an error message.
|
||||||
|
*/
|
||||||
public static final int YYERROR = 2;
|
public static final int YYERROR = 2;
|
||||||
|
|
||||||
// Internal return codes that are not supported for user semantic
|
/**
|
||||||
// actions.
|
* Internal return codes that are not supported for user semantic
|
||||||
|
* actions.
|
||||||
|
*/
|
||||||
private static final int YYERRLAB = 3;
|
private static final int YYERRLAB = 3;
|
||||||
private static final int YYNEWSTATE = 4;
|
private static final int YYNEWSTATE = 4;
|
||||||
private static final int YYDEFAULT = 5;
|
private static final int YYDEFAULT = 5;
|
||||||
private static final int YYREDUCE = 6;
|
private static final int YYREDUCE = 6;
|
||||||
private static final int YYERRLAB1 = 7;
|
private static final int YYERRLAB1 = 7;
|
||||||
private static final int YYRETURN = 8;
|
private static final int YYRETURN = 8;
|
||||||
|
]b4_push_if([[ private static final int YYGETTOKEN = 9; /* Signify that a new token is expected when doing push-parsing. */]])[
|
||||||
|
|
||||||
private int yyerrstatus_ = 0;
|
private int yyerrstatus_ = 0;
|
||||||
|
|
||||||
|
]b4_push_if([dnl
|
||||||
|
b4_define_state])[
|
||||||
/**
|
/**
|
||||||
* Return whether error recovery is being done. In this state, the parser
|
* Return whether error recovery is being done. In this state, the parser
|
||||||
* reads token until it reaches a known state, and then restarts normal
|
* reads token until it reaches a known state, and then restarts normal
|
||||||
* operation. */
|
* operation.
|
||||||
|
*/
|
||||||
public final boolean recovering ()
|
public final boolean recovering ()
|
||||||
{
|
{
|
||||||
return yyerrstatus_ == 0;
|
return yyerrstatus_ == 0;
|
||||||
@@ -463,6 +547,7 @@ b4_lexer_if([[
|
|||||||
+ (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
|
+ (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
]b4_push_if([],[[
|
||||||
/**
|
/**
|
||||||
* Parse input from the scanner that was specified at object construction
|
* Parse input from the scanner that was specified at object construction
|
||||||
* time. Return whether the end of the input was reached successfully.
|
* time. Return whether the end of the input was reached successfully.
|
||||||
@@ -470,46 +555,53 @@ b4_lexer_if([[
|
|||||||
* @@return <tt>true</tt> if the parsing succeeds. Note that this does not
|
* @@return <tt>true</tt> if the parsing succeeds. Note that this does not
|
||||||
* imply that there were no syntax errors.
|
* imply that there were no syntax errors.
|
||||||
*/
|
*/
|
||||||
public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[
|
public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[]])[
|
||||||
|
]b4_push_if([
|
||||||
|
/**
|
||||||
|
* Push Parse input from external lexer
|
||||||
|
*
|
||||||
|
* @@param yylextoken current token
|
||||||
|
* @@param yylexval current lval
|
||||||
|
]b4_locations_if([ * @@param yylexloc current position])[
|
||||||
|
*
|
||||||
|
* @@return <tt>YYACCEPT, YYABORT, YYPUSH_MORE</tt>
|
||||||
|
*/
|
||||||
|
public int push_parse (int yylextoken, b4_yystype yylexval[]b4_locations_if([, b4_location_type yylexloc]))
|
||||||
|
b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])])[
|
||||||
{
|
{
|
||||||
/// Lookahead and lookahead in internal form.
|
]b4_locations_if([/* @@$. */
|
||||||
int yychar = yyempty_;
|
b4_location_type yyloc;])[
|
||||||
int yytoken = 0;
|
]b4_push_if([],[[
|
||||||
|
]b4_define_state[
|
||||||
/* State. */
|
|
||||||
int yyn = 0;
|
|
||||||
int yylen = 0;
|
|
||||||
int yystate = 0;
|
|
||||||
|
|
||||||
YYStack yystack = new YYStack ();
|
|
||||||
|
|
||||||
/* Error handling. */
|
|
||||||
int yynerrs_ = 0;
|
|
||||||
]b4_locations_if([/// The location where the error started.
|
|
||||||
]b4_location_type[ yyerrloc = null;
|
|
||||||
|
|
||||||
/// ]b4_location_type[ of the lookahead.
|
|
||||||
]b4_location_type[ yylloc = new ]b4_location_type[ (null, null);
|
|
||||||
|
|
||||||
/// @@$.
|
|
||||||
]b4_location_type[ yyloc;])
|
|
||||||
|
|
||||||
/// Semantic value of the lookahead.
|
|
||||||
b4_yystype[ yylval = null;
|
|
||||||
|
|
||||||
yycdebug ("Starting parse\n");
|
yycdebug ("Starting parse\n");
|
||||||
yyerrstatus_ = 0;
|
yyerrstatus_ = 0;
|
||||||
|
|
||||||
|
/* Initialize the stack. */
|
||||||
|
yystack.push (yystate, yylval ]b4_locations_if([, yylloc])[);
|
||||||
]m4_ifdef([b4_initial_action], [
|
]m4_ifdef([b4_initial_action], [
|
||||||
b4_dollar_pushdef([yylval], [], [yylloc])dnl
|
b4_dollar_pushdef([yylval], [], [yylloc])dnl
|
||||||
/* User initialization code. */
|
/* User initialization code. */
|
||||||
b4_user_initial_action
|
b4_user_initial_action
|
||||||
b4_dollar_popdef])[]dnl
|
b4_dollar_popdef[]dnl
|
||||||
|
])[
|
||||||
|
]])[
|
||||||
|
]b4_push_if([[
|
||||||
|
if (!this.push_parse_initialized)
|
||||||
|
{
|
||||||
|
push_parse_initialize ();
|
||||||
|
]m4_ifdef([b4_initial_action], [
|
||||||
|
b4_dollar_pushdef([yylval], [], [yylloc])dnl
|
||||||
|
/* User initialization code. */
|
||||||
|
b4_user_initial_action
|
||||||
|
b4_dollar_popdef[]dnl
|
||||||
|
])[
|
||||||
|
yycdebug ("Starting parse\n");
|
||||||
|
yyerrstatus_ = 0;
|
||||||
|
} else
|
||||||
|
label = YYGETTOKEN;
|
||||||
|
|
||||||
[ /* Initialize the stack. */
|
boolean push_token_consumed = true;
|
||||||
yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
|
]])[
|
||||||
|
|
||||||
int label = YYNEWSTATE;
|
|
||||||
for (;;)
|
for (;;)
|
||||||
switch (label)
|
switch (label)
|
||||||
{
|
{
|
||||||
@@ -522,7 +614,8 @@ b4_dollar_popdef])[]dnl
|
|||||||
|
|
||||||
/* Accept? */
|
/* Accept? */
|
||||||
if (yystate == yyfinal_)
|
if (yystate == yyfinal_)
|
||||||
return true;
|
]b4_push_if([{label = YYACCEPT; break;}],
|
||||||
|
[return true;])[
|
||||||
|
|
||||||
/* Take a decision. First try without lookahead. */
|
/* Take a decision. First try without lookahead. */
|
||||||
yyn = yypact_[yystate];
|
yyn = yypact_[yystate];
|
||||||
@@ -531,16 +624,27 @@ b4_dollar_popdef])[]dnl
|
|||||||
label = YYDEFAULT;
|
label = YYDEFAULT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
]b4_push_if([ /* Fall Through */
|
||||||
|
|
||||||
|
case YYGETTOKEN:])[
|
||||||
/* Read a lookahead token. */
|
/* Read a lookahead token. */
|
||||||
if (yychar == yyempty_)
|
if (yychar == yyempty_)
|
||||||
{
|
{
|
||||||
|
]b4_push_if([[
|
||||||
|
if (!push_token_consumed)
|
||||||
|
return YYPUSH_MORE;
|
||||||
yycdebug ("Reading a token: ");
|
yycdebug ("Reading a token: ");
|
||||||
yychar = yylexer.yylex ();]
|
yychar = yylextoken;
|
||||||
b4_locations_if([[
|
yylval = yylexval;]b4_locations_if([
|
||||||
yylloc = new ]b4_location_type[(yylexer.getStartPos (),
|
yylloc = yylexloc;])[
|
||||||
yylexer.getEndPos ());]])
|
push_token_consumed = false;]])[
|
||||||
yylval = yylexer.getLVal ();[
|
]b4_push_if([],[[
|
||||||
|
yycdebug ("Reading a token: ");
|
||||||
|
yychar = yylexer.yylex ();
|
||||||
|
yylval = yylexer.getLVal ();]b4_locations_if([
|
||||||
|
yylloc = new b4_location_type (yylexer.getStartPos (),
|
||||||
|
yylexer.getEndPos ());])[
|
||||||
|
]])[
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert token to internal form. */
|
/* Convert token to internal form. */
|
||||||
@@ -637,10 +741,10 @@ b4_dollar_popdef])[]dnl
|
|||||||
{
|
{
|
||||||
/* Return failure if at end of input. */
|
/* Return failure if at end of input. */
|
||||||
if (yychar == Lexer.EOF)
|
if (yychar == Lexer.EOF)
|
||||||
return false;
|
]b4_push_if([{label = YYABORT; break;}],[return false;])[
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
yychar = yyempty_;
|
yychar = yyempty_;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Else will try to reuse lookahead token after shifting the error
|
/* Else will try to reuse lookahead token after shifting the error
|
||||||
@@ -648,9 +752,9 @@ b4_dollar_popdef])[]dnl
|
|||||||
label = YYERRLAB1;
|
label = YYERRLAB1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*---------------------------------------------------.
|
/*-------------------------------------------------.
|
||||||
| errorlab -- error raised explicitly by YYERROR. |
|
| errorlab -- error raised explicitly by YYERROR. |
|
||||||
`---------------------------------------------------*/
|
`-------------------------------------------------*/
|
||||||
case YYERROR:
|
case YYERROR:
|
||||||
|
|
||||||
]b4_locations_if([yyerrloc = yystack.locationAt (yylen - 1);])[
|
]b4_locations_if([yyerrloc = yystack.locationAt (yylen - 1);])[
|
||||||
@@ -682,9 +786,10 @@ b4_dollar_popdef])[]dnl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pop the current state because it cannot handle the error token. */
|
/* Pop the current state because it cannot handle the
|
||||||
|
* error token. */
|
||||||
if (yystack.height == 0)
|
if (yystack.height == 0)
|
||||||
return false;
|
]b4_push_if([{label = YYABORT; break;}],[return false;])[
|
||||||
|
|
||||||
]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
|
]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
|
||||||
yystack.pop ();
|
yystack.pop ();
|
||||||
@@ -693,7 +798,11 @@ b4_dollar_popdef])[]dnl
|
|||||||
yystack.print (yyDebugStream);
|
yystack.print (yyDebugStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
]b4_locations_if([
|
if (label == YYABORT)
|
||||||
|
/* Leave the switch. */
|
||||||
|
break;
|
||||||
|
|
||||||
|
]b4_locations_if([
|
||||||
/* Muck with the stack to setup for yylloc. */
|
/* Muck with the stack to setup for yylloc. */
|
||||||
yystack.push (0, null, yylloc);
|
yystack.push (0, null, yylloc);
|
||||||
yystack.push (0, null, yyerrloc);
|
yystack.push (0, null, yyerrloc);
|
||||||
@@ -711,13 +820,91 @@ b4_dollar_popdef])[]dnl
|
|||||||
|
|
||||||
/* Accept. */
|
/* Accept. */
|
||||||
case YYACCEPT:
|
case YYACCEPT:
|
||||||
return true;
|
]b4_push_if([this.push_parse_initialized = false; return YYACCEPT;],
|
||||||
|
[return true;])[
|
||||||
|
|
||||||
/* Abort. */
|
/* Abort. */
|
||||||
case YYABORT:
|
case YYABORT:
|
||||||
return false;
|
]b4_push_if([this.push_parse_initialized = false; return YYABORT;],
|
||||||
|
[return false;])[
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
]b4_push_if([[
|
||||||
|
boolean push_parse_initialized = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* (Re-)Initialize the state of the push parser.
|
||||||
|
*/
|
||||||
|
public void push_parse_initialize()
|
||||||
|
{
|
||||||
|
/* Lookahead and lookahead in internal form. */
|
||||||
|
this.yychar = yyempty_;
|
||||||
|
this.yytoken = 0;
|
||||||
|
|
||||||
|
/* State. */
|
||||||
|
this.yyn = 0;
|
||||||
|
this.yylen = 0;
|
||||||
|
this.yystate = 0;
|
||||||
|
this.yystack = new YYStack ();
|
||||||
|
this.label = YYNEWSTATE;
|
||||||
|
|
||||||
|
/* Error handling. */
|
||||||
|
this.yynerrs_ = 0;
|
||||||
|
]b4_locations_if([/* The location where the error started. */
|
||||||
|
this.yyerrloc = null;
|
||||||
|
this.yylloc = new b4_location_type (null, null);])[
|
||||||
|
|
||||||
|
/* Semantic value of the lookahead. */
|
||||||
|
this.yylval = null;
|
||||||
|
|
||||||
|
yystack.push (this.yystate, this.yylval]b4_locations_if([, this.yylloc])[);
|
||||||
|
|
||||||
|
this.push_parse_initialized = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
]b4_locations_if([
|
||||||
|
/**
|
||||||
|
* Push parse given input from an external lexer.
|
||||||
|
*
|
||||||
|
* @@param yylextoken current token
|
||||||
|
* @@param yylexval current lval
|
||||||
|
* @@param yyylexpos current position
|
||||||
|
*
|
||||||
|
* @@return <tt>YYACCEPT, YYABORT, YYPUSH_MORE</tt>
|
||||||
|
*/
|
||||||
|
public int push_parse (int yylextoken, b4_yystype yylexval, b4_position_type yylexpos)
|
||||||
|
b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])
|
||||||
|
{
|
||||||
|
return push_parse (yylextoken, yylexval, new b4_location_type (yylexpos));
|
||||||
|
}
|
||||||
|
])[]])
|
||||||
|
|
||||||
|
b4_both_if([[
|
||||||
|
/**
|
||||||
|
* Parse input from the scanner that was specified at object construction
|
||||||
|
* time. Return whether the end of the input was reached successfully.
|
||||||
|
* This version of parse () is defined only when api.push-push=both.
|
||||||
|
*
|
||||||
|
* @@return <tt>true</tt> if the parsing succeeds. Note that this does not
|
||||||
|
* imply that there were no syntax errors.
|
||||||
|
*/
|
||||||
|
public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[
|
||||||
|
{
|
||||||
|
if (yylexer == null)
|
||||||
|
throw new NullPointerException("Null Lexer");
|
||||||
|
int status;
|
||||||
|
do {
|
||||||
|
int token = yylexer.yylex();
|
||||||
|
]b4_yystype[ lval = yylexer.getLVal();
|
||||||
|
]b4_locations_if([dnl
|
||||||
|
b4_location_type yyloc = new b4_location_type (yylexer.getStartPos (),
|
||||||
|
yylexer.getEndPos ());])[
|
||||||
|
]b4_locations_if([status = push_parse(token,lval,yyloc);],[
|
||||||
|
status = push_parse(token,lval);])[
|
||||||
|
} while (status == YYPUSH_MORE);
|
||||||
|
return (status == YYACCEPT);
|
||||||
|
}
|
||||||
|
]])[
|
||||||
|
|
||||||
// Generate an error message.
|
// Generate an error message.
|
||||||
private String yysyntax_error (int yystate, int tok)
|
private String yysyntax_error (int yystate, int tok)
|
||||||
@@ -752,8 +939,8 @@ b4_dollar_popdef])[]dnl
|
|||||||
*/
|
*/
|
||||||
if (tok != yyempty_)
|
if (tok != yyempty_)
|
||||||
{
|
{
|
||||||
// FIXME: This method of building the message is not compatible
|
/* FIXME: This method of building the message is not compatible
|
||||||
// with internationalization.
|
with internationalization. */
|
||||||
StringBuffer res =
|
StringBuffer res =
|
||||||
new StringBuffer ("syntax error, unexpected ");
|
new StringBuffer ("syntax error, unexpected ");
|
||||||
res.append (yytnamerr_ (yytname_[tok]));
|
res.append (yytnamerr_ (yytname_[tok]));
|
||||||
@@ -802,8 +989,9 @@ b4_dollar_popdef])[]dnl
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the given <code>yytable_</code> value indicates a syntax error.
|
* Whether the given <code>yytable_</code>
|
||||||
* @@param yyvalue the value to check
|
* value indicates a syntax error.
|
||||||
|
* @@param yyvalue the value to check
|
||||||
*/
|
*/
|
||||||
private static boolean yy_table_value_is_error_ (int yyvalue)
|
private static boolean yy_table_value_is_error_ (int yyvalue)
|
||||||
{
|
{
|
||||||
@@ -825,6 +1013,7 @@ b4_dollar_popdef])[]dnl
|
|||||||
]b4_integral_parser_table_define([rline], [b4_rline],
|
]b4_integral_parser_table_define([rline], [b4_rline],
|
||||||
[[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[
|
[[YYRLINE[YYN] -- Source line where rule number YYN was defined.]])[
|
||||||
|
|
||||||
|
|
||||||
// Report on the debug stream that the rule yyrule is going to be reduced.
|
// Report on the debug stream that the rule yyrule is going to be reduced.
|
||||||
private void yy_reduce_print (int yyrule, YYStack yystack)
|
private void yy_reduce_print (int yyrule, YYStack yystack)
|
||||||
{
|
{
|
||||||
|
|||||||
+9
-26
@@ -175,36 +175,19 @@ m4_define([b4_declare_scanner_communication_variables], [[
|
|||||||
int yychar;
|
int yychar;
|
||||||
|
|
||||||
]b4_pure_if([[
|
]b4_pure_if([[
|
||||||
#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
|
/* The semantic value of the lookahead symbol. */
|
||||||
/* Suppress an incorrect diagnostic about yylval being uninitialized. */
|
|
||||||
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
|
|
||||||
_Pragma ("GCC diagnostic push") \
|
|
||||||
_Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
|
|
||||||
_Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
|
|
||||||
# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
|
|
||||||
_Pragma ("GCC diagnostic pop")
|
|
||||||
#else
|
|
||||||
/* Default value used for initialization, for pacifying older GCCs
|
/* Default value used for initialization, for pacifying older GCCs
|
||||||
or non-GCC compilers. */
|
or non-GCC compilers. */
|
||||||
static YYSTYPE yyval_default;
|
YY_INITIAL_VALUE (static YYSTYPE yyval_default;)
|
||||||
# define YY_INITIAL_VALUE(Value) = Value
|
YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);]b4_locations_if([[
|
||||||
#endif]b4_locations_if([[
|
|
||||||
static YYLTYPE yyloc_default][]b4_yyloc_default[;]])])[
|
|
||||||
#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
|
|
||||||
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
|
|
||||||
# define YY_IGNORE_MAYBE_UNINITIALIZED_END
|
|
||||||
#endif
|
|
||||||
#ifndef YY_INITIAL_VALUE
|
|
||||||
# define YY_INITIAL_VALUE(Value) /* Nothing. */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The semantic value of the lookahead symbol. */
|
|
||||||
YYSTYPE yylval YY_INITIAL_VALUE (yyval_default);]b4_locations_if([[
|
|
||||||
|
|
||||||
/* Location data for the lookahead symbol. */
|
/* Location data for the lookahead symbol. */
|
||||||
YYLTYPE yylloc]b4_pure_if([ = yyloc_default], [b4_yyloc_default])[;
|
static YYLTYPE yyloc_default]b4_yyloc_default[;
|
||||||
]])b4_pure_if([], [[
|
YYLTYPE yylloc = yyloc_default;]])],
|
||||||
|
[[/* The semantic value of the lookahead symbol. */
|
||||||
|
YYSTYPE yylval;]b4_locations_if([[
|
||||||
|
/* Location data for the lookahead symbol. */
|
||||||
|
YYLTYPE yylloc]b4_yyloc_default[;]])[
|
||||||
/* Number of syntax errors so far. */
|
/* Number of syntax errors so far. */
|
||||||
int yynerrs;]])])
|
int yynerrs;]])])
|
||||||
|
|
||||||
|
|||||||
+69
-1
@@ -366,6 +366,7 @@ Java Parsers
|
|||||||
* Java Parser Interface:: Instantiating and running the parser
|
* Java Parser Interface:: Instantiating and running the parser
|
||||||
* Java Scanner Interface:: Specifying the scanner for the parser
|
* Java Scanner Interface:: Specifying the scanner for the parser
|
||||||
* Java Action Features:: Special features for use in actions
|
* Java Action Features:: Special features for use in actions
|
||||||
|
* Java Push Parser Interface:: Instantiating and running the a push parser
|
||||||
* Java Differences:: Differences between C/C++ and Java Grammars
|
* Java Differences:: Differences between C/C++ and Java Grammars
|
||||||
* Java Declarations Summary:: List of Bison declarations used with Java
|
* Java Declarations Summary:: List of Bison declarations used with Java
|
||||||
|
|
||||||
@@ -11500,6 +11501,7 @@ main (int argc, char *argv[])
|
|||||||
* Java Parser Interface:: Instantiating and running the parser
|
* Java Parser Interface:: Instantiating and running the parser
|
||||||
* Java Scanner Interface:: Specifying the scanner for the parser
|
* Java Scanner Interface:: Specifying the scanner for the parser
|
||||||
* Java Action Features:: Special features for use in actions
|
* Java Action Features:: Special features for use in actions
|
||||||
|
* Java Push Parser Interface:: Instantiating and running the a push parser
|
||||||
* Java Differences:: Differences between C/C++ and Java Grammars
|
* Java Differences:: Differences between C/C++ and Java Grammars
|
||||||
* Java Declarations Summary:: List of Bison declarations used with Java
|
* Java Declarations Summary:: List of Bison declarations used with Java
|
||||||
@end menu
|
@end menu
|
||||||
@@ -11811,7 +11813,6 @@ The return type can be changed using @samp{%define api.value.type
|
|||||||
@{@var{class-name}@}}.
|
@{@var{class-name}@}}.
|
||||||
@end deftypemethod
|
@end deftypemethod
|
||||||
|
|
||||||
|
|
||||||
@node Java Action Features
|
@node Java Action Features
|
||||||
@subsection Special Features for Use in Java Actions
|
@subsection Special Features for Use in Java Actions
|
||||||
|
|
||||||
@@ -11890,6 +11891,73 @@ instance in use. The @code{Location} and @code{Position} parameters are
|
|||||||
available only if location tracking is active.
|
available only if location tracking is active.
|
||||||
@end deftypefn
|
@end deftypefn
|
||||||
|
|
||||||
|
@node Java Push Parser Interface
|
||||||
|
@subsection Java Push Parser Interface
|
||||||
|
@c - define push_parse
|
||||||
|
@findex %define api.push-pull
|
||||||
|
|
||||||
|
(The current push parsing interface is experimental and may evolve. More
|
||||||
|
user feedback will help to stabilize it.)
|
||||||
|
|
||||||
|
Normally, Bison generates a pull parser for Java.
|
||||||
|
The following Bison declaration says that you want the parser to be a push
|
||||||
|
parser (@pxref{%define Summary,,api.push-pull}):
|
||||||
|
|
||||||
|
@example
|
||||||
|
%define api.push-pull push
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Most of the discussion about the Java pull Parser Interface, (@pxref{Java
|
||||||
|
Parser Interface}) applies to the push parser interface as well.
|
||||||
|
|
||||||
|
When generating a push parser, the method @code{push_parse} is created with
|
||||||
|
the following signature (depending on if locations are enabled).
|
||||||
|
|
||||||
|
@deftypemethod {YYParser} {void} push_parse ({int} @var{token}, {Object} @var{yylval})
|
||||||
|
@deftypemethodx {YYParser} {void} push_parse ({int} @var{token}, {Object} @var{yylval}, {Location} @var{yyloc})
|
||||||
|
@deftypemethodx {YYParser} {void} push_parse ({int} @var{token}, {Object} @var{yylval}, {Position} @var{yypos})
|
||||||
|
@end deftypemethod
|
||||||
|
|
||||||
|
The primary difference with respect to a pull parser is that the parser
|
||||||
|
method @code{push_parse} is invoked repeatedly to parse each token. This
|
||||||
|
function is available if either the "%define api.push-pull push" or "%define
|
||||||
|
api.push-pull both" declaration is used (@pxref{%define
|
||||||
|
Summary,,api.push-pull}). The @code{Location} and @code{Position}
|
||||||
|
parameters are available only if location tracking is active.
|
||||||
|
|
||||||
|
The value returned by the @code{push_parse} method is one of the following
|
||||||
|
four constants: @code{YYABORT}, @code{YYACCEPT}, @code{YYERROR}, or
|
||||||
|
@code{YYPUSH_MORE}. This new value, @code{YYPUSH_MORE}, may be returned if
|
||||||
|
more input is required to finish parsing the grammar.
|
||||||
|
|
||||||
|
If api.push-pull is declared as @code{both}, then the generated parser class
|
||||||
|
will also implement the @code{parse} method. This method's body is a loop
|
||||||
|
that repeatedly invokes the scanner and then passes the values obtained from
|
||||||
|
the scanner to the @code{push_parse} method.
|
||||||
|
|
||||||
|
There is one additional complication. Technically, the push parser does not
|
||||||
|
need to know about the scanner (i.e. an object implementing the
|
||||||
|
@code{YYParser.Lexer} interface), but it does need access to the
|
||||||
|
@code{yyerror} method. Currently, the @code{yyerror} method is defined in
|
||||||
|
the @code{YYParser.Lexer} interface. Hence, an implementation of that
|
||||||
|
interface is still required in order to provide an implementation of
|
||||||
|
@code{yyerror}. The current approach (and subject to change) is to require
|
||||||
|
the @code{YYParser} constructor to be given an object implementing the
|
||||||
|
@code{YYParser.Lexer} interface. This object need only implement the
|
||||||
|
@code{yyerror} method; the other methods can be stubbed since they will
|
||||||
|
never be invoked. The simplest way to do this is to add a trivial scanner
|
||||||
|
implementation to your grammar file using whatever implementation of
|
||||||
|
@code{yyerror} is desired. The following code sample shows a simple way to
|
||||||
|
accomplish this.
|
||||||
|
|
||||||
|
@example
|
||||||
|
%code lexer
|
||||||
|
@{
|
||||||
|
public Object getLVal () @{return null;@}
|
||||||
|
public int yylex () @{return 0;@}
|
||||||
|
public void yyerror (String s) @{System.err.println(s);@}
|
||||||
|
@}
|
||||||
|
@end example
|
||||||
|
|
||||||
@node Java Differences
|
@node Java Differences
|
||||||
@subsection Differences between C/C++ and Java Grammars
|
@subsection Differences between C/C++ and Java Grammars
|
||||||
|
|||||||
@@ -71,4 +71,6 @@ nodist_examples_calc___calc___SOURCES = \
|
|||||||
examples_calc___calc___CPPFLAGS = -I$(top_builddir)/examples/calc++
|
examples_calc___calc___CPPFLAGS = -I$(top_builddir)/examples/calc++
|
||||||
examples_calc___calc___CXXFLAGS = $(AM_CXXFLAGS) $(FLEX_SCANNER_CXXFLAGS)
|
examples_calc___calc___CXXFLAGS = $(AM_CXXFLAGS) $(FLEX_SCANNER_CXXFLAGS)
|
||||||
dist_TESTS += examples/calc++/calc++.test
|
dist_TESTS += examples/calc++/calc++.test
|
||||||
|
else
|
||||||
|
EXTRA_DIST += examples/calc++/calc++.test
|
||||||
endif
|
endif
|
||||||
|
|||||||
+1
-1
Submodule gnulib updated: e28fbd787c...03e96cc338
@@ -557,6 +557,7 @@ muscle_percent_define_use (char const *variable)
|
|||||||
/* The value of %define variable VARIABLE (corresponding to FIELD, if
|
/* The value of %define variable VARIABLE (corresponding to FIELD, if
|
||||||
defined). Do not register as used, but diagnose unset variables. */
|
defined). Do not register as used, but diagnose unset variables. */
|
||||||
|
|
||||||
|
static
|
||||||
char const *
|
char const *
|
||||||
muscle_percent_define_get_raw (char const *variable, char const *field)
|
muscle_percent_define_get_raw (char const *variable, char const *field)
|
||||||
{
|
{
|
||||||
|
|||||||
+282
-281
File diff suppressed because it is too large
Load Diff
+17
-17
@@ -1,4 +1,4 @@
|
|||||||
/* A Bison parser, made by GNU Bison 2.7.90. */
|
/* A Bison parser, made by GNU Bison 3.0. */
|
||||||
|
|
||||||
/* Bison interface for Yacc-like parsers in C
|
/* Bison interface for Yacc-like parsers in C
|
||||||
|
|
||||||
@@ -48,11 +48,11 @@
|
|||||||
extern int gram_debug;
|
extern int gram_debug;
|
||||||
#endif
|
#endif
|
||||||
/* "%code requires" blocks. */
|
/* "%code requires" blocks. */
|
||||||
#line 21 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 21 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
|
|
||||||
#include "symlist.h"
|
#include "symlist.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#line 221 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 221 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@@ -61,10 +61,10 @@ 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:1926 */
|
#line 645 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
#include "muscle-tab.h"
|
#include "muscle-tab.h"
|
||||||
|
|
||||||
#line 68 "src/parse-gram.h" /* yacc.c:1926 */
|
#line 68 "src/parse-gram.h" /* yacc.c:1909 */
|
||||||
|
|
||||||
/* Token type. */
|
/* Token type. */
|
||||||
#ifndef GRAM_TOKENTYPE
|
#ifndef GRAM_TOKENTYPE
|
||||||
@@ -135,27 +135,27 @@ 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:1926 */
|
#line 182 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
unsigned char character;
|
unsigned char character;
|
||||||
#line 186 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 186 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
char *code;
|
char *code;
|
||||||
#line 191 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 191 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
uniqstr uniqstr;
|
uniqstr uniqstr;
|
||||||
#line 199 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 199 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
int integer;
|
int integer;
|
||||||
#line 203 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 203 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
symbol *symbol;
|
symbol *symbol;
|
||||||
#line 208 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 208 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
assoc assoc;
|
assoc assoc;
|
||||||
#line 211 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 211 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
symbol_list *list;
|
symbol_list *list;
|
||||||
#line 214 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 214 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
named_ref *named_ref;
|
named_ref *named_ref;
|
||||||
#line 241 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 241 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
param_type param;
|
param_type param;
|
||||||
#line 409 "src/parse-gram.y" /* yacc.c:1926 */
|
#line 409 "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:1926 */
|
#line 647 "src/parse-gram.y" /* yacc.c:1909 */
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
@@ -163,7 +163,7 @@ code_props_type code_type;
|
|||||||
muscle_kind kind;
|
muscle_kind kind;
|
||||||
} value;
|
} value;
|
||||||
|
|
||||||
#line 167 "src/parse-gram.h" /* yacc.c:1926 */
|
#line 167 "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
|
||||||
|
|||||||
@@ -50,6 +50,37 @@ CXXFLAGS="$NO_WERROR_CXXFLAGS @WERROR_CXXFLAGS@"
|
|||||||
# If 'exit 77'; skip all C++ tests; otherwise ':'.
|
# If 'exit 77'; skip all C++ tests; otherwise ':'.
|
||||||
BISON_CXX_WORKS='@BISON_CXX_WORKS@'
|
BISON_CXX_WORKS='@BISON_CXX_WORKS@'
|
||||||
|
|
||||||
|
# Be sure that the C++ compiler is not broken because of gnulib. This
|
||||||
|
# cannot be checked in configure (gnulib is not parameterized yet),
|
||||||
|
# and checking this in every C++ test in AC_COMPILE_CXX is too costly.
|
||||||
|
#
|
||||||
|
# http://lists.gnu.org/archive/html/bug-bison/2013-06/msg00001.html
|
||||||
|
#
|
||||||
|
# FIXME: Check (say 2014) whether this is still needed.
|
||||||
|
if $BISON_CXX_WORKS; then
|
||||||
|
# See AT_DATA_SOURCE_PROLOGUE.
|
||||||
|
cat >conftest.cc <<EOF
|
||||||
|
#include <config.h>
|
||||||
|
/* We don't need perfect functions for these tests. */
|
||||||
|
#undef malloc
|
||||||
|
#undef memcmp
|
||||||
|
#undef realloc
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
std::cout << "Works" << std::endl;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
ls
|
||||||
|
$CXX $CXXFLAGS $CPPFLAGS $LDFLAGS $LIBS -o conftest conftest.cc
|
||||||
|
case $? in
|
||||||
|
0);;
|
||||||
|
*) BISON_CXX_WORKS="as_fn_error 77 cannot-compile-simple-program";;
|
||||||
|
esac
|
||||||
|
rm -f conftest*
|
||||||
|
fi
|
||||||
|
|
||||||
# Whether the compiler supports POSIXLY_CORRECT defined.
|
# Whether the compiler supports POSIXLY_CORRECT defined.
|
||||||
: ${C_COMPILER_POSIXLY_CORRECT='@C_COMPILER_POSIXLY_CORRECT@'}
|
: ${C_COMPILER_POSIXLY_CORRECT='@C_COMPILER_POSIXLY_CORRECT@'}
|
||||||
: ${CXX_COMPILER_POSIXLY_CORRECT='@CXX_COMPILER_POSIXLY_CORRECT@'}
|
: ${CXX_COMPILER_POSIXLY_CORRECT='@CXX_COMPILER_POSIXLY_CORRECT@'}
|
||||||
|
|||||||
+7
-7
@@ -790,16 +790,16 @@ list:
|
|||||||
;
|
;
|
||||||
|
|
||||||
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' { $][$ = 0; ]AT_VARIANT_IF([], [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' { $][$ = 0; ]AT_VARIANT_IF([], [delete $][1]; )[YYABORT; }
|
| 'T' { ]AT_VARIANT_IF([], [$][$ = YY_NULL; delete $][1]; )[YYABORT; }
|
||||||
| error { $][$ = 0; yyerrok; }
|
| error { ]AT_VARIANT_IF([], [$][$ = YY_NULL; ])[yyerrok; }
|
||||||
;
|
;
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -444,9 +444,8 @@ m4_define([AT_CHECK_JAVA_MINIMAL_W_LEXER],
|
|||||||
# Check that YYParser.java contains exactly COUNT lines matching ^LINE$
|
# Check that YYParser.java contains exactly COUNT lines matching ^LINE$
|
||||||
# with grep.
|
# with grep.
|
||||||
m4_define([AT_CHECK_JAVA_GREP],
|
m4_define([AT_CHECK_JAVA_GREP],
|
||||||
[AT_CHECK([grep -c '^$1$' YYParser.java], [], [m4_default([$2], [1])
|
[AT_CHECK([grep -c '^$1$' YYParser.java], [ignore], [m4_default([$2], [1])
|
||||||
])
|
])])
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
# ------------------------------------- #
|
# ------------------------------------- #
|
||||||
|
|||||||
@@ -0,0 +1,864 @@
|
|||||||
|
# Checking Java Push Parsing. -*- Autotest -*-
|
||||||
|
|
||||||
|
# Copyright (C) 2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# The Java push parser tests are intended primarily
|
||||||
|
# to verify that the sequence of states that the parser
|
||||||
|
# traverses is the same as a pull parser would traverse.
|
||||||
|
|
||||||
|
##################################################
|
||||||
|
# Provide a way to generate data with and without push parsing
|
||||||
|
# so it is possible to capture the output for comparison
|
||||||
|
# (except the "trivial" tests).
|
||||||
|
# Use "both" rather than "push" so we can also set it to "pull" to
|
||||||
|
# get the "experr" data.
|
||||||
|
|
||||||
|
m4_define([PUSHPULLFLAG],[-Dapi.push-pull=both])
|
||||||
|
|
||||||
|
# AT_CHECK_JAVA_GREP(FILE, [LINE], [COUNT=1])
|
||||||
|
# -------------------------------------------
|
||||||
|
# Check that FILE contains exactly COUNT lines matching ^LINE$
|
||||||
|
# with grep. Unquoted so that COUNT can be a shell expression.
|
||||||
|
m4_define([AT_CHECK_JAVA_GREP],
|
||||||
|
[AT_CHECK_UNQUOTED([grep -c '^$2$' $1], [ignore], [m4_default([$3], [1])
|
||||||
|
])])
|
||||||
|
|
||||||
|
##################################################
|
||||||
|
|
||||||
|
AT_BANNER([[Java Push Parsing Tests]])
|
||||||
|
|
||||||
|
# Define a single copy of the trivial parser grammar.
|
||||||
|
# This is missing main(), so two versions
|
||||||
|
# are instantiated with different main() procedures.
|
||||||
|
m4_define([AT_TRIVIAL_GRAMMAR],[
|
||||||
|
%define parser_class_name {YYParser}
|
||||||
|
%error-verbose
|
||||||
|
|
||||||
|
%code imports {
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
}
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
start: 'a' 'b' 'c' ;
|
||||||
|
|
||||||
|
%%
|
||||||
|
])
|
||||||
|
|
||||||
|
# Define comon code across to be includede in
|
||||||
|
# class Main for the trivial parser tests.
|
||||||
|
m4_define([AT_TRIVIAL_COMMON],[
|
||||||
|
static class YYerror implements YYParser.Lexer
|
||||||
|
{
|
||||||
|
public Object getLVal() {return null;}
|
||||||
|
public int yylex () throws java.io.IOException { return 0; }
|
||||||
|
public void yyerror (String msg) { System.err.println(msg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
static YYParser parser = null;
|
||||||
|
static YYerror yyerror = null;
|
||||||
|
static int teststate = -1;
|
||||||
|
|
||||||
|
static void setup()
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
yyerror = new YYerror();
|
||||||
|
parser = new YYParser(yyerror);
|
||||||
|
parser.setDebugLevel(1);
|
||||||
|
teststate = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static String[[]] teststatename
|
||||||
|
= new String[[]]{"YYACCEPT","YYABORT","YYERROR","UNKNOWN","YYPUSH_MORE"};
|
||||||
|
|
||||||
|
static void check(int teststate, int expected, String msg)
|
||||||
|
{
|
||||||
|
System.err.println("teststate="+teststatename[[teststate]]
|
||||||
|
+"; expected="+teststatename[[expected]]);
|
||||||
|
if (teststate == expected)
|
||||||
|
return;
|
||||||
|
System.err.println("unexpected state: "+msg);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
m4_define([AT_TRIVIAL_PARSER],[
|
||||||
|
AT_TRIVIAL_GRAMMAR
|
||||||
|
|
||||||
|
public class Main
|
||||||
|
{
|
||||||
|
|
||||||
|
AT_TRIVIAL_COMMON
|
||||||
|
|
||||||
|
static public void main (String[[]] argv)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
setup();
|
||||||
|
|
||||||
|
teststate = parser.push_parse('a', null);
|
||||||
|
check(teststate,YYParser.YYPUSH_MORE,"push_parse('a', null)");
|
||||||
|
|
||||||
|
setup();
|
||||||
|
|
||||||
|
teststate = parser.push_parse('a', null);
|
||||||
|
check(teststate,YYParser.YYPUSH_MORE,"push_parse('a', null)");
|
||||||
|
teststate = parser.push_parse('b', null);
|
||||||
|
check(teststate,YYParser.YYPUSH_MORE,"push_parse('b', null)");
|
||||||
|
teststate = parser.push_parse('c', null);
|
||||||
|
check(teststate,YYParser.YYPUSH_MORE,"push_parse('c', null)");
|
||||||
|
teststate = parser.push_parse('\0', null);
|
||||||
|
check(teststate,YYParser.YYACCEPT,"push_parse('\\0', null)");
|
||||||
|
|
||||||
|
/* Reuse the parser instance and cause a failure */
|
||||||
|
teststate = parser.push_parse('b', null);
|
||||||
|
check(teststate,YYParser.YYABORT,"push_parse('b', null)");
|
||||||
|
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
m4_define([AT_TRIVIAL_PARSER_INITIAL_ACTION],[
|
||||||
|
AT_TRIVIAL_GRAMMAR
|
||||||
|
|
||||||
|
public class Main
|
||||||
|
{
|
||||||
|
|
||||||
|
AT_TRIVIAL_COMMON
|
||||||
|
|
||||||
|
static public void main (String[[]] argv)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
setup();
|
||||||
|
|
||||||
|
teststate = parser.push_parse('a', null);
|
||||||
|
check(teststate,YYParser.YYPUSH_MORE,"push_parse('a', null)");
|
||||||
|
teststate = parser.push_parse('b', null);
|
||||||
|
check(teststate,YYParser.YYPUSH_MORE,"push_parse('b', null)");
|
||||||
|
teststate = parser.push_parse('c', null);
|
||||||
|
check(teststate,YYParser.YYPUSH_MORE,"push_parse('c', null)");
|
||||||
|
teststate = parser.push_parse('\0', null);
|
||||||
|
check(teststate,YYParser.YYACCEPT,"push_parse('\\0', null)");
|
||||||
|
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
## ----------------------------------------------------- ##
|
||||||
|
## Trivial Push Parser with api.push-pull verification. ##
|
||||||
|
## ----------------------------------------------------- ##
|
||||||
|
|
||||||
|
AT_SETUP([Trivial Push Parser with api.push-pull verification])
|
||||||
|
AT_BISON_OPTION_PUSHDEFS
|
||||||
|
|
||||||
|
AT_DATA([[input.y]],
|
||||||
|
[[%language "Java"
|
||||||
|
]AT_TRIVIAL_PARSER[
|
||||||
|
]])
|
||||||
|
|
||||||
|
# Verify that the proper procedure(s) are generated for each case.
|
||||||
|
AT_BISON_CHECK([[-Dapi.push-pull=pull -o Main.java input.y]])
|
||||||
|
AT_CHECK_JAVA_GREP([[Main.java]],
|
||||||
|
[[.*public boolean parse ().*]],
|
||||||
|
[1])
|
||||||
|
# If BISON_USE_PUSH_FOR_PULL is set, then we have one occurrence of
|
||||||
|
# this function, otherwise it should not be there.
|
||||||
|
AT_CHECK_JAVA_GREP([[Main.java]],
|
||||||
|
[[.*public int push_parse (int yylextoken, Object yylexval).*]],
|
||||||
|
[${BISON_USE_PUSH_FOR_PULL-0}])
|
||||||
|
|
||||||
|
AT_BISON_CHECK([[-Dapi.push-pull=both -o Main.java input.y]])
|
||||||
|
AT_CHECK_JAVA_GREP([[Main.java]],
|
||||||
|
[[.*public boolean parse ().*]],
|
||||||
|
[1])
|
||||||
|
AT_CHECK_JAVA_GREP([[Main.java]],
|
||||||
|
[[.*public int push_parse (int yylextoken, Object yylexval).*]],
|
||||||
|
[1])
|
||||||
|
|
||||||
|
AT_BISON_CHECK([[-Dapi.push-pull=push -o Main.java input.y]])
|
||||||
|
AT_CHECK_JAVA_GREP([[Main.java]],
|
||||||
|
[[.*public boolean parse ().*]],
|
||||||
|
[0])
|
||||||
|
AT_CHECK_JAVA_GREP([[Main.java]],
|
||||||
|
[[.*public int push_parse (int yylextoken, Object yylexval).*]],
|
||||||
|
[1])
|
||||||
|
|
||||||
|
AT_JAVA_COMPILE([[Main.java]])
|
||||||
|
AT_JAVA_PARSER_CHECK([Main], 0, [], [stderr-nolog])
|
||||||
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
AT_CLEANUP
|
||||||
|
|
||||||
|
|
||||||
|
## ------------------------------------------ ##
|
||||||
|
## Trivial Push Parser with %initial-action. ##
|
||||||
|
## ------------------------------------------ ##
|
||||||
|
|
||||||
|
AT_SETUP([Trivial Push Parser with %initial-action])
|
||||||
|
AT_BISON_OPTION_PUSHDEFS
|
||||||
|
AT_DATA([[input.y]],[[%language "Java"
|
||||||
|
%initial-action {
|
||||||
|
System.err.println("Initial action invoked");
|
||||||
|
}
|
||||||
|
]AT_TRIVIAL_PARSER_INITIAL_ACTION[
|
||||||
|
]])
|
||||||
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
AT_BISON_CHECK([[-Dapi.push-pull=push -o Main.java input.y]])
|
||||||
|
AT_CHECK_JAVA_GREP([[Main.java]],
|
||||||
|
[[System.err.println("Initial action invoked");]])
|
||||||
|
AT_JAVA_COMPILE([[Main.java]])
|
||||||
|
AT_JAVA_PARSER_CHECK([Main], 0, [], [stderr-nolog])
|
||||||
|
# Verify that initial action is called exactly once.
|
||||||
|
AT_CHECK_JAVA_GREP(
|
||||||
|
[[stderr]],
|
||||||
|
[[Initial action invoked]],
|
||||||
|
[1])
|
||||||
|
AT_CLEANUP
|
||||||
|
|
||||||
|
# Define a single copy of the Calculator grammar.
|
||||||
|
m4_define([AT_CALC_BODY],[
|
||||||
|
%code imports {
|
||||||
|
import java.io.*;
|
||||||
|
}
|
||||||
|
|
||||||
|
%code {
|
||||||
|
static StringReader
|
||||||
|
getinput(String filename) throws IOException
|
||||||
|
{
|
||||||
|
StringBuilder buf = new StringBuilder();
|
||||||
|
FileReader file = new FileReader(filename);
|
||||||
|
int c;
|
||||||
|
while ((c=file.read()) > 0)
|
||||||
|
buf.append((char)c);
|
||||||
|
file.close();
|
||||||
|
return new StringReader(buf.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bison Declarations */
|
||||||
|
%token <Integer> NUM "number"
|
||||||
|
%type <Integer> exp
|
||||||
|
|
||||||
|
%nonassoc '=' /* comparison */
|
||||||
|
%left '-' '+'
|
||||||
|
%left '*' '/'
|
||||||
|
%left NEG /* negation--unary minus */
|
||||||
|
%right '^' /* exponentiation */
|
||||||
|
|
||||||
|
/* Grammar follows */
|
||||||
|
%%
|
||||||
|
input:
|
||||||
|
line
|
||||||
|
| input line
|
||||||
|
;
|
||||||
|
|
||||||
|
line:
|
||||||
|
'\n'
|
||||||
|
| exp '\n'
|
||||||
|
{System.out.println("total = "+$[]1);}
|
||||||
|
| error '\n'
|
||||||
|
;
|
||||||
|
|
||||||
|
exp:
|
||||||
|
NUM { $[]$ = $[]1;}
|
||||||
|
| exp '=' exp
|
||||||
|
{
|
||||||
|
if ($[]1.intValue() != $[]3.intValue())
|
||||||
|
yyerror (]AT_LOCATION_IF([[@$,]])[ "calc: error: " + $[]1 + " != " + $[]3);
|
||||||
|
}
|
||||||
|
| exp '+' exp
|
||||||
|
{ $[]$ = new Integer ($[]1.intValue () + $[]3.intValue ()); }
|
||||||
|
| exp '-' exp
|
||||||
|
{ $[]$ = new Integer ($[]1.intValue () - $[]3.intValue ()); }
|
||||||
|
| exp '*' exp
|
||||||
|
{ $[]$ = new Integer ($[]1.intValue () * $[]3.intValue ()); }
|
||||||
|
| exp '/' exp
|
||||||
|
{ $[]$ = new Integer ($[]1.intValue () / $[]3.intValue ()); }
|
||||||
|
| '-' exp %prec NEG
|
||||||
|
{ $[]$ = new Integer (-$[]2.intValue ()); }
|
||||||
|
| exp '^' exp
|
||||||
|
{ $[]$ = new Integer ((int)Math.pow ($[]1.intValue (),
|
||||||
|
$[]3.intValue ())); }
|
||||||
|
| '(' exp ')' { $[]$ = $[]2;}
|
||||||
|
| '(' error ')' { $[]$ = new Integer (1111);}
|
||||||
|
| '!' { $[]$ = new Integer (0); return YYERROR;}
|
||||||
|
| '-' error { $[]$ = new Integer (0); return YYERROR;}
|
||||||
|
;
|
||||||
|
])
|
||||||
|
|
||||||
|
# Test that the states transitioned by the push parser are the
|
||||||
|
# same as for the pull parser. This test is assumed to work
|
||||||
|
# if it produces the same partial trace of stack states as is
|
||||||
|
# produced when using pull parsing. The output is verbose,
|
||||||
|
# but seems essential for verifying push parsing.
|
||||||
|
|
||||||
|
AT_SETUP([Calc parser with api.push-pull both])
|
||||||
|
AT_BISON_OPTION_PUSHDEFS
|
||||||
|
|
||||||
|
# Define the calculator input.
|
||||||
|
# Warning: if you changes the input file
|
||||||
|
# then the locations test file position numbers
|
||||||
|
# may be incorrect and you will have
|
||||||
|
# to modify that file as well.
|
||||||
|
|
||||||
|
AT_DATA([input],[[1 + 2 * 3 = 7
|
||||||
|
1 + 2 * -3 = -5
|
||||||
|
|
||||||
|
-1^2 = -1
|
||||||
|
(-1)^2 = 1
|
||||||
|
|
||||||
|
---1 = -1
|
||||||
|
|
||||||
|
1 - 2 - 3 = -4
|
||||||
|
1 - (2 - 3) = 2
|
||||||
|
|
||||||
|
2^2^3 = 256
|
||||||
|
(2^2)^3 = 64
|
||||||
|
]])
|
||||||
|
|
||||||
|
# Compose pieces to build the actual .y file.
|
||||||
|
AT_DATA([Calc.y],[[/* Infix notation calculator--calc */
|
||||||
|
%language "Java"
|
||||||
|
%name-prefix "Calc"
|
||||||
|
%define parser_class_name {Calc}
|
||||||
|
|
||||||
|
%code {
|
||||||
|
static class UserLexer implements Calc.Lexer
|
||||||
|
{
|
||||||
|
StreamTokenizer st;
|
||||||
|
StringReader rdr;
|
||||||
|
|
||||||
|
public UserLexer(StringReader reader)
|
||||||
|
{
|
||||||
|
rdr = reader;
|
||||||
|
st = new StreamTokenizer(rdr);
|
||||||
|
st.resetSyntax();
|
||||||
|
st.eolIsSignificant(true);
|
||||||
|
st.whitespaceChars(9, 9);
|
||||||
|
st.whitespaceChars(32, 32);
|
||||||
|
st.wordChars(48, 57);
|
||||||
|
}
|
||||||
|
|
||||||
|
Integer yylval;
|
||||||
|
|
||||||
|
public Object getLVal() { return yylval; }
|
||||||
|
|
||||||
|
public void yyerror(String msg) { System.err.println(msg); }
|
||||||
|
|
||||||
|
public int yylex () throws IOException
|
||||||
|
{
|
||||||
|
switch (st.nextToken()) {
|
||||||
|
case StreamTokenizer.TT_EOF: return EOF;
|
||||||
|
case StreamTokenizer.TT_EOL: return (int) '\n';
|
||||||
|
case StreamTokenizer.TT_WORD:
|
||||||
|
yylval = new Integer (st.sval);
|
||||||
|
return NUM;
|
||||||
|
default: return st.ttype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
%code {
|
||||||
|
public static void main (String[] argv)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
StringReader reader = getinput(argv[0]);
|
||||||
|
UserLexer lexer = new UserLexer(reader);
|
||||||
|
Calc calc = new Calc(lexer);
|
||||||
|
calc.setDebugLevel(1);
|
||||||
|
calc.parse();
|
||||||
|
}//main
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
]AT_CALC_BODY[
|
||||||
|
|
||||||
|
]])
|
||||||
|
|
||||||
|
# This data was captured from running a pull parser.
|
||||||
|
AT_DATA([[expout]],[[Stack now 0
|
||||||
|
Stack now 0 2
|
||||||
|
Stack now 0 9
|
||||||
|
Stack now 0 9 19
|
||||||
|
Stack now 0 9 19 2
|
||||||
|
Stack now 0 9 19 28
|
||||||
|
Stack now 0 9 19 28 20
|
||||||
|
Stack now 0 9 19 28 20 2
|
||||||
|
Stack now 0 9 19 28 20 29
|
||||||
|
Stack now 0 9 19 28
|
||||||
|
Stack now 0 9
|
||||||
|
Stack now 0 9 17
|
||||||
|
Stack now 0 9 17 2
|
||||||
|
Stack now 0 9 17 26
|
||||||
|
Stack now 0 9
|
||||||
|
Stack now 0 9 23
|
||||||
|
Stack now 0 8
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 2
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 19
|
||||||
|
Stack now 0 7 9 19 2
|
||||||
|
Stack now 0 7 9 19 28
|
||||||
|
Stack now 0 7 9 19 28 20
|
||||||
|
Stack now 0 7 9 19 28 20 3
|
||||||
|
Stack now 0 7 9 19 28 20 3 2
|
||||||
|
Stack now 0 7 9 19 28 20 3 12
|
||||||
|
Stack now 0 7 9 19 28 20 29
|
||||||
|
Stack now 0 7 9 19 28
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 17
|
||||||
|
Stack now 0 7 9 17 3
|
||||||
|
Stack now 0 7 9 17 3 2
|
||||||
|
Stack now 0 7 9 17 3 12
|
||||||
|
Stack now 0 7 9 17 26
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 23
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 4
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 3
|
||||||
|
Stack now 0 7 3 2
|
||||||
|
Stack now 0 7 3 12
|
||||||
|
Stack now 0 7 3 12 22
|
||||||
|
Stack now 0 7 3 12 22 2
|
||||||
|
Stack now 0 7 3 12 22 31
|
||||||
|
Stack now 0 7 3 12
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 17
|
||||||
|
Stack now 0 7 9 17 3
|
||||||
|
Stack now 0 7 9 17 3 2
|
||||||
|
Stack now 0 7 9 17 3 12
|
||||||
|
Stack now 0 7 9 17 26
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 23
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 5
|
||||||
|
Stack now 0 7 5 3
|
||||||
|
Stack now 0 7 5 3 2
|
||||||
|
Stack now 0 7 5 3 12
|
||||||
|
Stack now 0 7 5 14
|
||||||
|
Stack now 0 7 5 14 25
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 22
|
||||||
|
Stack now 0 7 9 22 2
|
||||||
|
Stack now 0 7 9 22 31
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 17
|
||||||
|
Stack now 0 7 9 17 2
|
||||||
|
Stack now 0 7 9 17 26
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 23
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 4
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 3
|
||||||
|
Stack now 0 7 3 3
|
||||||
|
Stack now 0 7 3 3 3
|
||||||
|
Stack now 0 7 3 3 3 2
|
||||||
|
Stack now 0 7 3 3 3 12
|
||||||
|
Stack now 0 7 3 3 12
|
||||||
|
Stack now 0 7 3 12
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 17
|
||||||
|
Stack now 0 7 9 17 3
|
||||||
|
Stack now 0 7 9 17 3 2
|
||||||
|
Stack now 0 7 9 17 3 12
|
||||||
|
Stack now 0 7 9 17 26
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 23
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 4
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 2
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 18
|
||||||
|
Stack now 0 7 9 18 2
|
||||||
|
Stack now 0 7 9 18 27
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 18
|
||||||
|
Stack now 0 7 9 18 2
|
||||||
|
Stack now 0 7 9 18 27
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 17
|
||||||
|
Stack now 0 7 9 17 3
|
||||||
|
Stack now 0 7 9 17 3 2
|
||||||
|
Stack now 0 7 9 17 3 12
|
||||||
|
Stack now 0 7 9 17 26
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 23
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 2
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 18
|
||||||
|
Stack now 0 7 9 18 5
|
||||||
|
Stack now 0 7 9 18 5 2
|
||||||
|
Stack now 0 7 9 18 5 14
|
||||||
|
Stack now 0 7 9 18 5 14 18
|
||||||
|
Stack now 0 7 9 18 5 14 18 2
|
||||||
|
Stack now 0 7 9 18 5 14 18 27
|
||||||
|
Stack now 0 7 9 18 5 14
|
||||||
|
Stack now 0 7 9 18 5 14 25
|
||||||
|
Stack now 0 7 9 18 27
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 17
|
||||||
|
Stack now 0 7 9 17 2
|
||||||
|
Stack now 0 7 9 17 26
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 23
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 4
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 2
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 22
|
||||||
|
Stack now 0 7 9 22 2
|
||||||
|
Stack now 0 7 9 22 31
|
||||||
|
Stack now 0 7 9 22 31 22
|
||||||
|
Stack now 0 7 9 22 31 22 2
|
||||||
|
Stack now 0 7 9 22 31 22 31
|
||||||
|
Stack now 0 7 9 22 31
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 17
|
||||||
|
Stack now 0 7 9 17 2
|
||||||
|
Stack now 0 7 9 17 26
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 23
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 5
|
||||||
|
Stack now 0 7 5 2
|
||||||
|
Stack now 0 7 5 14
|
||||||
|
Stack now 0 7 5 14 22
|
||||||
|
Stack now 0 7 5 14 22 2
|
||||||
|
Stack now 0 7 5 14 22 31
|
||||||
|
Stack now 0 7 5 14
|
||||||
|
Stack now 0 7 5 14 25
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 22
|
||||||
|
Stack now 0 7 9 22 2
|
||||||
|
Stack now 0 7 9 22 31
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 17
|
||||||
|
Stack now 0 7 9 17 2
|
||||||
|
Stack now 0 7 9 17 26
|
||||||
|
Stack now 0 7 9
|
||||||
|
Stack now 0 7 9 23
|
||||||
|
Stack now 0 7 16
|
||||||
|
Stack now 0 7
|
||||||
|
Stack now 0 7 15
|
||||||
|
]])
|
||||||
|
|
||||||
|
AT_BISON_CHECK([PUSHPULLFLAG [-o Calc.java Calc.y]])
|
||||||
|
AT_JAVA_COMPILE([[Calc.java]])
|
||||||
|
#Verify that this is a push parser.
|
||||||
|
AT_CHECK_JAVA_GREP([[Calc.java]],
|
||||||
|
[[.*public void push_parse_initialize().*]])
|
||||||
|
# Capture stderr output for comparison purposes.
|
||||||
|
AT_JAVA_PARSER_CHECK([Calc input], 0, [ignore-nolog], [stderr-nolog])
|
||||||
|
# Extract the "Stack Now" lines from the error output,
|
||||||
|
# send them to stdout (via the sed command) and compare to expout.
|
||||||
|
# NOTE: because the target is "expout", this macro automatically
|
||||||
|
# compares the output of the sed command with the contents of
|
||||||
|
# the file "expout" (defined above).
|
||||||
|
AT_CHECK([[sed -e '/^Stack now.*$/p' -e d ./stderr]],
|
||||||
|
[ignore], [expout], [ignore-nolog])
|
||||||
|
AT_BISON_OPTION_POPDEFS
|
||||||
|
AT_CLEANUP
|
||||||
|
|
||||||
|
# This test looks for location reporting by looking
|
||||||
|
# at the lexer output with locations enabled.
|
||||||
|
# It defines a lexer that reports location info.
|
||||||
|
AT_SETUP([Calc parser with %locations %code lexer and api.push-pull both])
|
||||||
|
AT_BISON_OPTION_PUSHDEFS
|
||||||
|
|
||||||
|
AT_DATA([Calc.y],[[/* Infix notation calculator--calc. */
|
||||||
|
%language "Java"
|
||||||
|
%name-prefix "Calc"
|
||||||
|
%define parser_class_name {Calc}
|
||||||
|
%lex-param { Reader rdr }
|
||||||
|
%locations
|
||||||
|
|
||||||
|
%code imports {
|
||||||
|
import java.io.*;
|
||||||
|
}
|
||||||
|
|
||||||
|
%code lexer {
|
||||||
|
StreamTokenizer st;
|
||||||
|
Integer yylval;
|
||||||
|
|
||||||
|
public YYLexer(Reader rdr)
|
||||||
|
{
|
||||||
|
st = new StreamTokenizer(rdr);
|
||||||
|
st.resetSyntax();
|
||||||
|
st.eolIsSignificant(true);
|
||||||
|
st.whitespaceChars(9, 9);
|
||||||
|
st.whitespaceChars(32, 32);
|
||||||
|
st.wordChars(48, 57);
|
||||||
|
}
|
||||||
|
|
||||||
|
Position yypos = new Position (1, 0);
|
||||||
|
|
||||||
|
public Position getStartPos() { return yypos; }
|
||||||
|
|
||||||
|
public Position getEndPos() { return yypos; }
|
||||||
|
|
||||||
|
public Object getLVal() { return yylval; }
|
||||||
|
|
||||||
|
public void yyerror(Location loc, String msg)
|
||||||
|
{
|
||||||
|
System.err.println(loc+":"+msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int yylex () throws IOException
|
||||||
|
{
|
||||||
|
yypos = new Position (yypos.lineno (),yypos.token () + 1);
|
||||||
|
switch (st.nextToken()) {
|
||||||
|
case StreamTokenizer.TT_EOF:
|
||||||
|
return EOF;
|
||||||
|
case StreamTokenizer.TT_EOL:
|
||||||
|
yypos = new Position (yypos.lineno () + 1, 0);
|
||||||
|
return (int) '\n';
|
||||||
|
case StreamTokenizer.TT_WORD:
|
||||||
|
yylval = new Integer (st.sval);
|
||||||
|
return NUM;
|
||||||
|
default:
|
||||||
|
return st.ttype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%code {
|
||||||
|
class Position {
|
||||||
|
public int line;
|
||||||
|
public int token;
|
||||||
|
|
||||||
|
public Position () { line = 0; token = 0; }
|
||||||
|
|
||||||
|
public Position (int l, int t) { line = l; token = t; }
|
||||||
|
|
||||||
|
public boolean equals (Position l)
|
||||||
|
{
|
||||||
|
return l.line == line && l.token == token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString ()
|
||||||
|
{
|
||||||
|
return Integer.toString(line) + "." + Integer.toString(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int lineno () { return line; }
|
||||||
|
|
||||||
|
public int token () { return token; }
|
||||||
|
}//Class Position
|
||||||
|
}
|
||||||
|
|
||||||
|
%code {
|
||||||
|
public static void main (String[] argv)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
StringReader reader = getinput(argv[0]);
|
||||||
|
Calc calc = new Calc(reader);
|
||||||
|
calc.setDebugLevel(1);
|
||||||
|
calc.parse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
]AT_CALC_BODY[
|
||||||
|
|
||||||
|
]])
|
||||||
|
|
||||||
|
# Define the expected calculator output.
|
||||||
|
# This should match the output from a pull parser.
|
||||||
|
AT_DATA([output],[[total = 7
|
||||||
|
total = -5
|
||||||
|
total = -1
|
||||||
|
total = 1
|
||||||
|
total = -1
|
||||||
|
total = -4
|
||||||
|
total = 2
|
||||||
|
total = 256
|
||||||
|
total = 64
|
||||||
|
]])
|
||||||
|
|
||||||
|
AT_DATA([locations],[[Next token is token "number" (1.1: 1)
|
||||||
|
Next token is token '+' (1.2: 1)
|
||||||
|
Next token is token "number" (1.3: 2)
|
||||||
|
Next token is token '*' (1.4: 2)
|
||||||
|
Next token is token "number" (1.5: 3)
|
||||||
|
Next token is token '=' (1.6: 3)
|
||||||
|
Next token is token '=' (1.6: 3)
|
||||||
|
Next token is token '=' (1.6: 3)
|
||||||
|
Next token is token "number" (1.7: 7)
|
||||||
|
Next token is token '\n' (2.0: 7)
|
||||||
|
Next token is token '\n' (2.0: 7)
|
||||||
|
Next token is token "number" (2.1: 1)
|
||||||
|
Next token is token '+' (2.2: 1)
|
||||||
|
Next token is token "number" (2.3: 2)
|
||||||
|
Next token is token '*' (2.4: 2)
|
||||||
|
Next token is token '-' (2.5: 2)
|
||||||
|
Next token is token "number" (2.6: 3)
|
||||||
|
Next token is token '=' (2.7: 3)
|
||||||
|
Next token is token '=' (2.7: 3)
|
||||||
|
Next token is token '=' (2.7: 3)
|
||||||
|
Next token is token '=' (2.7: 3)
|
||||||
|
Next token is token '-' (2.8: 3)
|
||||||
|
Next token is token "number" (2.9: 5)
|
||||||
|
Next token is token '\n' (3.0: 5)
|
||||||
|
Next token is token '\n' (3.0: 5)
|
||||||
|
Next token is token '\n' (3.0: 5)
|
||||||
|
Next token is token '\n' (4.0: 5)
|
||||||
|
Next token is token '-' (4.1: 5)
|
||||||
|
Next token is token "number" (4.2: 1)
|
||||||
|
Next token is token '^' (4.3: 1)
|
||||||
|
Next token is token "number" (4.4: 2)
|
||||||
|
Next token is token '=' (4.5: 2)
|
||||||
|
Next token is token '=' (4.5: 2)
|
||||||
|
Next token is token '=' (4.5: 2)
|
||||||
|
Next token is token '-' (4.6: 2)
|
||||||
|
Next token is token "number" (4.7: 1)
|
||||||
|
Next token is token '\n' (5.0: 1)
|
||||||
|
Next token is token '\n' (5.0: 1)
|
||||||
|
Next token is token '\n' (5.0: 1)
|
||||||
|
Next token is token '(' (5.1: 1)
|
||||||
|
Next token is token '-' (5.2: 1)
|
||||||
|
Next token is token "number" (5.3: 1)
|
||||||
|
Next token is token ')' (5.4: 1)
|
||||||
|
Next token is token ')' (5.4: 1)
|
||||||
|
Next token is token '^' (5.5: 1)
|
||||||
|
Next token is token "number" (5.6: 2)
|
||||||
|
Next token is token '=' (5.7: 2)
|
||||||
|
Next token is token '=' (5.7: 2)
|
||||||
|
Next token is token "number" (5.8: 1)
|
||||||
|
Next token is token '\n' (6.0: 1)
|
||||||
|
Next token is token '\n' (6.0: 1)
|
||||||
|
Next token is token '\n' (7.0: 1)
|
||||||
|
Next token is token '-' (7.1: 1)
|
||||||
|
Next token is token '-' (7.2: 1)
|
||||||
|
Next token is token '-' (7.3: 1)
|
||||||
|
Next token is token "number" (7.4: 1)
|
||||||
|
Next token is token '=' (7.5: 1)
|
||||||
|
Next token is token '=' (7.5: 1)
|
||||||
|
Next token is token '=' (7.5: 1)
|
||||||
|
Next token is token '=' (7.5: 1)
|
||||||
|
Next token is token '-' (7.6: 1)
|
||||||
|
Next token is token "number" (7.7: 1)
|
||||||
|
Next token is token '\n' (8.0: 1)
|
||||||
|
Next token is token '\n' (8.0: 1)
|
||||||
|
Next token is token '\n' (8.0: 1)
|
||||||
|
Next token is token '\n' (9.0: 1)
|
||||||
|
Next token is token "number" (9.1: 1)
|
||||||
|
Next token is token '-' (9.2: 1)
|
||||||
|
Next token is token "number" (9.3: 2)
|
||||||
|
Next token is token '-' (9.4: 2)
|
||||||
|
Next token is token '-' (9.4: 2)
|
||||||
|
Next token is token "number" (9.5: 3)
|
||||||
|
Next token is token '=' (9.6: 3)
|
||||||
|
Next token is token '=' (9.6: 3)
|
||||||
|
Next token is token '-' (9.7: 3)
|
||||||
|
Next token is token "number" (9.8: 4)
|
||||||
|
Next token is token '\n' (10.0: 4)
|
||||||
|
Next token is token '\n' (10.0: 4)
|
||||||
|
Next token is token '\n' (10.0: 4)
|
||||||
|
Next token is token "number" (10.1: 1)
|
||||||
|
Next token is token '-' (10.2: 1)
|
||||||
|
Next token is token '(' (10.3: 1)
|
||||||
|
Next token is token "number" (10.4: 2)
|
||||||
|
Next token is token '-' (10.5: 2)
|
||||||
|
Next token is token "number" (10.6: 3)
|
||||||
|
Next token is token ')' (10.7: 3)
|
||||||
|
Next token is token ')' (10.7: 3)
|
||||||
|
Next token is token '=' (10.8: 3)
|
||||||
|
Next token is token '=' (10.8: 3)
|
||||||
|
Next token is token "number" (10.9: 2)
|
||||||
|
Next token is token '\n' (11.0: 2)
|
||||||
|
Next token is token '\n' (11.0: 2)
|
||||||
|
Next token is token '\n' (12.0: 2)
|
||||||
|
Next token is token "number" (12.1: 2)
|
||||||
|
Next token is token '^' (12.2: 2)
|
||||||
|
Next token is token "number" (12.3: 2)
|
||||||
|
Next token is token '^' (12.4: 2)
|
||||||
|
Next token is token "number" (12.5: 3)
|
||||||
|
Next token is token '=' (12.6: 3)
|
||||||
|
Next token is token '=' (12.6: 3)
|
||||||
|
Next token is token '=' (12.6: 3)
|
||||||
|
Next token is token "number" (12.7: 256)
|
||||||
|
Next token is token '\n' (13.0: 256)
|
||||||
|
Next token is token '\n' (13.0: 256)
|
||||||
|
Next token is token '(' (13.1: 256)
|
||||||
|
Next token is token "number" (13.2: 2)
|
||||||
|
Next token is token '^' (13.3: 2)
|
||||||
|
Next token is token "number" (13.4: 2)
|
||||||
|
Next token is token ')' (13.5: 2)
|
||||||
|
Next token is token ')' (13.5: 2)
|
||||||
|
Next token is token '^' (13.6: 2)
|
||||||
|
Next token is token "number" (13.7: 3)
|
||||||
|
Next token is token '=' (13.8: 3)
|
||||||
|
Next token is token '=' (13.8: 3)
|
||||||
|
Next token is token "number" (13.9: 64)
|
||||||
|
Next token is token '\n' (14.0: 64)
|
||||||
|
Next token is token '\n' (14.0: 64)
|
||||||
|
]])
|
||||||
|
|
||||||
|
# Define the calculator input.
|
||||||
|
# Warning: if you changes the input file
|
||||||
|
# then the locations test file position numbers
|
||||||
|
# may be incorrect and you will have
|
||||||
|
# to modify that file as well.
|
||||||
|
|
||||||
|
AT_DATA([input],[[1 + 2 * 3 = 7
|
||||||
|
1 + 2 * -3 = -5
|
||||||
|
|
||||||
|
-1^2 = -1
|
||||||
|
(-1)^2 = 1
|
||||||
|
|
||||||
|
---1 = -1
|
||||||
|
|
||||||
|
1 - 2 - 3 = -4
|
||||||
|
1 - (2 - 3) = 2
|
||||||
|
|
||||||
|
2^2^3 = 256
|
||||||
|
(2^2)^3 = 64
|
||||||
|
]])
|
||||||
|
|
||||||
|
AT_BISON_CHECK([PUSHPULLFLAG [-o Calc.java Calc.y]])
|
||||||
|
AT_JAVA_COMPILE([[Calc.java]])
|
||||||
|
# Verify that this is a push parser
|
||||||
|
AT_CHECK_JAVA_GREP([[Calc.java]],
|
||||||
|
[[.*public void push_parse_initialize().*]])
|
||||||
|
# Capture the stdout and stderr output for comparison purposes.
|
||||||
|
AT_JAVA_PARSER_CHECK([Calc input], 0, [stdout-nolog], [stderr-nolog])
|
||||||
|
# 1. Check that the token locations are correct
|
||||||
|
AT_CHECK([[cp -f ./locations ./expout]],[ignore],[ignore-nolog],[ignore-nolog])
|
||||||
|
AT_CHECK([[sed -e '/^Next token.*$/p' -e d ./stderr]],[ignore],[expout],[ignore-nolog])
|
||||||
|
# 2. Check that the calculator output matches that of a pull parser
|
||||||
|
AT_CHECK([[rm -f ./expout; cp -f ./output ./expout]],[ignore],[ignore-nolog],[ignore-nolog])
|
||||||
|
AT_CHECK([[cat ./stdout]],[ignore],[expout],[ignore-nolog])
|
||||||
|
AT_CLEANUP
|
||||||
+4
-3
@@ -339,9 +339,9 @@ m4_define([AT_LANG_DISPATCH],
|
|||||||
|
|
||||||
|
|
||||||
# AT_DATA_SOURCE_PROLOGUE
|
# AT_DATA_SOURCE_PROLOGUE
|
||||||
# ------------------------
|
# -----------------------
|
||||||
# The prologue that should be included in any source code that is
|
# The prologue that should be included in any source code that is
|
||||||
# meant to be compiled.
|
# meant to be compiled. Keep atlocal.in sync (BISON_CXX_WORKS).
|
||||||
m4_define([AT_DATA_SOURCE_PROLOGUE],
|
m4_define([AT_DATA_SOURCE_PROLOGUE],
|
||||||
[[#include <config.h>
|
[[#include <config.h>
|
||||||
/* We don't need perfect functions for these tests. */
|
/* We don't need perfect functions for these tests. */
|
||||||
@@ -754,6 +754,7 @@ AT_CHECK(m4_join([ ],
|
|||||||
[m4_bmatch([$1], [[.]], [], [$LIBS])]),
|
[m4_bmatch([$1], [[.]], [], [$LIBS])]),
|
||||||
0, [ignore], [ignore])])
|
0, [ignore], [ignore])])
|
||||||
|
|
||||||
|
|
||||||
# AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.cc])
|
# AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.cc])
|
||||||
# ---------------------------------------------
|
# ---------------------------------------------
|
||||||
# Compile SOURCES into OUTPUT. If the C++ compiler does not work,
|
# Compile SOURCES into OUTPUT. If the C++ compiler does not work,
|
||||||
@@ -761,7 +762,7 @@ AT_CHECK(m4_join([ ],
|
|||||||
#
|
#
|
||||||
# If OUTPUT does not contain '.', assume that we are linking too,
|
# If OUTPUT does not contain '.', assume that we are linking too,
|
||||||
# otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT
|
# otherwise pass "-c"; this is a hack. The default SOURCES is OUTPUT
|
||||||
# with trailing .o removed, and ".cc" appended.
|
# with trailing ".o" removed, and ".cc" appended.
|
||||||
m4_define([AT_COMPILE_CXX],
|
m4_define([AT_COMPILE_CXX],
|
||||||
[AT_KEYWORDS(c++)
|
[AT_KEYWORDS(c++)
|
||||||
AT_CHECK([$BISON_CXX_WORKS], 0, ignore, ignore)
|
AT_CHECK([$BISON_CXX_WORKS], 0, ignore, ignore)
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ TESTSUITE_AT = \
|
|||||||
tests/headers.at \
|
tests/headers.at \
|
||||||
tests/input.at \
|
tests/input.at \
|
||||||
tests/java.at \
|
tests/java.at \
|
||||||
|
tests/javapush.at \
|
||||||
tests/local.at \
|
tests/local.at \
|
||||||
tests/named-refs.at \
|
tests/named-refs.at \
|
||||||
tests/output.at \
|
tests/output.at \
|
||||||
|
|||||||
+5
-4
@@ -37,10 +37,11 @@ foo: {};
|
|||||||
|
|
||||||
]AT_BISON_CHECK([$3 $1 $5], 0)[
|
]AT_BISON_CHECK([$3 $1 $5], 0)[
|
||||||
# Ignore the files non-generated files
|
# Ignore the files non-generated files
|
||||||
]AT_CHECK([find . -type f -and -not -path './$1' -and -not -path './testsuite.log' |
|
]AT_CHECK([[find . -type f |
|
||||||
sed 's,\./,,' |
|
$PERL -ne '
|
||||||
sort |
|
s,\./,,; chomp;
|
||||||
xargs echo],
|
push @file, $_ unless m{^($1|testsuite.log)$};
|
||||||
|
END { print join (" ", sort @file), "\n" }']],
|
||||||
[], [$4
|
[], [$4
|
||||||
])[
|
])[
|
||||||
]$6[
|
]$6[
|
||||||
|
|||||||
+4
-3
@@ -63,17 +63,18 @@ m4_include([existing.at])
|
|||||||
# Some old bugs.
|
# Some old bugs.
|
||||||
m4_include([regression.at])
|
m4_include([regression.at])
|
||||||
|
|
||||||
|
# Push parsing specific tests.
|
||||||
|
m4_include([push.at])
|
||||||
|
|
||||||
# Some C++ specific tests.
|
# Some C++ specific tests.
|
||||||
m4_include([c++.at])
|
m4_include([c++.at])
|
||||||
|
|
||||||
# And some Java specific tests.
|
# And some Java specific tests.
|
||||||
m4_include([java.at])
|
m4_include([java.at])
|
||||||
|
m4_include([javapush.at])
|
||||||
|
|
||||||
# GLR tests:
|
# GLR tests:
|
||||||
# C++ types, simplified
|
# C++ types, simplified
|
||||||
m4_include([cxx-type.at])
|
m4_include([cxx-type.at])
|
||||||
# Regression tests
|
# Regression tests
|
||||||
m4_include([glr-regression.at])
|
m4_include([glr-regression.at])
|
||||||
|
|
||||||
# Push parsing specific tests.
|
|
||||||
m4_include([push.at])
|
|
||||||
|
|||||||
Reference in New Issue
Block a user