Merge remote-tracking branch 'origin/maint'

* origin/maint:
  tests: use the generalized default yylex.
  tests: AT_YYERROR_DEFINE: prepare for list of ints.
  skeletons: no longer define YYLSP_NEEDED.
  c++: do not export YYTOKEN_TABLE and YYERROR_VERBOSE.

Conflicts:
	data/c.m4
	data/glr.cc
	data/lalr1.cc
	doc/bison.texi
	tests/regression.at
This commit is contained in:
Akim Demaille
2012-06-28 15:29:18 +02:00
15 changed files with 95 additions and 176 deletions

31
NEWS
View File

@@ -124,14 +124,16 @@ GNU Bison NEWS
generated for C supprt ISO C90, and are tested with ISO C99 and ISO C11 generated for C supprt ISO C90, and are tested with ISO C99 and ISO C11
compilers. compilers.
*** Deprecated features *** Features deprecated since Bison 1.875
The definitions of yystype and yyltype will be removed, as announced since The definitions of yystype and yyltype will be removed; use YYSTYPE and
Bison 1.875. Use YYSTYPE and YYLTYPE only. YYLTYPE.
YYPARSE_PARAM and YYLEX_PARAM, which were deprecated in favor of YYPARSE_PARAM and YYLEX_PARAM, deprecated in favor of %parse-param and
%parse-param and %lex-param (introduced in Bison 1.875), will no longer be %lex-param, will no longer be supported.
supported.
Support for the preprocessor symbol YYERROR_VERBOSE will be removed, use
%error-verbose.
*** The generated header will be included (yacc.c) *** The generated header will be included (yacc.c)
@@ -141,9 +143,9 @@ GNU Bison NEWS
because existing versions of ylwrap (e.g., Automake 1.12.1) do not support because existing versions of ylwrap (e.g., Automake 1.12.1) do not support
it. it.
** Headers (yacc.c, glr.c, glr.cc) ** Headers
*** Guards *** Guards (yacc.c, glr.c, glr.cc)
The generated headers are now guarded, as is already the case for C++ The generated headers are now guarded, as is already the case for C++
parsers (lalr1.cc). For intance, with --defines=foo.h: parsers (lalr1.cc). For intance, with --defines=foo.h:
@@ -153,7 +155,7 @@ GNU Bison NEWS
... ...
#endif /* !YY_FOO_H */ #endif /* !YY_FOO_H */
*** New declarations *** New declarations (yacc.c, glr.c)
The generated header now declares yydebug and yyparse. Both honor The generated header now declares yydebug and yyparse. Both honor
--name-prefix=bar_, and yield --name-prefix=bar_, and yield
@@ -168,6 +170,17 @@ GNU Bison NEWS
in order to facilitate the inclusion of several parser headers inside a in order to facilitate the inclusion of several parser headers inside a
single compilation unit. single compilation unit.
*** Exported symbols in C++
The symbols YYTOKEN_TABLE and YYERROR_VERBOSE, which were defined in the
header, are removed, as they prevent the possibility of including several
generated headers from a single compilation unit.
*** YYLSP_NEEDED
For the same reasons, the undocumented and unused macro YYLSP_NEEDED is no
longer defined.
* Noteworthy changes in release 2.5.1 (2012-06-05) [stable] * Noteworthy changes in release 2.5.1 (2012-06-05) [stable]
** Future changes: ** Future changes:

6
TODO
View File

@@ -126,12 +126,6 @@ The code bw glr.c and yacc.c is really alike, we can certainly factor
some parts. some parts.
* Yacc.c: CPP Macros
Do some people use YYPURE, YYLSP_NEEDED like we do in the test suite?
They should not: it is not documented. But if they need to, let's
find something clean (not like YYLSP_NEEDED...).
* Report * Report
** Figures ** Figures

View File

