From: Akim Demaille Date: Sun, 17 Jun 2012 16:52:59 +0000 (+0200) Subject: tests: support api.prefix. X-Git-Tag: v2.6~66 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/71c7e24f2e0190ea22e0ada09e7dafc3f37579cd tests: support api.prefix. * tests/local.at (AT_BISON_OPTION_PUSHDEFS, AT_BISON_OPTION_POPDEFS): Define AT_API_PREFIX. (AT_YYERROR_DEFINE, AT_YYERROR_DECLARE_EXTERN, AT_YYLEX_DECLARE_EXTERN) (AT_YYLEX_DEFINE): Use it. * tests/input.at, tests/regression.at, tests/torture.at: Add AT_BISON_OPTION_PUSHDEFS/POPDEFS. --- diff --git a/tests/input.at b/tests/input.at index 88498556..2f667d0a 100644 --- a/tests/input.at +++ b/tests/input.at @@ -391,7 +391,7 @@ AT_CLEANUP AT_SETUP([Torturing the Scanner]) - +AT_BISON_OPTION_PUSHDEFS AT_DATA([input.y], []) AT_BISON_CHECK([input.y], [1], [], [[input.y:1.1: syntax error, unexpected end of file @@ -501,7 +501,7 @@ value_as_yystype (value val) res.ival = val; return res; } - +]AT_YYERROR_DEFINE[ static int yylex (void) { @@ -514,15 +514,9 @@ yylex (void) yylval = value_as_yystype (input[toknum]); return input[toknum++]; } - -static void -yyerror (const char *msg) -{ - fprintf (stderr, "%s\n", msg); -} ]]) -# Pacify Emacs'font-lock-mode: " +# Pacify Emacs' font-lock-mode: " AT_DATA([main.c], [[typedef int value; @@ -536,6 +530,7 @@ main (void) return yyparse (); } ]]) +AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-d -v -o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) diff --git a/tests/local.at b/tests/local.at index e6227617..6d3ff18f 100644 --- a/tests/local.at +++ b/tests/local.at @@ -137,6 +137,10 @@ m4_pushdef([AT_NAME_PREFIX], [m4_bmatch([$3], [%name-prefix ".*"], [m4_bregexp([$3], [name-prefix "\([^""]*\)"], [\1])], [yy])]) +m4_pushdef([AT_API_PREFIX], +[m4_bmatch([$3], [%define api\.prefix ".*"], + [m4_bregexp([$3], [%define api\.prefix "\([^""]*\)"], [\1])], + [yy])]) # yyerror receives the location if %location & %pure & (%glr or %parse-param). m4_pushdef([AT_YYERROR_ARG_LOC_IF], [AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])], @@ -202,6 +206,7 @@ m4_popdef([AT_LOC]) m4_popdef([AT_PURE_LEX_IF]) m4_popdef([AT_YYERROR_SEES_LOC_IF]) m4_popdef([AT_YYERROR_ARG_LOC_IF]) +m4_popdef([AT_API_PREFIX]) m4_popdef([AT_NAME_PREFIX]) m4_popdef([AT_GLR_OR_PARAM_IF]) m4_popdef([AT_PURE_AND_LOC_IF]) @@ -272,7 +277,7 @@ $2]) # AT_YYLEX_DEFINE(INPUT-STRING, [ACTION]) # --------------------------------------- m4_define([AT_YYLEX_DECLARE_EXTERN], -[int yylex (void);dnl +[int AT_API_PREFIX[]lex (void);dnl ]) m4_define([AT_YYLEX_DECLARE], @@ -282,7 +287,7 @@ m4_define([AT_YYLEX_DECLARE], m4_define([AT_YYLEX_DEFINE], [[#include /* abort */ static int -yylex (void) +]AT_API_PREFIX[lex (void) { static char const input[] = "$1"; static size_t toknum = 0; @@ -291,8 +296,8 @@ yylex (void) abort (); res = input[toknum++]; ]$2;[]AT_LOCATION_IF([[ - yylloc.first_line = yylloc.last_line = 1; - yylloc.first_column = yylloc.last_column = toknum;]])[ + ]AT_API_PREFIX[lloc.first_line = ]AT_API_PREFIX[lloc.last_line = 1; + ]AT_API_PREFIX[lloc.first_column = ]AT_API_PREFIX[lloc.last_column = toknum;]])[ return res; }]dnl ]) @@ -304,7 +309,7 @@ yylex (void) # Beware that must be called inside a AT_BISON_OPTION_PUSHDEFS/POPDEFS # pair. m4_define([AT_YYERROR_DECLARE_EXTERN], -[void yyerror (const char *msg);dnl +[void AT_API_PREFIX[]error (const char *msg);dnl ]) m4_define([AT_YYERROR_DECLARE], @@ -312,19 +317,16 @@ m4_define([AT_YYERROR_DECLARE], ]) m4_define([AT_YYERROR_DEFINE], -[AT_SKEL_JAVA_IF([[ -public void yyerror (String msg) +[AT_SKEL_JAVA_IF([[public void yyerror (String msg) { System.err.println (msg); -}]], [AT_SKEL_CC_IF([[ -void +}]], [AT_SKEL_CC_IF([[void yy::parser::error (const yy::location &, std::string const &msg) { std::cerr << msg << std::endl; -}]], [[ -#include +}]], [[#include static void -yyerror (char const *msg) +]AT_API_PREFIX[error (char const *msg) { fprintf (stderr, "%s\n", msg); }]])])dnl diff --git a/tests/regression.at b/tests/regression.at index e93b901e..fa93833c 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -24,6 +24,7 @@ AT_BANNER([[Regression tests.]]) AT_SETUP([Trivial grammars]) +AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([input.y], [[%{ ]AT_YYERROR_DECLARE_EXTERN[ @@ -37,6 +38,7 @@ AT_DATA_GRAMMAR([input.y], program: 'x'; ]]) +AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) @@ -52,6 +54,7 @@ AT_CLEANUP AT_SETUP([YYSTYPE typedef]) +AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([input.y], [[%{ ]AT_YYERROR_DECLARE_EXTERN[ @@ -65,6 +68,7 @@ typedef union { char const *val; } YYSTYPE; program: { $$ = ""; }; ]]) +AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) @@ -83,6 +87,7 @@ AT_SETUP([Early token definitions with --yacc]) # Found in GCJ: they expect the tokens to be defined before the user # prologue, so that they can use the token definitions in it. +AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([input.y], [[%{ ]AT_YYERROR_DECLARE_EXTERN[ @@ -103,6 +108,7 @@ AT_DATA_GRAMMAR([input.y], exp: MY_TOKEN; %% ]]) +AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-y -o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) @@ -121,6 +127,7 @@ AT_SETUP([Early token definitions without --yacc]) # Found in GCJ: they expect the tokens to be defined before the user # prologue, so that they can use the token definitions in it. +AT_BISON_OPTION_PUSHDEFS AT_DATA_GRAMMAR([input.y], [[%{ #include @@ -146,6 +153,7 @@ print_my_token (void) exp: MY_TOKEN; %% ]]) +AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-o input.c input.y]) AT_COMPILE([input.o], [-c input.c]) @@ -161,6 +169,7 @@ AT_CLEANUP AT_SETUP([Braces parsing]) +AT_BISON_OPTION_PUSHDEFS AT_DATA([input.y], [[/* Bison used to swallow the character after '}'. */ @@ -168,6 +177,7 @@ AT_DATA([input.y], exp: { tests = {{{{{{{{{{}}}}}}}}}}; }; %% ]]) +AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-v -o input.c input.y]) @@ -183,6 +193,7 @@ AT_CLEANUP AT_SETUP([Duplicate string]) +AT_BISON_OPTION_PUSHDEFS AT_DATA([input.y], [[/* 'Bison -v' used to dump core when two tokens are defined with the same string, as LE and GE below. */ @@ -195,6 +206,7 @@ AT_DATA([input.y], exp: '(' exp ')' | NUM ; %% ]]) +AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-v -o input.c input.y], 0, [], [[input.y:6.8-14: warning: symbol "<=" used more than once as a literal string @@ -211,6 +223,7 @@ AT_SETUP([Rule Line Numbers]) AT_KEYWORDS([report]) +AT_BISON_OPTION_PUSHDEFS AT_DATA([input.y], [[%% expr: @@ -240,6 +253,7 @@ expr: }; ]]) +AT_BISON_OPTION_POPDEFS AT_BISON_CHECK([-o input.c -v input.y]) @@ -428,6 +442,7 @@ AT_CLEANUP AT_SETUP([Token definitions]) +AT_BISON_OPTION_PUSHDEFS # Bison managed, when fed with '%token 'f' "f"' to #define 'f'! AT_DATA_GRAMMAR([input.y], [%{ @@ -468,6 +483,7 @@ main (void) return yyparse (); } ]]) +AT_BISON_OPTION_POPDEFS # Checking the warning message guarantees that the trigraph "??!" isn't # unnecessarily escaped here even though it would need to be if encoded in a @@ -962,12 +978,12 @@ AT_CHECK_DANCER([%skeleton "lalr1.cc"]) # -------------------------------- m4_define([_AT_DATA_EXPECT2_Y], [AT_DATA_GRAMMAR([expect2.y], -[%{ -static int yylex (AT_LALR1_CC_IF([int *], [void])); +[[%{ +static int yylex (]AT_LALR1_CC_IF([int *], [void])); AT_LALR1_CC_IF([], -[#include +[[#include #include -]AT_YYERROR_DECLARE[]) +]AT_YYERROR_DECLARE])[ %} $1 %defines @@ -984,30 +1000,19 @@ e: e '+' t | t; t: A | B; %% -AT_LALR1_CC_IF( -[/* A C++ error reporting function. */ -void -yy::parser::error (const location&, const std::string& m) -{ - std::cerr << m << std::endl; -} - -int +]AT_YYERROR_DEFINE[ +]AT_LALR1_CC_IF( +[int yyparse () { yy::parser parser; return parser.parse (); } -], -[static void -yyerror (const char *s) -{ - fprintf (stderr, "%s\n", s); -}]) +])[ static int -yylex (AT_LALR1_CC_IF([int *lval], [void])) -[{ +yylex (]AT_LALR1_CC_IF([int *lval], [void])[) +{ static int const tokens[] = { 1000, '+', '+', -1 @@ -1017,19 +1022,19 @@ yylex (AT_LALR1_CC_IF([int *lval], [void])) if (! (toknum < sizeof tokens / sizeof *tokens)) abort (); return tokens[toknum++]; -}] +} int main (void) { return yyparse (); } -]) +]]) ])# _AT_DATA_EXPECT2_Y # AT_CHECK_EXPECT2(BISON-OPTIONS) -# ------------------------------ +# ------------------------------- # Generate the grammar, compile it, run it. m4_define([AT_CHECK_EXPECT2], [AT_SETUP([Expecting two tokens $1]) diff --git a/tests/torture.at b/tests/torture.at index 3fff08e6..313df345 100644 --- a/tests/torture.at +++ b/tests/torture.at @@ -42,7 +42,8 @@ esac]) # Create FILE-NAME, containing a self checking parser for a huge # triangular grammar. m4_define([AT_DATA_TRIANGULAR_GRAMMAR], -[AT_DATA([[gengram.pl]], +[AT_BISON_OPTION_PUSHDEFS +AT_DATA([[gengram.pl]], [[#! /usr/bin/perl -w use strict; @@ -127,6 +128,7 @@ main (void) } EOF ]]) +AT_BISON_OPTION_POPDEFS AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout]) mv stdout $1 @@ -157,7 +159,8 @@ AT_CLEANUP # Create FILE-NAME, containing a self checking parser for a huge # horizontal grammar. m4_define([AT_DATA_HORIZONTAL_GRAMMAR], -[AT_DATA([[gengram.pl]], +[AT_BISON_OPTION_PUSHDEFS +AT_DATA([[gengram.pl]], [[#! /usr/bin/perl -w use strict; @@ -223,6 +226,7 @@ EOF AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout]) mv stdout $1 +AT_BISON_OPTION_POPDEFS ]) @@ -263,7 +267,8 @@ AT_CLEANUP # Create FILE-NAME, containing a self checking parser for a grammar # requiring SIZE lookahead tokens. m4_define([AT_DATA_LOOKAHEAD_TOKENS_GRAMMAR], -[AT_DATA([[gengram.pl]], +[AT_BISON_OPTION_PUSHDEFS +AT_DATA([[gengram.pl]], [[#! /usr/bin/perl -w use strict; @@ -363,6 +368,7 @@ EOF AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout]) mv stdout $1 +AT_BISON_OPTION_POPDEFS ])