From: Theophile Ranquet Date: Fri, 23 Nov 2012 17:30:47 +0000 (+0000) Subject: yacc.c: support "%define api.pure full" X-Git-Tag: v2.6.90~31 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/6428a8a4a569b0b7ac1b84bdd78efc3fe18160ca yacc.c: support "%define api.pure full" This makes the interface for yyerror() pure without the need for a spurious parse_param. * data/yacc.c (b4_pure_if, b4_pure_flag): New definition, accept three states. (b4_yacc_pure_if): Rename as... (b4_yyerror_arg_loc_if): This, and use b4_pure_flag. * tests/actions.at (%define api.pure): Modernize. * test/calc.at (Simple LALR Calculator): Modernize. * tests/local.at (AT_YYERROR_ARG_LOC_IF): Adjust. --- diff --git a/data/yacc.c b/data/yacc.c index bbc9d915..0f315523 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -65,24 +65,36 @@ m4_define_default([b4_stack_depth_init], [200]) ## ------------------------ ## b4_percent_define_default([[api.pure]], [[false]]) -b4_define_flag_if([pure]) -m4_define([b4_pure_flag], - [b4_percent_define_flag_if([[api.pure]], [[1]], [[0]])]) - -# b4_yacc_pure_if(IF-TRUE, IF-FALSE) -# ---------------------------------- -# Expand IF-TRUE, if %pure-parser and %parse-param, IF-FALSE otherwise. -m4_define([b4_yacc_pure_if], -[b4_pure_if([m4_ifset([b4_parse_param], - [$1], [$2])], - [$2])]) - +b4_percent_define_check_values([[[[api.pure]], + [[false]], [[true]], [[]], [[full]]]]) + +m4_define([b4_pure_flag], [[0]]) +m4_case(b4_percent_define_get([[api.pure]]), + [false], [m4_define([b4_pure_flag], [[0]])], + [true], [m4_define([b4_pure_flag], [[1]])], + [], [m4_define([b4_pure_flag], [[1]])], + [full], [m4_define([b4_pure_flag], [[2]])]) + +m4_define([b4_pure_if], +[m4_case(b4_pure_flag, + [0], [$2], + [1], [$1], + [2], [$1])]) + [m4_fatal([invalid api.pure value: ]$1)])]) + +# b4_yyerror_arg_loc_if(ARG) +# -------------------------- +# Expand ARG iff yyerror is to be given a location as argument. +m4_define([b4_yyerror_arg_loc_if], +[b4_locations_if([m4_case(b4_pure_flag, + [1], [m4_ifset([b4_parse_param], [$1])], + [2], [$1])])]) # b4_yyerror_args # --------------- # Arguments passed to yyerror: user args plus yylloc. m4_define([b4_yyerror_args], -[b4_yacc_pure_if([b4_locations_if([&yylloc, ])])dnl +[b4_yyerror_arg_loc_if([&yylloc, ])dnl m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) diff --git a/tests/actions.at b/tests/actions.at index 78977c86..e6df7551 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -79,7 +79,7 @@ AT_CLEANUP m4_pushdef([AT_TEST], [AT_SETUP([Initial location: $1 $2]) -AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1" $2 %parse-param { int x }]) +AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1" $2]) AT_DATA_GRAMMAR([[input.y]], [[%defines /* FIXME: Required by lalr1.cc in Bison 2.6. */ %locations @@ -87,7 +87,6 @@ AT_DATA_GRAMMAR([[input.y]], %skeleton "$1" ]$2[ ]$3[ -%parse-param { int x } // Useless, but used to force yyerror purity. %code { # include @@ -113,11 +112,11 @@ exp: { ]AT_SKEL_CC_IF([[std::cerr << @$ << std::endl]], int main (void) {]AT_SKEL_CC_IF([[ - yy::parser p (0); + yy::parser p; p.set_debug_level (!!getenv("YYDEBUG")); return p.parse ();]], [[ yydebug = !!getenv("YYDEBUG"); - return !!yyparse (0);]])[ + return !!yyparse (]AT_PARAM_IF([0])[);]])[ } ]]) @@ -132,10 +131,12 @@ AT_CLEANUP ## FIXME: test Java, and iterate over skeletons. AT_TEST([yacc.c]) -AT_TEST([yacc.c], [%define api.pure]) +AT_TEST([yacc.c], [%define api.pure full]) +AT_TEST([yacc.c], [%define api.pure %parse-param { int x }]) AT_TEST([yacc.c], [%define api.push-pull both]) -AT_TEST([yacc.c], [%define api.push-pull both %define api.pure]) +AT_TEST([yacc.c], [%define api.push-pull both %define api.pure full]) AT_TEST([glr.c]) +AT_TEST([glr.c], [%define api.pure]) AT_TEST([lalr1.cc]) AT_TEST([glr.cc]) @@ -146,7 +147,7 @@ AT_TEST([glr.cc]) ## Weirdly enough, to trigger the warning with GCC 4.7, we must not ## use fprintf, so run the test twice: once to check the warning ## (absence thereof), and another time to check the value. -AT_TEST([yacc.c], [%define api.pure], +AT_TEST([yacc.c], [%define api.pure full], [[%{ # define YYLTYPE int # define YY_LOCATION_PRINT(Stream, Loc) \ @@ -157,7 +158,7 @@ AT_TEST([yacc.c], [%define api.pure], ]], [@&t@]) -AT_TEST([yacc.c], [%define api.pure], +AT_TEST([yacc.c], [%define api.pure full], [[%{ # define YYLTYPE int # define YY_LOCATION_PRINT(Stream, Loc) \ diff --git a/tests/calc.at b/tests/calc.at index 4ab725b3..f72836ee 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -604,8 +604,8 @@ AT_CHECK_CALC_LALR([%verbose]) AT_CHECK_CALC_LALR([%yacc]) AT_CHECK_CALC_LALR([%error-verbose]) -AT_CHECK_CALC_LALR([%define api.pure %locations]) -AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure %locations]) +AT_CHECK_CALC_LALR([%define api.pure full %locations]) +AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure full %locations]) AT_CHECK_CALC_LALR([%error-verbose %locations]) AT_CHECK_CALC_LALR([%error-verbose %locations %defines %name-prefix "calc" %verbose %yacc]) @@ -615,8 +615,8 @@ AT_CHECK_CALC_LALR([%debug]) AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc]) AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %define api.prefix "calc" %verbose %yacc]) -AT_CHECK_CALC_LALR([%define api.pure %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc]) -AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure %error-verbose %debug %locations %defines %define api.prefix "calc" %verbose %yacc]) +AT_CHECK_CALC_LALR([%define api.pure full %verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc]) +AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure full %verbose %debug %locations %defines %define api.prefix "calc" %verbose %yacc]) AT_CHECK_CALC_LALR([%define api.pure %error-verbose %debug %locations %defines %define api.prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}]) diff --git a/tests/local.at b/tests/local.at index b7cefaaf..48afab83 100644 --- a/tests/local.at +++ b/tests/local.at @@ -168,6 +168,7 @@ m4_pushdef([AT_API_PREFIX], m4_pushdef([AT_YYERROR_ARG_LOC_IF], [AT_LOCATION_IF([AT_PURE_IF([m4_bmatch([$3], m4_quote(m4_join([\|], + [%define api.pure "?full"?], [%glr-parser], [%parse-param], [%skeleton "?glr.c"?])), @@ -355,6 +356,7 @@ static }]dnl ]) +# AT_YYERROR_FORMALS # AT_YYERROR_PROTOTYPE # AT_YYERROR_DECLARE_EXTERN # AT_YYERROR_DECLARE