@@ -317,9 +317,9 @@ m4_define([b4_define_flag_if],
# _b4_define_flag_if($1, $2, FLAG) # _b4_define_flag_if($1, $2, FLAG)
# -------------------------------- # --------------------------------
# This macro works around the impossibility to define macros # Work around the impossibility to define macros inside macros,
# inside macros, because issuing `[$1]' is not possible in M4 :(. # because issuing `[$1]' is not possible in M4. GNU M4 should provide
# This sucks hard, GNU M4 should really provide M5 like $$1. # $$1 a la M5/TeX.
m4_define([_b4_define_flag_if], m4_define([_b4_define_flag_if],
[m4_if([$1$2], $[1]$[2], [], [m4_if([$1$2], $[1]$[2], [],
[m4_fatal([$0: Invalid arguments: $@])])dnl [m4_fatal([$0: Invalid arguments: $@])])dnl
@@ -333,8 +333,12 @@ m4_define([b4_$3_if],
b4_define_flag_if([defines]) # Whether headers are requested. b4_define_flag_if([defines]) # Whether headers are requested.
b4_define_flag_if([glr]) # Whether a GLR parser is requested. b4_define_flag_if([glr]) # Whether a GLR parser is requested.
b4_define_flag_if([nondeterministic]) # Whether conflicts should be handled. b4_define_flag_if([nondeterministic]) # Whether conflicts should be handled.
b4_define_flag_if([token_table]) # Whether yytoken_table is demanded.
b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated. b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated.
# yytoken_table is needed to support verbose errors.
b4_error_verbose_if([m4_define([b4_token_table_flag], [1])])
## --------- ## ## --------- ##
## Symbols. ## ## Symbols. ##

View File

@@ -100,9 +100,6 @@ m4_define([b4_identification],
/* Pull parsers. */ /* Pull parsers. */
#define YYPULL ]b4_pull_flag])[ #define YYPULL ]b4_pull_flag])[
/* Using locations. */
#define YYLSP_NEEDED ]b4_locations_if([1], [0])[
]]) ]])

View File

@@ -223,11 +223,6 @@ b4_percent_code_get([[top]])[
# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ # define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
#endif #endif
/* Enabling the token table. */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE ]b4_token_table[
#endif
/* Default (constant) value used for initialization for null /* Default (constant) value used for initialization for null
right-hand sides. Unlike the standard yacc.c template, right-hand sides. Unlike the standard yacc.c template,
here we set the default value of $$ to a zeroed-out value. here we set the default value of $$ to a zeroed-out value.
@@ -362,7 +357,7 @@ static const ]b4_int_type_for([b4_rline])[ yyrline[] =
}; };
#endif #endif
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE #if YYDEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
First, the terminals, then, starting at YYNTOKENS, nonterminals. */ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
static const char *const yytname[] = static const char *const yytname[] =

View File

@@ -236,9 +236,6 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++],
]b4_percent_define_ifdef([[location_type]], [], ]b4_percent_define_ifdef([[location_type]], [],
[[#include "location.hh"]])[ [[#include "location.hh"]])[
/* Using locations. */
#define YYLSP_NEEDED ]b4_locations_if([1], [0])[
/* Enabling traces. */ /* Enabling traces. */
#ifndef YYDEBUG #ifndef YYDEBUG
# define YYDEBUG ]b4_parse_trace_if([1], [0])[ # define YYDEBUG ]b4_parse_trace_if([1], [0])[

View File

@@ -167,19 +167,6 @@ b4_namespace_close])[
# define YYDEBUG ]b4_parse_trace_if([1], [0])[ # define YYDEBUG ]b4_parse_trace_if([1], [0])[
#endif #endif
/* Enabling verbose error messages. */
#ifdef YYERROR_VERBOSE
# undef YYERROR_VERBOSE
# define YYERROR_VERBOSE 1
#else
# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
#endif
/* Enabling the token table. */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE ]b4_token_table[
#endif
]b4_namespace_open[ ]b4_namespace_open[
/// A Bison parser. /// A Bison parser.
@@ -244,18 +231,16 @@ b4_namespace_close])[
static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_; static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_; static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
/* Tables. */ // Tables.
]b4_parser_tables_declare[ ]b4_parser_tables_declare[]b4_error_verbose_if([
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
/// For a symbol, its name in clear.
static const char* const yytname_[];
#endif]b4_error_verbose_if([
/// Convert the symbol name \a n to a form suitable for a diagnostic. /// Convert the symbol name \a n to a form suitable for a diagnostic.
static std::string yytnamerr_ (const char *n);])[ static std::string yytnamerr_ (const char *n);])[
#if YYDEBUG ]b4_token_table_if([], [[#if YYDEBUG]])[
/// For a symbol, its name in clear.
static const char* const yytname_[];
]b4_token_table_if([[#if YYDEBUG]])[
]b4_integral_parser_table_declare([rline], [b4_rline], ]b4_integral_parser_table_declare([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 \a r is going to be reduced. /// Report on the debug stream that the rule \a r is going to be reduced.
@@ -263,10 +248,10 @@ b4_namespace_close])[
/// Print the state stack on the debug stream. /// Print the state stack on the debug stream.
virtual void yystack_print_ (); virtual void yystack_print_ ();
/* Debugging. */ // Debugging.
int yydebug_; int yydebug_;
std::ostream* yycdebug_; std::ostream* yycdebug_;
#endif #endif // YYDEBUG
/// Convert a scanner token number \a t to a symbol number. /// Convert a scanner token number \a t to a symbol number.
static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t); static inline token_number_type yytranslate_ (]b4_lex_symbol_if([token_type], [int])[ t);
@@ -654,7 +639,7 @@ b4_percent_code_get[]dnl
{ {
yydebug_ = l; yydebug_ = l;
} }
#endif #endif // YYDEBUG
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 yylhs) ]b4_parser_class_name[::yy_lr_goto_state_ (state_type yystate, int yylhs)
@@ -1099,7 +1084,7 @@ b4_error_verbose_if([state_type yystate, int yytoken],
]b4_parser_tables_define[ ]b4_parser_tables_define[
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE ]b4_token_table_if([], [[#if YYDEBUG]])[
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
First, the terminals, then, starting at \a yyntokens_, nonterminals. */ First, the terminals, then, starting at \a yyntokens_, nonterminals. */
const char* const char*
@@ -1107,9 +1092,8 @@ b4_error_verbose_if([state_type yystate, int yytoken],
{ {
]b4_tname[ ]b4_tname[
}; };
#endif
#if YYDEBUG ]b4_token_table_if([[#if YYDEBUG]])[
]b4_integral_parser_table_define([rline], [b4_rline])[ ]b4_integral_parser_table_define([rline], [b4_rline])[
// Print the state stack on the debug stream. // Print the state stack on the debug stream.

View File

@@ -337,11 +337,6 @@ m4_if(b4_prefix, [yy], [],
# define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ # define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[
#endif #endif
/* Enabling the token table. */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE ]b4_token_table[
#endif
/* In a future release of Bison, this section will be replaced /* In a future release of Bison, this section will be replaced
by #include "@basename(]b4_spec_defines_file[@)". */ by #include "@basename(]b4_spec_defines_file[@)". */
]b4_shared_declarations[ ]b4_shared_declarations[
@@ -594,7 +589,7 @@ static const ]b4_int_type_for([b4_translate])[ yytranslate[] =
[YYRLINE[YYN] -- Source line where rule number YYN was defined.])[ [YYRLINE[YYN] -- Source line where rule number YYN was defined.])[
#endif #endif
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE #if YYDEBUG || YYERROR_VERBOSE || ]b4_token_table_flag[
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
First, the terminals, then, starting at YYNTOKENS, nonterminals. */ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
static const char *const yytname[] = static const char *const yytname[] =

View File

@@ -142,7 +142,6 @@ escaped_output (FILE *out, char const *string)
static void static void
prepare_symbols (void) prepare_symbols (void)
{ {
MUSCLE_INSERT_BOOL ("token_table", token_table_flag);
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);
@@ -682,6 +681,7 @@ prepare (void)
MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser); MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser);
MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag); MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen); MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen);
MUSCLE_INSERT_BOOL ("token_table_flag", token_table_flag);
MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag); MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag);
MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag); MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag);

