mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-13 14:23:04 +00:00
(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.
This commit is contained in:
@@ -79,6 +79,14 @@ scanner_last_string_free (void)
|
|||||||
static int braces_level = 0;
|
static int braces_level = 0;
|
||||||
static int percent_percent_count = 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,
|
static void handle_dollar PARAMS ((braced_code_t code_kind,
|
||||||
char *cp, location_t location));
|
char *cp, location_t location));
|
||||||
static void handle_at PARAMS ((braced_code_t code_kind,
|
static void handle_at PARAMS ((braced_code_t code_kind,
|
||||||
@@ -138,7 +146,7 @@ blanks [ \t\f]+
|
|||||||
"%nonassoc" return PERCENT_NONASSOC;
|
"%nonassoc" return PERCENT_NONASSOC;
|
||||||
"%nterm" return PERCENT_NTERM;
|
"%nterm" return PERCENT_NTERM;
|
||||||
"%output" return PERCENT_OUTPUT;
|
"%output" return PERCENT_OUTPUT;
|
||||||
"%prec" return PERCENT_PREC;
|
"%prec" { rule_length--; return PERCENT_PREC; }
|
||||||
"%printer" return PERCENT_PRINTER;
|
"%printer" return PERCENT_PRINTER;
|
||||||
"%pure"[-_]"parser" return PERCENT_PURE_PARSER;
|
"%pure"[-_]"parser" return PERCENT_PURE_PARSER;
|
||||||
"%right" return PERCENT_RIGHT;
|
"%right" return PERCENT_RIGHT;
|
||||||
@@ -153,14 +161,15 @@ blanks [ \t\f]+
|
|||||||
"%yacc" return PERCENT_YACC;
|
"%yacc" return PERCENT_YACC;
|
||||||
|
|
||||||
"=" return EQUAL;
|
"=" return EQUAL;
|
||||||
":" return COLON;
|
":" { rule_length = 0; return COLON; }
|
||||||
"|" return PIPE;
|
"|" { rule_length = 0; return PIPE; }
|
||||||
";" return SEMICOLON;
|
";" return SEMICOLON;
|
||||||
|
|
||||||
{eols} YY_LINES; YY_STEP;
|
{eols} YY_LINES; YY_STEP;
|
||||||
{blanks} YY_STEP;
|
{blanks} YY_STEP;
|
||||||
{id} {
|
{id} {
|
||||||
yylval->symbol = symbol_get (yytext, *yylloc);
|
yylval->symbol = symbol_get (yytext, *yylloc);
|
||||||
|
rule_length++;
|
||||||
return ID;
|
return ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,6 +271,7 @@ blanks [ \t\f]+
|
|||||||
YY_OBS_FINISH;
|
YY_OBS_FINISH;
|
||||||
yylval->string = last_string;
|
yylval->string = last_string;
|
||||||
yy_pop_state ();
|
yy_pop_state ();
|
||||||
|
rule_length++;
|
||||||
return STRING;
|
return STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,6 +308,7 @@ blanks [ \t\f]+
|
|||||||
(unsigned char) last_string[1], *yylloc);
|
(unsigned char) last_string[1], *yylloc);
|
||||||
YY_OBS_FREE;
|
YY_OBS_FREE;
|
||||||
yy_pop_state ();
|
yy_pop_state ();
|
||||||
|
rule_length++;
|
||||||
return ID;
|
return ID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -451,6 +462,7 @@ blanks [ \t\f]+
|
|||||||
yy_pop_state ();
|
yy_pop_state ();
|
||||||
YY_OBS_FINISH;
|
YY_OBS_FINISH;
|
||||||
yylval->string = last_string;
|
yylval->string = last_string;
|
||||||
|
rule_length++;
|
||||||
return BRACED_CODE;
|
return BRACED_CODE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -566,11 +578,6 @@ handle_action_dollar (char *text, location_t location)
|
|||||||
}
|
}
|
||||||
else if (('0' <= *cp && *cp <= '9') || *cp == '-')
|
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);
|
int n = strtol (cp, &cp, 10);
|
||||||
|
|
||||||
if (n > rule_length)
|
if (n > rule_length)
|
||||||
@@ -653,11 +660,6 @@ handle_action_at (char *text, location_t location)
|
|||||||
}
|
}
|
||||||
else if (('0' <= *cp && *cp <= '9') || *cp == '-')
|
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);
|
int n = strtol (cp, &cp, 10);
|
||||||
|
|
||||||
if (n > rule_length)
|
if (n > rule_length)
|
||||||
|
|||||||
Reference in New Issue
Block a user