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,
%{
/* At each yylex invocation, mark the current position as the
start of the next token. */
-#define TR_POS 0
-#if TR_POS
- fprintf (stderr, "FOO1: %p: ", yylloc);
- LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, "\n");
-#endif
YY_STEP;
-#if TR_POS
- fprintf (stderr, "BAR1: ");
- LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, "\n");
-#endif
%}
"%expect" return PERCENT_EXPECT;
"%file-prefix" return PERCENT_FILE_PREFIX;
"%fixed"[-_]"output"[-_]"files" return PERCENT_YACC;
- "%glr"[-_]"parser" return PERCENT_GLR_PARSER;
+ "%glr-parser" return PERCENT_GLR_PARSER;
"%left" return PERCENT_LEFT;
"%locations" return PERCENT_LOCATIONS;
"%merge" return PERCENT_MERGE;
"%nonassoc" return PERCENT_NONASSOC;
"%nterm" return PERCENT_NTERM;
"%output" return PERCENT_OUTPUT;
- "%prec" return PERCENT_PREC;
+ "%parse-param" return PERCENT_PARSE_PARAM;
+ "%prec" { rule_length--; return PERCENT_PREC; }
"%printer" return PERCENT_PRINTER;
"%pure"[-_]"parser" return PERCENT_PURE_PARSER;
"%right" return PERCENT_RIGHT;
+ "%lex-param" return PERCENT_LEX_PARAM;
"%skeleton" return PERCENT_SKELETON;
"%start" return PERCENT_START;
"%term" return PERCENT_TOKEN;
"%yacc" return PERCENT_YACC;
"=" return EQUAL;
- ":" return COLON;
- "|" return PIPE;
+ ":" { rule_length = 0; return COLON; }
+ "|" { rule_length = 0; return PIPE; }
+ "," return COMMA;
";" return SEMICOLON;
{eols} YY_LINES; YY_STEP;
{blanks} YY_STEP;
{id} {
yylval->symbol = symbol_get (yytext, *yylloc);
+ rule_length++;
return ID;
}
YY_OBS_FINISH;
yylval->string = last_string;
yy_pop_state ();
+ rule_length++;
return STRING;
}
(unsigned char) last_string[1], *yylloc);
YY_OBS_FREE;
yy_pop_state ();
+ rule_length++;
return ID;
}
}
\\r obstack_1grow (&string_obstack, '\r');
\\t obstack_1grow (&string_obstack, '\t');
\\v obstack_1grow (&string_obstack, '\v');
- \\[\\""] obstack_1grow (&string_obstack, yytext[1]);
+ \\[\\""''] obstack_1grow (&string_obstack, yytext[1]);
\\(.|\n) {
LOCATION_PRINT (stderr, *yylloc);
fprintf (stderr, _(": unrecognized escape: %s\n"), quote (yytext));
yy_pop_state ();
YY_OBS_FINISH;
yylval->string = last_string;
+ rule_length++;
return BRACED_CODE;
}
}
}
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)
}
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)