X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/db2cc12fd07acb54b19cf6475f6d330a8b904e0a..f7aed660541ed7b05c4d892334dfe64ba200a4a2:/src/scan-gram.l diff --git a/src/scan-gram.l b/src/scan-gram.l index ef3976af..235272f1 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -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, @@ -99,18 +107,7 @@ 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 %} @@ -129,7 +126,7 @@ blanks [ \t\f]+ "%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; @@ -138,10 +135,12 @@ blanks [ \t\f]+ "%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; @@ -153,14 +152,16 @@ blanks [ \t\f]+ "%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; } @@ -262,6 +263,7 @@ blanks [ \t\f]+ YY_OBS_FINISH; yylval->string = last_string; yy_pop_state (); + rule_length++; return STRING; } @@ -298,6 +300,7 @@ blanks [ \t\f]+ (unsigned char) last_string[1], *yylloc); YY_OBS_FREE; yy_pop_state (); + rule_length++; return ID; } } @@ -347,7 +350,7 @@ blanks [ \t\f]+ \\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)); @@ -451,6 +454,7 @@ blanks [ \t\f]+ yy_pop_state (); YY_OBS_FINISH; yylval->string = last_string; + rule_length++; return BRACED_CODE; } } @@ -566,11 +570,6 @@ handle_action_dollar (char *text, location_t location) } 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 +652,6 @@ handle_action_at (char *text, location_t location) } 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)