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,
%x SC_ESCAPED_STRING SC_ESCAPED_CHARACTER
%x SC_BRACED_CODE SC_PROLOGUE SC_EPILOGUE
-id [.a-zA-Z][.a-zA-Z_0-9]*
+id [.a-zA-Z_][.a-zA-Z_0-9]*
int [0-9]+
eols (\n|\r|\n\r|\r\n)+
blanks [ \t\f]+
%{
/* 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;
}
{int} yylval->integer = strtol (yytext, 0, 10); return INT;
/* Characters. We don't check there is only one. */
- \' YY_OBS_GROW; yy_push_state (SC_ESCAPED_CHARACTER);
+ "'" YY_OBS_GROW; yy_push_state (SC_ESCAPED_CHARACTER);
/* Strings. */
- \" YY_OBS_GROW; yy_push_state (SC_ESCAPED_STRING);
+ "\"" YY_OBS_GROW; yy_push_state (SC_ESCAPED_STRING);
/* Comments. */
"/*" yy_push_state (SC_COMMENT);
. {
LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, ": invalid character: `%c'\n", *yytext);
+ fprintf (stderr, _(": invalid character: `%c'\n"), *yytext);
YY_STEP;
}
}
<<EOF>> {
LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, ": unexpected end of file in a comment\n");
+ fprintf (stderr, _(": unexpected end of file in a comment\n"));
yy_pop_state ();
}
}
<SC_ESCAPED_STRING>
{
- \" {
+ "\"" {
assert (yy_top_state () == INITIAL);
YY_OBS_GROW;
YY_OBS_FINISH;
yylval->string = last_string;
yy_pop_state ();
+ rule_length++;
return STRING;
}
<<EOF>> {
LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, ": unexpected end of file in a string\n");
+ fprintf (stderr, _(": unexpected end of file in a string\n"));
assert (yy_top_state () == INITIAL);
YY_OBS_FINISH;
yylval->string = last_string;
<SC_ESCAPED_CHARACTER>
{
- \' {
+ "'" {
YY_OBS_GROW;
assert (yy_top_state () == INITIAL);
{
(unsigned char) last_string[1], *yylloc);
YY_OBS_FREE;
yy_pop_state ();
+ rule_length++;
return ID;
}
}
- [^\'\n\r\\] YY_OBS_GROW;
+ [^\n\r\\] YY_OBS_GROW;
{eols} obstack_1grow (&string_obstack, '\n'); YY_LINES;
<<EOF>> {
LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, ": unexpected end of file in a character\n");
+ fprintf (stderr, _(": unexpected end of file in a character\n"));
assert (yy_top_state () == INITIAL);
YY_OBS_FINISH;
yylval->string = last_string;
if (c > 255)
{
LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, ": invalid escape: %s\n", quote (yytext));
+ fprintf (stderr, _(": invalid escape: %s\n"), quote (yytext));
YY_STEP;
}
else
\\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));
+ fprintf (stderr, _(": unrecognized escape: %s\n"), quote (yytext));
YY_OBS_GROW;
}
/* FLex wants this rule, in case of a `\<<EOF>>'. */
<SC_CHARACTER>
{
- \' {
+ "'" {
YY_OBS_GROW;
assert (yy_top_state () != INITIAL);
yy_pop_state ();
<<EOF>> {
LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, ": unexpected end of file in a character\n");
+ fprintf (stderr, _(": unexpected end of file in a character\n"));
assert (yy_top_state () != INITIAL);
yy_pop_state ();
}
<SC_STRING>
{
- \" {
+ "\"" {
assert (yy_top_state () != INITIAL);
YY_OBS_GROW;
yy_pop_state ();
<<EOF>> {
LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, ": unexpected end of file in a string\n");
+ fprintf (stderr, _(": unexpected end of file in a string\n"));
assert (yy_top_state () != INITIAL);
yy_pop_state ();
}
<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE>
{
/* Characters. We don't check there is only one. */
- \' YY_OBS_GROW; yy_push_state (SC_CHARACTER);
+ "'" YY_OBS_GROW; yy_push_state (SC_CHARACTER);
/* Strings. */
- \" YY_OBS_GROW; yy_push_state (SC_STRING);
+ "\"" YY_OBS_GROW; yy_push_state (SC_STRING);
/* Comments. */
"/*" YY_OBS_GROW; yy_push_state (SC_COMMENT);
yy_pop_state ();
YY_OBS_FINISH;
yylval->string = last_string;
+ rule_length++;
return BRACED_CODE;
}
}
<<EOF>> {
LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, ": unexpected end of file in a braced code\n");
+ fprintf (stderr, _(": unexpected end of file in a braced code\n"));
yy_pop_state ();
YY_OBS_FINISH;
yylval->string = last_string;
<<EOF>> {
LOCATION_PRINT (stderr, *yylloc);
- fprintf (stderr, ": unexpected end of file in a prologue\n");
+ fprintf (stderr, _(": unexpected end of file in a prologue\n"));
yy_pop_state ();
YY_OBS_FINISH;
yylval->string = last_string;
obstack_fgrow1 (&string_obstack,
"]b4_lhs_value([%s])[", type_name);
}
- else if (isdigit (*cp) || *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);
if (n > rule_length)
{
obstack_sgrow (&string_obstack, "]b4_lhs_location[");
}
- else if (isdigit (*cp) || *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);
if (n > rule_length)