View File

@@ -51,7 +51,7 @@ exp: { putchar ('0'); }
; ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(123456789)[ ]AT_YYLEX_DEFINE(["123456789"])[
int int
main (void) main (void)
{ {
@@ -116,7 +116,7 @@ sum_of_the_five_previous_values:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([])[ ]AT_YYLEX_DEFINE[
int int
main (void) main (void)
{ {
@@ -151,7 +151,7 @@ sum: { printf ("%d\n", $0.val + $-1.val + $-2.val); } ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE()[ ]AT_YYLEX_DEFINE[
int int
main (void) main (void)
{ {
@@ -636,7 +636,7 @@ start: 'a' 'b' 'c' 'd' 'e' { $$ = 'S'; USE(($1, $2, $3, $4, $5)); } ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([abcd], [[yylval = res]])[ ]AT_YYLEX_DEFINE(["abcd"], [[yylval = res]])[
int int
main (void) main (void)
@@ -748,7 +748,7 @@ start:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([abcdef])[ ]AT_YYLEX_DEFINE(["abcdef"])[
int int
main (void) main (void)
@@ -966,7 +966,7 @@ start:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([abd], [yylval = res])[ ]AT_YYLEX_DEFINE(["abd"], [yylval = res])[
int int
main (void) main (void)
{ {
@@ -1066,7 +1066,7 @@ start: { USE($$); } ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([])[ ]AT_YYLEX_DEFINE[
int int
main (void) main (void)
{ {
@@ -1121,7 +1121,7 @@ start:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([])[ ]AT_YYLEX_DEFINE[
int int
main (void) main (void)
{ {
@@ -1381,7 +1381,7 @@ accept: /*empty*/ {
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([a])[ ]AT_YYLEX_DEFINE(["a"])[
int int
main (void) main (void)
{ {
@@ -1417,7 +1417,7 @@ AT_DATA_GRAMMAR([input.y],
# include <assert.h> # include <assert.h>
]AT_YYERROR_DECLARE[ ]AT_YYERROR_DECLARE[
static int yylex (YYSTYPE *yylval); ]AT_YYLEX_DECLARE[
} }
%% %%
input: input:
@@ -1432,15 +1432,7 @@ exp:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
static int ]AT_YYLEX_DEFINE(["bcd"], [*lvalp = (toknum + 1) * 10])[
yylex (YYSTYPE *yylval)
{
static char const input[] = "bcd";
static size_t toknum;
assert (toknum < sizeof input);
*yylval = (toknum + 1) * 10;
return input[toknum++];
}
int int
main (void) main (void)

View File

@@ -485,7 +485,7 @@ reduce-nonassoc: %prec 'a';
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([aaa])[ ]AT_YYLEX_DEFINE(["aaa"])[
int int
main (void) main (void)

View File

@@ -383,7 +383,7 @@ B: 'a' { $$ = make_value ("B", "'a'"); } ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([a])[ ]AT_YYLEX_DEFINE(["a"])[
int int
main (void) main (void)
@@ -466,7 +466,7 @@ start:
; ;
%% %%
]AT_YYLEX_DEFINE(a)[ ]AT_YYLEX_DEFINE(["a"])[
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
int int
main (void) main (void)
@@ -519,7 +519,7 @@ start: 'a' | 'a' ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE(a)[ ]AT_YYLEX_DEFINE(["a"])[
int int
main (void) main (void)
{ {
@@ -834,7 +834,7 @@ start:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE()[ ]AT_YYLEX_DEFINE[
int int
main (void) main (void)
@@ -889,7 +889,7 @@ start:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([a])[ ]AT_YYLEX_DEFINE(["a"])[
int int
main (void) main (void)
@@ -998,16 +998,9 @@ merge (YYSTYPE s1, YYSTYPE s2)
} }
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
static int ]AT_YYLEX_DEFINE([{ PARENT_RHS_AFTER, 0 }],
yylex (void) [if (res == PARENT_RHS_AFTER)
{ parent_rhs_after_value = 1;])[
static int const input[] = { PARENT_RHS_AFTER, 0 };
static size_t toknum;
assert (toknum < sizeof input / sizeof *input);
if (input[toknum] == PARENT_RHS_AFTER)
parent_rhs_after_value = 1;
return input[toknum++];
}
int int
main (void) main (void)
@@ -1117,17 +1110,8 @@ change_lookahead:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
static int ]AT_YYLEX_DEFINE(["ab"],
yylex (void) [yylval.value = res + 'A' - 'a'])[
{
static char const input[] = "ab";
static size_t toknum;
assert (toknum < sizeof input);
yylloc.first_line = yylloc.last_line = 1;
yylloc.first_column = yylloc.last_column = toknum + 1;
yylval.value = input[toknum] + 'A' - 'a';
return input[toknum++];
}
static void static void
print_lookahead (char const *reduction) print_lookahead (char const *reduction)
@@ -1449,7 +1433,7 @@ ambiguity2: ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE()[ ]AT_YYLEX_DEFINE[
int int
main (void) main (void)
@@ -1507,16 +1491,9 @@ alt2: ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
static int ]AT_YYLEX_DEFINE(["ab"],
yylex (void) [if (res == 'b')
{ lookahead_value = 1])[
static char const input[] = "ab";
static size_t toknum;
assert (toknum < sizeof input);
if (input[toknum] == 'b')
lookahead_value = 1;
return input[toknum++];
}
int int
main (void) main (void)
@@ -1663,7 +1640,7 @@ sym3: %merge<merge> { $$ = 0; } ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE()[ ]AT_YYLEX_DEFINE[
int int
main (void) main (void)
{ {
@@ -1709,7 +1686,7 @@ start:
b: 'b'; b: 'b';
d: /* nada. */; d: /* nada. */;
%% %%
]AT_YYLEX_DEFINE([abc])[ ]AT_YYLEX_DEFINE(["abc"])[
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
int int
main (void) main (void)

View File

@@ -296,8 +296,11 @@ $2])
# AT_YYLEX_PROTOTYPE # AT_YYLEX_PROTOTYPE
# AT_YYLEX_DECLARE_EXTERN # AT_YYLEX_DECLARE_EXTERN
# AT_YYLEX_DECLARE # AT_YYLEX_DECLARE
# AT_YYLEX_DEFINE(INPUT-STRING, [ACTION]) # AT_YYLEX_DEFINE([INPUT], [ACTION])
# --------------------------------------- # ----------------------------------
# INPUT can be empty, or in double quotes, or a list (in braces).
# ACTION may compute yylval for instance, using "res" as token type,
# and "toknum" as the number of calls to yylex (starting at 0).
m4_define([AT_YYLEX_PROTOTYPE], m4_define([AT_YYLEX_PROTOTYPE],
[int AT_NAME_PREFIX[]lex (]AT_YYLEX_FORMALS[)[]dnl [int AT_NAME_PREFIX[]lex (]AT_YYLEX_FORMALS[)[]dnl
]) ])
@@ -315,7 +318,9 @@ m4_define([AT_YYLEX_DEFINE],
static static
]AT_YYLEX_PROTOTYPE[ ]AT_YYLEX_PROTOTYPE[
{ {
static char const input[] = "$1"; ]m4_bmatch([$1], [^\(".*"\)?$],
[[static char const input[] = ]m4_default([$1], [""])],
[[static int const input[] = ]$1])[;
static size_t toknum = 0; static size_t toknum = 0;
int res; int res;
]AT_USE_LEX_ARGS[; ]AT_USE_LEX_ARGS[;

View File

@@ -101,7 +101,7 @@ start: ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]m4_if([$1], [[both]], [AT_YYLEX_DEFINE([])])[ ]m4_if([$1], [[both]], [AT_YYLEX_DEFINE])[
int int
main (void) main (void)

View File

@@ -463,15 +463,7 @@ AT_DATA_GRAMMAR([input.y],
exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"; exp: "a" "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!";
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([{ SPECIAL }])[
int
yylex (void)
{
static int called;
if (called++)
abort ();
return SPECIAL;
}
int int
main (void) main (void)
@@ -837,13 +829,11 @@ AT_CLEANUP
# so that possible bound checking compilers could check all the skeletons. # so that possible bound checking compilers could check all the skeletons.
m4_define([_AT_DATA_DANCER_Y], m4_define([_AT_DATA_DANCER_Y],
[AT_DATA_GRAMMAR([dancer.y], [AT_DATA_GRAMMAR([dancer.y],
[%{ [[%code provides
static int yylex (AT_LALR1_CC_IF([int *], [void])); {
AT_LALR1_CC_IF([#include <cstdlib>], ]AT_YYERROR_DECLARE[
[#include <stdlib.h> ]AT_YYLEX_DECLARE[
#include <stdio.h> }
]AT_YYERROR_DECLARE[])
%}
$1 $1
%token ARROW INVALID NUMBER STRING DATA %token ARROW INVALID NUMBER STRING DATA
%defines %defines
@@ -888,7 +878,8 @@ member: STRING
| INVALID | INVALID
; ;
%% %%
AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([":"])[
]AT_LALR1_CC_IF( ]AT_LALR1_CC_IF(
[int [int
yyparse () yyparse ()
@@ -899,28 +890,14 @@ yyparse ()
#endif #endif
return parser.parse (); return parser.parse ();
} }
]) ])[
#include <assert.h>
static int
yylex (AT_LALR1_CC_IF([int *lval], [void]))
[{
static int const tokens[] =
{
':', -1
};
static size_t toknum;
]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[
assert (toknum < sizeof tokens / sizeof *tokens);
return tokens[toknum++];
}]
int int
main (void) main (void)
{ {
return yyparse (); return yyparse ();
} }
]) ]])
])# _AT_DATA_DANCER_Y ])# _AT_DATA_DANCER_Y
@@ -1062,13 +1039,8 @@ start:
%printer { fprintf (yyoutput, "PRINTER"); } 'a'; %printer { fprintf (yyoutput, "PRINTER"); } 'a';
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
static int ]AT_YYLEX_DEFINE(["a"])[
yylex (void)
{
return 'a';
}
int int
main (void) main (void)
@@ -1201,13 +1173,7 @@ sr_conflict:
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
int ]AT_YYLEX_DEFINE([{ 1, 2, 3, 0 }])[
yylex (void)
{
static int const input[] = { 1, 2, 3, 0 };
static int const *inputp = input;
return *inputp++;
}
int int
main (void) main (void)
@@ -1304,7 +1270,7 @@ syntax_error:
/* Induce two syntax error messages (which requires full error /* Induce two syntax error messages (which requires full error
recovery by shifting 3 tokens) in order to detect any loss of the recovery by shifting 3 tokens) in order to detect any loss of the
reallocated buffer. */ reallocated buffer. */
]AT_YYLEX_DEFINE([abc])[ ]AT_YYLEX_DEFINE(["abc"])[
int int
main (void) main (void)
{ {
@@ -1412,7 +1378,7 @@ syntax_error2:
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
/* Induce two syntax error messages (which requires full error /* Induce two syntax error messages (which requires full error
recovery by shifting 3 tokens). */ recovery by shifting 3 tokens). */
]AT_YYLEX_DEFINE([abc])[ ]AT_YYLEX_DEFINE(["abc"])[
int int
main (void) main (void)
{ {
@@ -1562,7 +1528,7 @@ A: /*empty*/ | 'a' ;
%% %%
]AT_YYERROR_DEFINE[ ]AT_YYERROR_DEFINE[
]AT_YYLEX_DEFINE([$1])[ ]AT_YYLEX_DEFINE(["$1"])[
int int
main (void) main (void)
{ {