X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/aa4180418fff518198e1b0f2c43fec6432210dc7..0ced3098fd97e1483b4ac938bdce99bfc7942539:/src/scan-gram.l diff --git a/src/scan-gram.l b/src/scan-gram.l index 4416730c..742d54e8 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -182,6 +182,7 @@ splice (\\[ \f\t\v]*\n)* { "%binary" return PERCENT_NONASSOC; "%debug" return PERCENT_DEBUG; + "%default"[-_]"prec" return PERCENT_DEFAULT_PREC; "%define" return PERCENT_DEFINE; "%defines" return PERCENT_DEFINES; "%destructor" token_type = PERCENT_DESTRUCTOR; BEGIN SC_PRE_CODE; @@ -190,14 +191,17 @@ splice (\\[ \f\t\v]*\n)* "%expect" return PERCENT_EXPECT; "%file-prefix" return PERCENT_FILE_PREFIX; "%fixed"[-_]"output"[-_]"files" return PERCENT_YACC; + "%initial-action" token_type = PERCENT_INITIAL_ACTION; BEGIN SC_PRE_CODE; "%glr-parser" return PERCENT_GLR_PARSER; "%left" return PERCENT_LEFT; "%lex-param" token_type = PERCENT_LEX_PARAM; BEGIN SC_PRE_CODE; "%locations" return PERCENT_LOCATIONS; "%merge" return PERCENT_MERGE; "%name"[-_]"prefix" return PERCENT_NAME_PREFIX; + "%no"[-_]"default"[-_]"prec" return PERCENT_NO_DEFAULT_PREC; "%no"[-_]"lines" return PERCENT_NO_LINES; "%nonassoc" return PERCENT_NONASSOC; + "%nondeterministic-parser" return PERCENT_NONDETERMINISTIC_PARSER; "%nterm" return PERCENT_NTERM; "%output" return PERCENT_OUTPUT; "%parse-param" token_type = PERCENT_PARSE_PARAM; BEGIN SC_PRE_CODE; @@ -367,6 +371,7 @@ splice (\\[ \f\t\v]*\n)* return STRING; } + \0 complain_at (*loc, _("invalid null character")); .|\n STRING_GROW; <> unexpected_eof (token_start, "\""); BEGIN INITIAL; } @@ -393,6 +398,7 @@ splice (\\[ \f\t\v]*\n)* return ID; } + \0 complain_at (*loc, _("invalid null character")); .|\n STRING_GROW; <> unexpected_eof (token_start, "'"); BEGIN INITIAL; } @@ -408,6 +414,8 @@ splice (\\[ \f\t\v]*\n)* unsigned long c = strtoul (yytext + 1, 0, 8); if (UCHAR_MAX < c) complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); + else if (! c) + complain_at (*loc, _("invalid null character: %s"), quote (yytext)); else obstack_1grow (&obstack_for_string, c); } @@ -418,6 +426,8 @@ splice (\\[ \f\t\v]*\n)* c = strtoul (yytext + 2, 0, 16); if (UCHAR_MAX < c || get_errno ()) complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); + else if (! c) + complain_at (*loc, _("invalid null character: %s"), quote (yytext)); else obstack_1grow (&obstack_for_string, c); } @@ -437,6 +447,8 @@ splice (\\[ \f\t\v]*\n)* int c = convert_ucn_to_byte (yytext); if (c < 0) complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); + else if (! c) + complain_at (*loc, _("invalid null character: %s"), quote (yytext)); else obstack_1grow (&obstack_for_string, c); } @@ -648,6 +660,11 @@ splice (\\[ \f\t\v]*\n)* %% +/* Keeps track of the maximum number of semantic values to the left of + a handle (those referenced by $0, $-1, etc.) are required by the + semantic actions of this grammar. */ +int max_left_semantic_context = 0; + /* Set *LOC and adjust scanner cursor to account for token TOKEN of size SIZE. */ @@ -780,6 +797,8 @@ handle_action_dollar (char *text, location loc) if (INT_MIN <= num && num <= rule_length && ! get_errno ()) { int n = num; + if (1-n > max_left_semantic_context) + max_left_semantic_context = 1-n; if (!type_name && n > 0) type_name = symbol_list_n_type_name_get (current_rule, loc, n); if (!type_name && typed) @@ -799,10 +818,10 @@ handle_action_dollar (char *text, location loc) } -/*-----------------------------------------------------------------. -| Dispatch onto handle_action_dollar, or handle_destructor_dollar, | -| depending upon TOKEN_TYPE. | -`-----------------------------------------------------------------*/ +/*----------------------------------------------------------------. +| Map `$?' onto the proper M4 symbol, depending on its TOKEN_TYPE | +| (are we in an action?). | +`----------------------------------------------------------------*/ static void handle_dollar (int token_type, char *text, location loc) @@ -815,6 +834,7 @@ handle_dollar (int token_type, char *text, location loc) break; case PERCENT_DESTRUCTOR: + case PERCENT_INITIAL_ACTION: case PERCENT_PRINTER: if (text[1] == '$') { @@ -840,7 +860,7 @@ static inline bool handle_action_at (char *text, location loc) { char *cp = text + 1; - locations_flag = 1; + locations_flag = true; if (! current_rule) return false; @@ -867,10 +887,10 @@ handle_action_at (char *text, location loc) } -/*-------------------------------------------------------------------. -| Dispatch onto handle_action_at, or handle_destructor_at, depending | -| upon CODE_KIND. | -`-------------------------------------------------------------------*/ +/*----------------------------------------------------------------. +| Map `@?' onto the proper M4 symbol, depending on its TOKEN_TYPE | +| (are we in an action?). | +`----------------------------------------------------------------*/ static void handle_at (int token_type, char *text, location loc) @@ -881,6 +901,7 @@ handle_at (int token_type, char *text, location loc) handle_action_at (text, loc); return; + case PERCENT_INITIAL_ACTION: case PERCENT_DESTRUCTOR: case PERCENT_PRINTER: if (text[1] == '$')