X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/db34f7988941444bdc5f2b6adcf7fb83648f9a18..ba4184ec9152422c14be743e876b5716daf0aa80:/src/reader.c?ds=sidebyside diff --git a/src/reader.c b/src/reader.c index f607f9ee..3f224bf5 100644 --- a/src/reader.c +++ b/src/reader.c @@ -21,6 +21,7 @@ #include #include "system.h" +#include #include #include "complain.h" @@ -169,7 +170,7 @@ free_merger_functions (void) static symbol_list *grammar_end = NULL; /* Append SYM to the grammar. */ -static void +static symbol_list * grammar_symbol_append (symbol *sym, location loc) { symbol_list *p = symbol_list_sym_new (sym, loc); @@ -185,8 +186,27 @@ grammar_symbol_append (symbol *sym, location loc) part of it. */ if (sym) ++nritems; + + return p; } +static void +assign_named_ref (symbol_list *p, named_ref *name) +{ + symbol *sym = p->content.sym; + + if (name->id == sym->tag) + { + warn_at (name->loc, + _("duplicated symbol name for %s ignored"), + quote (sym->tag)); + named_ref_free (name); + } + else + p->named_ref = name; +} + + /* The rule currently being defined, and the previous rule. CURRENT_RULE points to the first LHS of the current rule, while PREVIOUS_RULE_END points to the *end* of the previous rule (NULL). */ @@ -199,12 +219,19 @@ static symbol_list *previous_rule_end = NULL; `----------------------------------------------*/ void -grammar_current_rule_begin (symbol *lhs, location loc) +grammar_current_rule_begin (symbol *lhs, location loc, + named_ref *lhs_name) { + symbol_list* p; + /* Start a new rule and record its lhs. */ ++nrules; previous_rule_end = grammar_end; - grammar_symbol_append (lhs, loc); + + p = grammar_symbol_append (lhs, loc); + if (lhs_name) + assign_named_ref(p, lhs_name); + current_rule = grammar_end; /* Mark the rule's lhs as a nonterminal if not already so. */ @@ -328,6 +355,9 @@ grammar_midrule_action (void) symbol *dummy = dummy_symbol_get (dummy_location); symbol_list *midrule = symbol_list_sym_new (dummy, dummy_location); + /* Remember named_ref of previous action. */ + named_ref *action_name = current_rule->action_props.named_ref; + /* Make a new rule, whose body is empty, before the current one, so that the action just read can belong to it. */ ++nrules; @@ -337,7 +367,7 @@ grammar_midrule_action (void) code_props_rule_action_init (&midrule->action_props, current_rule->action_props.code, current_rule->action_props.location, - midrule); + midrule, 0); code_props_none_init (¤t_rule->action_props); if (previous_rule_end) @@ -353,7 +383,8 @@ grammar_midrule_action (void) /* Insert the dummy nonterminal replacing the midrule action into the current rule. Bind it to its dedicated rule. */ - grammar_current_rule_symbol_append (dummy, dummy_location); + grammar_current_rule_symbol_append (dummy, dummy_location, + action_name); grammar_end->midrule = midrule; midrule->midrule_parent_rule = current_rule; midrule->midrule_parent_rhs_index = symbol_list_length (current_rule->next); @@ -402,24 +433,29 @@ grammar_current_rule_merge_set (uniqstr name, location loc) action as a mid-rule action. */ void -grammar_current_rule_symbol_append (symbol *sym, location loc) +grammar_current_rule_symbol_append (symbol *sym, location loc, + named_ref *name) { + symbol_list *p; if (current_rule->action_props.code) grammar_midrule_action (); - grammar_symbol_append (sym, loc); + p = grammar_symbol_append (sym, loc); + if (name) + assign_named_ref(p, name); } /* Attach an ACTION to the current rule. */ void -grammar_current_rule_action_append (const char *action, location loc) +grammar_current_rule_action_append (const char *action, location loc, + named_ref *name) { if (current_rule->action_props.code) grammar_midrule_action (); /* After all symbol declarations have been parsed, packgram invokes code_props_translate_code. */ code_props_rule_action_init (¤t_rule->action_props, action, loc, - current_rule); + current_rule, name); } @@ -555,23 +591,26 @@ reader (void) gram_scanner_initialize (); gram_parse (); - /* IELR would be a better default, but LALR is historically the default. */ + /* Set front-end %define variable defaults. */ + muscle_percent_define_default ("lr.keep-unreachable-states", "false"); { char *lr_type; + /* IELR would be a better default, but LALR is historically the + default. */ muscle_percent_define_default ("lr.type", "LALR"); lr_type = muscle_percent_define_get ("lr.type"); if (0 != strcmp (lr_type, "canonical LR")) - muscle_percent_define_default ("lr.default_rules", "all"); + muscle_percent_define_default ("lr.default-reductions", "all"); else - muscle_percent_define_default ("lr.default_rules", "accepting"); + muscle_percent_define_default ("lr.default-reductions", "accepting"); free (lr_type); } - /* Check front-end %define variable values. */ + /* Check front-end %define variables. */ { static char const * const values[] = { "lr.type", "LALR", "IELR", "canonical LR", NULL, - "lr.default_rules", "all", "consistent", "accepting", NULL, + "lr.default-reductions", "all", "consistent", "accepting", NULL, NULL }; muscle_percent_define_check_values (values);