X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/9280d3ef893b90b36c89fa7737512f2d640e41d9..366eea36d3a9aaccf80a78c2fcd8c3cd6b563e25:/src/scan-gram.l diff --git a/src/scan-gram.l b/src/scan-gram.l index 61032dd5..d1299c5b 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -76,13 +76,13 @@ scanner_last_string_free (void) } - static int braces_level = 0; static int percent_percent_count = 0; -static void handle_action_dollar PARAMS ((char *cp, location_t location)); -static void handle_destructor_dollar PARAMS ((char *cp, location_t location)); -static void handle_at PARAMS ((char *cp)); +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, + char *cp, location_t location)); %} %x SC_COMMENT @@ -136,6 +136,7 @@ blanks [ \t\f]+ "%nterm" return PERCENT_NTERM; "%output" return PERCENT_OUTPUT; "%prec" return PERCENT_PREC; + "%printer" return PERCENT_PRINTER; "%pure"[-_]"parser" return PERCENT_PURE_PARSER; "%right" return PERCENT_RIGHT; "%skeleton" return PERCENT_SKELETON; @@ -324,7 +325,7 @@ blanks [ \t\f]+ if (c > 255) { LOCATION_PRINT (stderr, *yylloc); - fprintf (stderr, ": invalid escape: %s\n", yytext); + fprintf (stderr, ": invalid escape: %s\n", quote (yytext)); YY_STEP; } else @@ -343,11 +344,13 @@ blanks [ \t\f]+ \\t obstack_1grow (&string_obstack, '\t'); \\v obstack_1grow (&string_obstack, '\v'); \\[\\""] obstack_1grow (&string_obstack, yytext[1]); - \\. { + \\(.|\n) { LOCATION_PRINT (stderr, *yylloc); - fprintf (stderr, ": unrecognized escape: %s\n", yytext); + fprintf (stderr, ": unrecognized escape: %s\n", quote (yytext)); YY_OBS_GROW; } + /* FLex wants this rule, in case of a `\<>'. */ + \\ YY_OBS_GROW; } @@ -364,8 +367,10 @@ blanks [ \t\f]+ yy_pop_state (); } - [^\[\]\'\n\r\\] YY_OBS_GROW; - \\. YY_OBS_GROW; + [^\[\]\'\n\r\\]+ YY_OBS_GROW; + \\(.|\n) YY_OBS_GROW; + /* FLex wants this rule, in case of a `\<>'. */ + \\ YY_OBS_GROW; {eols} YY_OBS_GROW; YY_LINES; @@ -392,7 +397,9 @@ blanks [ \t\f]+ } [^\[\]\"\n\r\\]+ YY_OBS_GROW; - \\. YY_OBS_GROW; + \\(.|\n) YY_OBS_GROW; + /* FLex wants this rule, in case of a `\<>'. */ + \\ YY_OBS_GROW; {eols} YY_OBS_GROW; YY_LINES; @@ -420,6 +427,9 @@ blanks [ \t\f]+ /* Comments. */ "/*" YY_OBS_GROW; yy_push_state (SC_COMMENT); "//".* YY_OBS_GROW; + + /* Not comments. */ + "/" YY_OBS_GROW; } @@ -443,19 +453,10 @@ blanks [ \t\f]+ "{" YY_OBS_GROW; braces_level++; - "$"("<"[^>]+">")?(-?[0-9]+|"$") { - switch (current_braced_code) - { - case action_braced_code: - handle_action_dollar (yytext, *yylloc); - break; - - case destructor_braced_code: - handle_destructor_dollar (yytext, *yylloc); - break; - } - } - "@"(-?[0-9]+|"$") { handle_at (yytext); } + "$"("<"[^>]+">")?(-?[0-9]+|"$") { handle_dollar (current_braced_code, + yytext, *yylloc); } + "@"(-?[0-9]+|"$") { handle_at (current_braced_code, + yytext, *yylloc); } [^$@\[\]/\'\"\{\}\n\r]+ YY_OBS_GROW; {eols} YY_OBS_GROW; YY_LINES; @@ -488,9 +489,9 @@ blanks [ \t\f]+ return PROLOGUE; } - [^%\[\]/\'\"\n\r]+ YY_OBS_GROW; - "%"+[^%\}\n\r]+ YY_OBS_GROW; - {eols} YY_OBS_GROW; YY_LINES; + [^%\[\]/\'\"\n\r]+ YY_OBS_GROW; + "%" YY_OBS_GROW; + {eols} YY_OBS_GROW; YY_LINES; <> { LOCATION_PRINT (stderr, *yylloc); @@ -500,7 +501,6 @@ blanks [ \t\f]+ yylval->string = last_string; return PROLOGUE; } - } @@ -525,19 +525,18 @@ blanks [ \t\f]+ %% /*------------------------------------------------------------------. -| CP is pointing to a wannabee semantic value (i.e., a `$'). | +| TEXT is pointing to a wannabee semantic value (i.e., a `$'). | | | | Possible inputs: $[]($|integer) | | | | Output to the STRING_OBSTACK a reference to this semantic value. | `------------------------------------------------------------------*/ -static void -handle_action_dollar (char *cp, location_t location) +static inline void +handle_action_dollar (char *text, location_t location) { const char *type_name = NULL; - - ++cp; + char *cp = text + 1; /* Get the type name if explicit. */ if (*cp == '<') @@ -555,7 +554,7 @@ handle_action_dollar (char *cp, location_t location) type_name = symbol_list_n_type_name_get (current_rule, location, 0); if (!type_name && typed) complain_at (location, _("$$ of `%s' has no declared type"), - current_rule->sym->tag); + symbol_tag_get (current_rule->sym)); if (!type_name) type_name = ""; obstack_fgrow1 (&string_obstack, @@ -579,7 +578,7 @@ handle_action_dollar (char *cp, location_t location) n); if (!type_name && typed) complain_at (location, _("$%d of `%s' has no declared type"), - n, current_rule->sym->tag); + n, symbol_tag_get (current_rule->sym)); if (!type_name) type_name = ""; obstack_fgrow3 (&string_obstack, @@ -589,47 +588,60 @@ handle_action_dollar (char *cp, location_t location) } else { - char buf[] = "$c"; - buf[1] = *cp; - complain_at (location, _("%s is invalid"), quote (buf)); + complain_at (location, _("%s is invalid"), quote (text)); } } /*---------------------------------------------------------------. -| CP is pointing to $$ in a destructor. This should probably be | -| done once the grammar completely parsed, instead of during its | -| parsing, since that means %type must be specified before | -| %destructor. | +| TEXT is expexted tp be $$ in some code associated to a symbol: | +| destructor or printer. | `---------------------------------------------------------------*/ -static void -handle_destructor_dollar (char *cp, location_t location) +static inline void +handle_symbol_code_dollar (char *text, location_t location) { - ++cp; + char *cp = text + 1; if (*cp == '$') - { - /* FIXME: We should find something more robust. */ - obstack_sgrow (&string_obstack, "b4_dollar_dollar"); - } + obstack_sgrow (&string_obstack, "]b4_dollar_dollar["); else + complain_at (location, _("%s is invalid"), quote (text)); +} + + +/*-----------------------------------------------------------------. +| Dispatch onto handle_action_dollar, or handle_destructor_dollar, | +| depending upon CODE_KIND. | +`-----------------------------------------------------------------*/ + +static void +handle_dollar (braced_code_t braced_code_kind, + char *text, location_t location) +{ + switch (braced_code_kind) { - char buf[] = "$c"; - buf[1] = *cp; - complain_at (location, _("%s is invalid"), quote (buf)); + case action_braced_code: + handle_action_dollar (text, location); + break; + + case destructor_braced_code: + case printer_braced_code: + handle_symbol_code_dollar (text, location); + break; } } -/*-------------------------------------------------------. -| CP is pointing to a location (i.e., a `@'). Output to | -| STRING_OBSTACK a reference to this location. | -`-------------------------------------------------------*/ -static void -handle_at (char *cp) +/*------------------------------------------------------. +| TEXT is a location token (i.e., a `@...'). Output to | +| STRING_OBSTACK a reference to this location. | +`------------------------------------------------------*/ + +static inline void +handle_action_at (char *text, location_t location) { + char *cp = text + 1; locations_flag = 1; - ++cp; if (*cp == '$') { @@ -645,19 +657,61 @@ handle_at (char *cp) int n = strtol (cp, &cp, 10); if (n > rule_length) - complain (_("invalid value: %s%d"), "@", n); + complain_at (location, _("invalid value: %s%d"), "@", n); else obstack_fgrow2 (&string_obstack, "]b4_rhs_location([%d], [%d])[", rule_length, n); } else { - char buf[] = "@c"; - buf[1] = *cp; - complain (_("%s is invalid"), quote (buf)); + complain_at (location, _("%s is invalid"), quote (text)); } } + +/*---------------------------------------------------------------. +| TEXT is expexted tp be @$ in some code associated to a symbol: | +| destructor or printer. | +`---------------------------------------------------------------*/ + +static inline void +handle_symbol_code_at (char *text, location_t location) +{ + char *cp = text + 1; + if (*cp == '$') + obstack_sgrow (&string_obstack, "]b4_at_dollar["); + else + complain_at (location, _("%s is invalid"), quote (text)); +} + + +/*-------------------------------------------------------------------. +| Dispatch onto handle_action_at, or handle_destructor_at, depending | +| upon CODE_KIND. | +`-------------------------------------------------------------------*/ + +static void +handle_at (braced_code_t braced_code_kind, + char *text, location_t location) +{ + switch (braced_code_kind) + { + case action_braced_code: + handle_action_at (text, location); + break; + + case destructor_braced_code: + case printer_braced_code: + handle_symbol_code_at (text, location); + break; + } +} + + +/*-------------------------. +| Initialize the scanner. | +`-------------------------*/ + void scanner_initialize (void) { @@ -665,6 +719,10 @@ scanner_initialize (void) } +/*-----------------------------------------------. +| Free all the memory allocated to the scanner. | +`-----------------------------------------------*/ + void scanner_free (void) {