]> git.saurik.com Git - bison.git/commitdiff
Enable push parsers to operate in impure mode. Thus, %push-parser no
authorJoel E. Denny <jdenny@ces.clemson.edu>
Mon, 25 Dec 2006 17:25:39 +0000 (17:25 +0000)
committerJoel E. Denny <jdenny@ces.clemson.edu>
Mon, 25 Dec 2006 17:25:39 +0000 (17:25 +0000)
longer implies %pure-parser.  The point of this change is to move
towards being able to test the push parser code by running the entire
test suite as if %push-parser had been declared.
* data/push.c (yypush_parse): For impure mode, remove the
yypushed_char, yypushed_val, and yypushed_loc arguments.
Instead, declare these as local variables initialized to the global
yychar, yylval, and yylloc.
For the first yypush_parse invocation only, restore the initial values
of these global variables when it's time to read a token since they
have been overwritten.
* src/parse-gram.y (prologue_declaration): Don't set pure_parser for
%push-parser.
* tests/calc.at (Simple LALR(1) Calculator): Always declare
%pure-parser along with %push-parser since this test case was designed
for pure push parsers.
* tests/local.at (AT_PURE_OR_PUSH_IF): Remove unused.
(AT_YACC_OR_PUSH_IF): New.
(AT_YYERROR_SEES_LOC_IF): Fix enough that the test suite passes, but
add a note that it's still wrong for some cases (as it has been for a
while).
(AT_PURE_LEX_IF): Use AT_PURE_IF instead of AT_PURE_OR_PUSH_IF since
%push-parser no longer implies %pure-parser.

ChangeLog
data/push.c
src/parse-gram.c
src/parse-gram.h
src/parse-gram.y
tests/calc.at
tests/local.at

index 6f6db4bcf1e1045ddcd01a064b81acb2043d03e2..41bbbfed0adf88365a0f5db3b62b8af231596768 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2006-12-25  Joel E. Denny  <jdenny@ces.clemson.edu>
+
+       Enable push parsers to operate in impure mode.  Thus, %push-parser no
+       longer implies %pure-parser.  The point of this change is to move
+       towards being able to test the push parser code by running the entire
+       test suite as if %push-parser had been declared.
+       * data/push.c (yypush_parse): For impure mode, remove the
+       yypushed_char, yypushed_val, and yypushed_loc arguments.
+       Instead, declare these as local variables initialized to the global
+       yychar, yylval, and yylloc.
+       For the first yypush_parse invocation only, restore the initial values
+       of these global variables when it's time to read a token since they
+       have been overwritten.
+       * src/parse-gram.y (prologue_declaration): Don't set pure_parser for
+       %push-parser.
+       * tests/calc.at (Simple LALR(1) Calculator): Always declare
+       %pure-parser along with %push-parser since this test case was designed
+       for pure push parsers.
+       * tests/local.at (AT_PURE_OR_PUSH_IF): Remove unused.
+       (AT_YACC_OR_PUSH_IF): New.
+       (AT_YYERROR_SEES_LOC_IF): Fix enough that the test suite passes, but
+       add a note that it's still wrong for some cases (as it has been for a
+       while).
+       (AT_PURE_LEX_IF): Use AT_PURE_IF instead of AT_PURE_OR_PUSH_IF since
+       %push-parser no longer implies %pure-parser.
+
 2006-12-20  Joel E. Denny  <jdenny@ces.clemson.edu>
 
        Remove some unnecessary differences between the pull parser code and
