[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Values from immediately preceding action blocks are no longer availa
From: |
Paul Eggert |
Subject: |
Re: Values from immediately preceding action blocks are no longer available in bison 1.50 |
Date: |
Sun, 13 Oct 2002 02:07:57 -0700 (PDT) |
> From: address@hidden
> Date: Fri, 11 Oct 2002 16:04:22 +0200 (MET DST)
> In bison 1.50 the following construct is no longer accepted:
> nonterm: TERMINAL
> { $<field>$ = val; }
> { code using $<field>2; }
> more non terminals
> ;
Thanks for your bug report. I installed the following patch, which
should appear in the next Bison version.
2002-10-13 Paul Eggert <address@hidden>
Fix problem reported by Henrik Grubbstroem in
<http://mail.gnu.org/pipermail/bug-bison/2002-October/001670.html>:
"nonterm: { $$ = 123; } { $$ = $1; };" was wrongly rejected,
because the Bison parser reads the second action before reducing
the first one.
* src/scan-gram.l (rule_length): New static var.
Use it to keep track of the rule length in the scanner, since
we can't expect the parser to be in lock-step sync with the scanner.
(handle_action_dollar, handle_action_at): Use this var.
* tests/actions.at (Exotic Dollars): Test for the problem.
Index: src/scan-gram.l
===================================================================
RCS file: /cvsroot/bison/bison/src/scan-gram.l,v
retrieving revision 1.25
diff -p -u -r1.25 scan-gram.l
--- src/scan-gram.l 11 Oct 2002 11:23:19 -0000 1.25
+++ src/scan-gram.l 13 Oct 2002 08:33:05 -0000
@@ -79,6 +79,14 @@ scanner_last_string_free (void)
static int braces_level = 0;
static int percent_percent_count = 0;
+/* Within well-formed rules, RULE_LENGTH is the number of values in
+ the current rule so far, which says where to find `$0' with respect
+ to the top of the stack. It is not the same as the rule->length in
+ the case of mid rule actions.
+
+ Outside of well-formed rules, RULE_LENGTH has an undefined value. */
+static int rule_length;
+
static void handle_dollar PARAMS ((braced_code_t code_kind,
char *cp, location_t location));
static void handle_at PARAMS ((braced_code_t code_kind,
@@ -138,7 +146,7 @@ blanks [ \t\f]+
"%nonassoc" return PERCENT_NONASSOC;
"%nterm" return PERCENT_NTERM;
"%output" return PERCENT_OUTPUT;
- "%prec" return PERCENT_PREC;
+ "%prec" { rule_length--; return PERCENT_PREC; }
"%printer" return PERCENT_PRINTER;
"%pure"[-_]"parser" return PERCENT_PURE_PARSER;
"%right" return PERCENT_RIGHT;
@@ -153,14 +161,15 @@ blanks [ \t\f]+
"%yacc" return PERCENT_YACC;
"=" return EQUAL;
- ":" return COLON;
- "|" return PIPE;
+ ":" { rule_length = 0; return COLON; }
+ "|" { rule_length = 0; return PIPE; }
";" return SEMICOLON;
{eols} YY_LINES; YY_STEP;
{blanks} YY_STEP;
{id} {
yylval->symbol = symbol_get (yytext, *yylloc);
+ rule_length++;
return ID;
}
@@ -262,6 +271,7 @@ blanks [ \t\f]+
YY_OBS_FINISH;
yylval->string = last_string;
yy_pop_state ();
+ rule_length++;
return STRING;
}
@@ -298,6 +308,7 @@ blanks [ \t\f]+
(unsigned char) last_string[1], *yylloc);
YY_OBS_FREE;
yy_pop_state ();
+ rule_length++;
return ID;
}
}
@@ -451,6 +462,7 @@ blanks [ \t\f]+
yy_pop_state ();
YY_OBS_FINISH;
yylval->string = last_string;
+ rule_length++;
return BRACED_CODE;
}
}
@@ -566,11 +578,6 @@ handle_action_dollar (char *text, locati
}
else if (('0' <= *cp && *cp <= '9') || *cp == '-')
{
- /* RULE_LENGTH is the number of values in the current rule so
- far, which says where to find `$0' with respect to the top of
- the stack. It is not the same as the rule->length in the
- case of mid rule actions. */
- int rule_length = symbol_list_length (current_rule->next);
int n = strtol (cp, &cp, 10);
if (n > rule_length)
@@ -653,11 +660,6 @@ handle_action_at (char *text, location_t
}
else if (('0' <= *cp && *cp <= '9') || *cp == '-')
{
- /* RULE_LENGTH is the number of values in the current rule so
- far, which says where to find `$0' with respect to the top of
- the stack. It is not the same as the rule->length in the
- case of mid rule actions. */
- int rule_length = symbol_list_length (current_rule->next);
int n = strtol (cp, &cp, 10);
if (n > rule_length)
Index: tests/actions.at
===================================================================
RCS file: /cvsroot/bison/bison/tests/actions.at,v
retrieving revision 1.14
diff -p -u -r1.14 actions.at
--- tests/actions.at 30 Jul 2002 11:56:44 -0000 1.14
+++ tests/actions.at 13 Oct 2002 08:33:05 -0000
@@ -103,18 +103,18 @@ AT_DATA([[input.y]],
int val;
};
-%type <val> a_1 a_2 a_4 a_5
+%type <val> a_1 a_2 a_5
sum_of_the_five_previous_values
%%
-exp: a_1 a_2 { $<val>$ = 3; } a_4 a_5 sum_of_the_five_previous_values
+exp: a_1 a_2 { $<val>$ = 3; } { $<val>$ = $<val>3 + 1; } a_5
+ sum_of_the_five_previous_values
{
printf ("%d\n", $6);
}
;
a_1: { $$ = 1; };
a_2: { $$ = 2; };
-a_4: { $$ = 4; };
a_5: { $$ = 5; };
sum_of_the_five_previous_values:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Re: Values from immediately preceding action blocks are no longer available in bison 1.50,
Paul Eggert <=