bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/3] yacc.c: support "%define api.pure full"


From: Theophile Ranquet
Subject: [PATCH 2/3] yacc.c: support "%define api.pure full"
Date: Wed, 28 Nov 2012 10:30:54 +0100

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_error_pureloc_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.
---
 data/yacc.c      | 38 +++++++++++++++++++++++++-------------
 tests/actions.at | 17 +++++++++--------
 tests/calc.at    |  8 ++++----
 tests/local.at   |  2 ++
 4 files changed, 40 insertions(+), 25 deletions(-)

diff --git a/data/yacc.c b/data/yacc.c
index bbc9d91..52386c5 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_error_pureloc_if(ARG)
+# ------------------------
+# Expand ARG iff yyerror is to be given a location as argument.
+m4_define([b4_error_pureloc_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_error_pureloc_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 78977c8..e6df755 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 <stdio.h>
@@ -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],
 ]],
 [@&address@hidden)
 
-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 4ab725b..f72836e 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 b7cefaa..48afab8 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
-- 
1.8.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]