X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/76290368d48b584808a120dfbd415be93aef04f6..960349830600dc408ebd1ddc9710aa3ed955ed66:/src/scan-code.l diff --git a/src/scan-code.l b/src/scan-code.l index 75848d82..0a338b4e 100644 --- a/src/scan-code.l +++ b/src/scan-code.l @@ -39,11 +39,10 @@ #include #include "scan-code.h" -#include "symlist.h" /* The current calling start condition: SC_RULE_ACTION or SC_SYMBOL_ACTION. */ -# define YY_DECL static char *code_lex (code_props *self, int sc_context) +# define YY_DECL char *code_lex (int sc_context, symbol_list *rule) YY_DECL; #define YY_USER_ACTION location_compute (loc, &loc->end, yytext, yyleng); @@ -54,9 +53,6 @@ static void handle_action_at (symbol_list *rule, char *cp, location at_loc); static location the_location; static location *loc = &the_location; -/* A string representing the most recent translation. */ -static char *last_string; - /* True if an untyped $$ or $n was seen. */ static bool untyped_var_seen; %} @@ -155,12 +151,8 @@ splice (\\[ \f\t\v]*\n)* { - "$"("<"{tag}">")?(-?[0-9]+|"$") { - handle_action_dollar (self->rule, yytext, *loc); - } - "@"(-?[0-9]+|"$") { - handle_action_at (self->rule, yytext, *loc); - } + "$"("<"{tag}">")?(-?[0-9]+|"$") handle_action_dollar (rule, yytext, *loc); + "@"(-?[0-9]+|"$") handle_action_at (rule, yytext, *loc); "$" { warn_at (*loc, _("stray `$'")); @@ -198,10 +190,7 @@ splice (\\[ \f\t\v]*\n)* { - "$$" { - obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar["); - self->is_value_used = true; - } + "$$" obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar["); "@$" obstack_sgrow (&obstack_for_string, "]b4_at_dollar["); } @@ -226,8 +215,8 @@ splice (\\[ \f\t\v]*\n)* /* End of processing. */ <*><> { - STRING_FINISH; - return last_string; + obstack_1grow (&obstack_for_string, '\0'); + return obstack_finish (&obstack_for_string); } %% @@ -249,7 +238,7 @@ int max_left_semantic_context = 0; static void handle_action_dollar (symbol_list *rule, char *text, location dollar_loc) { - char const *type_name = NULL; + const char *type_name = NULL; char *cp = text + 1; symbol_list *effective_rule; int effective_rule_length; @@ -304,7 +293,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc) obstack_fgrow1 (&obstack_for_string, "]b4_lhs_value([%s])[", type_name); - rule->action_props.is_value_used = true; + rule->used = true; } else { @@ -332,9 +321,7 @@ handle_action_dollar (symbol_list *rule, char *text, location dollar_loc) obstack_fgrow3 (&obstack_for_string, "]b4_rhs_value(%d, %d, [%s])[", effective_rule_length, n, type_name); - if (n > 0) - symbol_list_n_get (effective_rule, n)->action_props.is_value_used = - true; + symbol_list_n_used_set (effective_rule, n, true); } else complain_at (dollar_loc, _("integer out of range: %s"), quote (text)); @@ -381,11 +368,12 @@ handle_action_at (symbol_list *rule, char *text, location at_loc) | Initialize the scanner. | `-------------------------*/ -/* Translate the dollars and ats in \a self, in the context \a sc_context +/* Translate the dollars and ats in \a a, whose location is \a l. The + translation is for \a rule, in the context \a sc_context (SC_RULE_ACTION, SC_SYMBOL_ACTION, INITIAL). */ static char const * -translate_action (code_props *self, int sc_context) +translate_action (int sc_context, symbol_list *rule, char const *a, location l) { char *res; static bool initialized = false; @@ -396,102 +384,36 @@ translate_action (code_props *self, int sc_context) initialized = true; } - loc->start = loc->end = self->location.start; - yy_switch_to_buffer (yy_scan_string (self->code)); - res = code_lex (self, sc_context); + loc->start = loc->end = l.start; + yy_switch_to_buffer (yy_scan_string (a)); + res = code_lex (sc_context, rule); yy_delete_buffer (YY_CURRENT_BUFFER); return res; } -/*------------------------------------------------------------------------. -| Implementation of the public interface as documented in "scan-code.h". | -`------------------------------------------------------------------------*/ - -void -code_props_none_init (code_props *self) -{ - *self = code_props_none; -} - -code_props const code_props_none = CODE_PROPS_NONE_INIT; - -void -code_props_plain_init (code_props *self, char const *code, location code_loc) -{ - self->kind = CODE_PROPS_PLAIN; - self->code = code; - self->location = code_loc; - self->is_value_used = false; - self->rule = NULL; -} - -void -code_props_symbol_action_init (code_props *self, char const *code, - location code_loc) -{ - self->kind = CODE_PROPS_SYMBOL_ACTION; - self->code = code; - self->location = code_loc; - self->is_value_used = false; - self->rule = NULL; -} - -void -code_props_rule_action_init (code_props *self, char const *code, - location code_loc, symbol_list *rule) -{ - self->kind = CODE_PROPS_RULE_ACTION; - self->code = code; - self->location = code_loc; - self->is_value_used = false; - self->rule = rule; -} - -void -code_props_translate_code (code_props *self) -{ - switch (self->kind) - { - case CODE_PROPS_NONE: - break; - case CODE_PROPS_PLAIN: - self->code = translate_action (self, INITIAL); - break; - case CODE_PROPS_SYMBOL_ACTION: - self->code = translate_action (self, SC_SYMBOL_ACTION); - break; - case CODE_PROPS_RULE_ACTION: - self->code = translate_action (self, SC_RULE_ACTION); - break; - } -} - char const * -code_props_code_get (code_props const self) +translate_rule_action (symbol_list *rule) { - return self.code; + return translate_action (SC_RULE_ACTION, rule, rule->action, + rule->action_location); } -location -code_props_location_get (code_props const self) +char const * +translate_symbol_action (char const *a, location l) { - aver (self.code != NULL); - return self.location; + return translate_action (SC_SYMBOL_ACTION, NULL, a, l); } -bool -code_props_is_value_used (code_props const self) +char const * +translate_code (char const *a, location l) { - aver (self.kind != CODE_PROPS_PLAIN); - return self.is_value_used; + return translate_action (INITIAL, NULL, a, l); } -void -code_scanner_last_string_free (void) -{ - STRING_FREE; -} +/*-----------------------------------------------. +| Free all the memory allocated to the scanner. | +`-----------------------------------------------*/ void code_scanner_free (void)