index 47962d3ca42efd94d1356810249144b33e524ca7..958d596d8ab4cb0aa48c594377bdb630f103fc2e 100644 (file)
@@ -226,10 +226,10 @@ enum { YYPUSH_MORE = 4 };
 b4_c_function_decl([[yypstate_delete]], [[void]],
                    [[[yypstate *yyps]], [[yyps]]])
 b4_c_function_decl([[yypush_parse]], [[int]],
-  [[[yypstate *yyps]], [[yyps]]],
+  [[[yypstate *yyps]], [[yyps]]]b4_pure_if([,
   [[[int yypushed_char]], [[yypushed_char]]],
   [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
-  [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])m4_ifset([b4_parse_param], [,
+  [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [,
   b4_parse_param]))[
 #endif
 ]])
@@ -1106,10 +1106,11 @@ b4_push_if(
 `-------------------------*/
 
 ]b4_push_if([
-b4_c_function_def([[yypush_parse]], [[int]], [[[yypstate *yyps]], [[yyps]]], 
+b4_c_function_def([[yypush_parse]], [[int]],
+  [[[yypstate *yyps]], [[yyps]]]b4_pure_if([,
   [[[int yypushed_char]], [[yypushed_char]]],
   [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
-  [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])m4_ifset([b4_parse_param], [,
+  [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [,
   b4_parse_param]))], [
 #ifdef YYPARSE_PARAM
 b4_c_function_def([yyparse], [int], [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])
@@ -1118,7 +1119,11 @@ b4_c_function_def([yyparse], [int], b4_parse_param)
 #endif])[
 {
   ]b4_pure_if([b4_declare_scanner_communication_variables])
-  b4_push_if([], [b4_declare_parser_state_variables])[
+  b4_push_if([b4_pure_if([], [[  int yypushed_char = yychar;
+  YYSTYPE yypushed_val = yylval;
+  ]b4_locations_if([[YYLTYPE yypushed_loc = yylloc;
+]])])],
+  [b4_declare_parser_state_variables])[
 
 #if YYERROR_VERBOSE
   /* Buffer for error messages, and its allocated size.  */
@@ -1286,14 +1291,22 @@ yybackup:
           goto yypushreturn;
         }
       yyps->yynew = 0;
-
+]b4_pure_if([], [[
+      /* Restoring the pushed token is only necessary for the first
+         yypush_parse invocation since subsequent invocations don't overwrite
+         it before jumping to yyread_pushed_token.  */
+      yychar = yypushed_char;
+      yylval = yypushed_val;
+      ]b4_locations_if([[yylloc = yypushed_loc;
+]])])[
 yyread_pushed_token:
 ]])[      YYDPRINTF ((stderr, "Reading a token: "));
-]b4_push_if([[      yychar = yypushed_char;
+]b4_push_if([b4_pure_if([[      yychar = yypushed_char;
       if (yypushed_val)
         yylval = *yypushed_val;
 ]b4_locations_if([[      if (yypushed_loc)
-        yylloc = *yypushed_loc;]])],
+        yylloc = *yypushed_loc;
+]])])],
 [[      yychar = YYLEX;
 ]])[    }
 
@@ -1643,10 +1656,10 @@ enum { YYPUSH_MORE = 4 };
 b4_c_function_decl([b4_prefix[pstate_delete]], [[void]],
                    [[b4_prefix[pstate *yyps]], [[yyps]]])
 b4_c_function_decl([b4_prefix[push_parse]], [[int]],
-  [[b4_prefix[pstate *yyps]], [[yyps]]],
+  [[b4_prefix[pstate *yyps]], [[yyps]]]b4_pure_if([,
   [[[int yypushed_char]], [[yypushed_char]]],
   [[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
-  [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])m4_ifset([b4_parse_param], [,
+  [[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [,
   b4_parse_param]))[
 #endif
 ]])
index 8950d9d5a90bdd85645722607db80b8a46545681..acdfa1202efac22cab9d2515e5954ec3872b3365 100644 (file)
@@ -308,7 +308,7 @@ static int current_prec = 0;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-/* Line 191 of yacc.c  */
+/* Line 198 of yacc.c  */
 #line 97 "parse-gram.y"
 
   symbol *symbol;
@@ -321,7 +321,7 @@ typedef union YYSTYPE
   unsigned char character;
 }
 
-/* Line 191 of yacc.c  */
+/* Line 198 of yacc.c  */
 #line 326 "parse-gram.c"
        YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
@@ -1698,7 +1698,7 @@ YYLTYPE yylloc;
 
   /* User initialization code.  */
   
-/* Line 1076 of yacc.c  */
+/* Line 1082 of yacc.c  */
 #line 89 "parse-gram.y"
 {
   /* Bison's grammar can initial empty locations, hence a default
@@ -1707,7 +1707,7 @@ YYLTYPE yylloc;
   boundary_set (&yylloc.end, current_file, 1, 1);
 }
 
-/* Line 1076 of yacc.c  */
+/* Line 1082 of yacc.c  */
 #line 1712 "parse-gram.c"
   yylsp[0] = yylloc;
   goto yysetstate;
@@ -2064,7 +2064,7 @@ yyreduce:
 
 /* Line 1269 of yacc.c  */
 #line 260 "parse-gram.y"
-    { push_parser = true; pure_parser = true; }
+    { push_parser = true; }
     break;
 
   case 30:
index d55903ac93e59690882c1a4027d604e7484c042c..7e9b7bf999113d6c062e2bdcea6a3315b1fa457c 100644 (file)
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-/* Line 1487 of yacc.c  */
+/* Line 1535 of yacc.c  */
 #line 97 "parse-gram.y"
 
   symbol *symbol;
@@ -181,7 +181,7 @@ typedef union YYSTYPE
   unsigned char character;
 }
 
-/* Line 1487 of yacc.c  */
+/* Line 1535 of yacc.c  */
 #line 186 "parse-gram.h"
        YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
index 7680f462a1b4814207fe9b22ff4ee90c6da8a3c2..ba0ef6f936801768919467b98309bc7efaf8b605 100644 (file)
@@ -257,7 +257,7 @@ prologue_declaration:
 | "%output" "=" STRING          { spec_outfile = $3; }  /* deprecated */
 | "%parse-param" "{...}"       { add_param ("parse_param", $2, @2); }
 | "%pure-parser"                { pure_parser = true; }
-| "%push-parser"                { push_parser = true; pure_parser = true; }
+| "%push-parser"                { push_parser = true; }
 | "%require" STRING             { version_check (&@2, $2); }
 | "%skeleton" STRING            { skeleton_arg ($2, 1, &@1); }
 | "%token-table"                { token_table_flag = true; }
index 64aac6cd0096be14e14e40cc1b521b0e2d0b15bb..2089cd8ec742674096b814f011b6b4c6561f846b 100644 (file)
@@ -572,7 +572,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 %locations %skeleton "push.c"])
+AT_CHECK_CALC_LALR([%push-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])
@@ -581,7 +581,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 %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %skeleton "push.c"])
+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([%pure-parser %error-verbose %debug %locations %defines %name-prefix "calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}])
 
index 3497c15d977d2a2e3e6cc81e67b92a3f2bb233a7..c0f3049d5dc8623bf2efe7201c916d04d32b020f 100644 (file)
@@ -60,8 +60,8 @@ 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_pushdef([AT_PURE_OR_PUSH_IF],
-[m4_bmatch([$3], [%pure-parser\|%push-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],
 [m4_bmatch([$3], [%locations.*%pure-parser\|%pure-parser.*%locations],
           [$1], [$2])])
@@ -76,17 +76,17 @@ m4_pushdef([AT_YYERROR_ARG_LOC_IF],
 [AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])],
                    [$2])])
 # yyerror always sees the locations (when activated), except if
-# push or (yacc & pure & !param).
+# (yacc & pure & !param).  FIXME: This is wrong.  See the manual.
 m4_pushdef([AT_YYERROR_SEES_LOC_IF],
-[AT_PUSH_IF([$2],[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])],
-                                       [$1])],
-                           [$1])],
-               [$2])])])
+[AT_LOCATION_IF([AT_YACC_OR_PUSH_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])],
+                                               [$1])],
+                                   [$1])],
+               [$2])])
 
 # The interface is pure: either because %pure-parser, or because we
 # are using the C++ parsers.
 m4_pushdef([AT_PURE_LEX_IF],
-[AT_PURE_OR_PUSH_IF([$1],
+[AT_PURE_IF([$1],
            [AT_SKEL_CC_IF([$1], [$2])])])
 
 AT_PURE_LEX_IF(