mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
For push mode, convert yyparse from a macro to a function, invoke yylex
instead of passing a yylexp argument to yypull_parse, and don't generate yypull_parse or yyparse unless %push-pull-parser is declared. Discussed starting at <http://lists.gnu.org/archive/html/bison-patches/2006-12/msg00163.html>. * data/bison.m4 (b4_pull_if): New. * data/c.m4 (b4_identification): Define YYPULL similar to YYPUSH. * data/push.c: Improve M4 quoting a little. (b4_generate_macro_args, b4_parenthesize): Remove. (yyparse): If there's a b4_prefix, #define this to b4_prefix[parse] any time a pull parser is requested. Don't #define this as a wrapper around yypull_parse. Instead, when both push and pull are requested, make it a function that does that same thing. (yypull_parse): If there's a b4_prefix, #define this to b4_prefix[pull_parse] when both push and pull are requested. Don't define this as a function unless both push and pull are requested. Remove the yylexp argument and hard-code yylex invocation instead. * etc/bench.pl.in (bench_grammar): Use %push-pull-parser instead of %push-parser. * src/getargs.c (pull_parser): New global initialized to true. * getargs.h (pull_parser): extern it. * src/output.c (prepare): Insert pull_flag muscle. * src/parse-gram.y (PERCENT_PUSH_PULL_PARSER): New token. (prologue_declaration): Set both push_parser and pull_parser = true for %push-pull-parser. Set push_parser = true and pull_parser = false for %push-parser. * src/scan-gram.l: Don't accept %push_parser as an alternative to %push-parser since there's no backward-compatibility concern here. Scan %push-pull-parser. * tests/calc.at (Simple LALR(1) Calculator): Use %push-pull-parser instead of %push-parser. * tests/headers.at (export YYLTYPE): Make yylex static, and don't prototype it in the module that calls yyparse. * tests/input.at (Torturing the Scanner): Likewise. * tests/local.at (AT_PUSH_IF): Check for %push-pull-parser as well.
This commit is contained in:
@@ -562,7 +562,7 @@ AT_CHECK_CALC_LALR([%yacc])
|
||||
AT_CHECK_CALC_LALR([%error-verbose])
|
||||
|
||||
AT_CHECK_CALC_LALR([%pure-parser %locations])
|
||||
AT_CHECK_CALC_LALR([%push-parser %pure-parser %locations %skeleton "push.c"])
|
||||
AT_CHECK_CALC_LALR([%push-pull-parser %pure-parser %locations %skeleton "push.c"])
|
||||
AT_CHECK_CALC_LALR([%error-verbose %locations])
|
||||
|
||||
AT_CHECK_CALC_LALR([%error-verbose %locations %defines %name-prefix "calc" %verbose %yacc])
|
||||
@@ -571,7 +571,7 @@ AT_CHECK_CALC_LALR([%debug])
|
||||
AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
|
||||
|
||||
AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc])
|
||||
AT_CHECK_CALC_LALR([%push-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %skeleton "push.c"])
|
||||
AT_CHECK_CALC_LALR([%push-pull-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %skeleton "push.c"])
|
||||
|
||||
AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
|
||||
|
||||
|
||||
@@ -94,9 +94,7 @@ AT_DATA_GRAMMAR([input.y],
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int my_lex (void);
|
||||
|
||||
int
|
||||
static int
|
||||
my_lex (void)
|
||||
{
|
||||
return EOF;
|
||||
@@ -122,8 +120,6 @@ YYLTYPE *my_llocp = &my_lloc;
|
||||
|
||||
#ifndef YYPUSH_DECLS
|
||||
int my_parse (void);
|
||||
#else
|
||||
int my_lex (void);
|
||||
#endif
|
||||
|
||||
int
|
||||
|
||||
@@ -470,7 +470,7 @@ char quote[] = "@:>@@:>@,";
|
||||
|
||||
%{
|
||||
static void yyerror (const char *s);
|
||||
int yylex (void);
|
||||
static int yylex (void);
|
||||
%}
|
||||
|
||||
%type <ival> '@<:@'
|
||||
@@ -503,7 +503,7 @@ value_as_yystype (value val)
|
||||
return res;
|
||||
}
|
||||
|
||||
int
|
||||
static int
|
||||
yylex (void)
|
||||
{
|
||||
static char const input[] = "@<:@\1\2$@{@oline@__@&t@oline__\
|
||||
@@ -531,8 +531,6 @@ AT_DATA([main.c],
|
||||
|
||||
#ifndef YYPUSH_DECLS
|
||||
int yyparse (void);
|
||||
#else
|
||||
int yylex (void);
|
||||
#endif
|
||||
|
||||
int
|
||||
|
||||
@@ -59,7 +59,7 @@ m4_pushdef([AT_LOCATION_IF],
|
||||
m4_pushdef([AT_PURE_IF],
|
||||
[m4_bmatch([$3], [%pure-parser], [$1], [$2])])
|
||||
m4_pushdef([AT_PUSH_IF],
|
||||
[m4_bmatch([$3], [%push-parser], [$1], [$2])])
|
||||
[m4_bmatch([$3], [%push-parser\|%push-pull-parser], [$1], [$2])])
|
||||
m4_pushdef([AT_YACC_OR_PUSH_IF],
|
||||
[AT_YACC_IF([$1], [AT_PUSH_IF([$1], [$2])])])
|
||||
m4_pushdef([AT_PURE_AND_LOC_IF],
|
||||
|
||||
Reference in New Issue
Block a user