X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/dfaa48602d4e6d329e3ae9063f44929490928b3d..bf0e44e87c31bbab569c76e94ced6f4230e69f1f:/src/reader.c diff --git a/src/reader.c b/src/reader.c index 14624df8..9a58acbd 100644 --- a/src/reader.c +++ b/src/reader.c @@ -1,7 +1,7 @@ /* Input parser for Bison - Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003, - 2005, 2006, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000-2003, 2005-2007, + 2009-2011 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -231,7 +231,7 @@ grammar_current_rule_begin (symbol *lhs, location loc, p = grammar_symbol_append (lhs, loc); if (lhs_name) - assign_named_ref(p, lhs_name); + assign_named_ref (p, named_ref_copy (lhs_name)); current_rule = grammar_end; @@ -320,6 +320,15 @@ grammar_rule_check (const symbol_list *r) warn_at (r->location, _("unset value: $$")); } } + + /* See comments in grammar_current_rule_prec_set for how POSIX + mandates this complaint. It's only for identifiers, so skip + it for char literals and strings, which are always tokens. */ + if (r->ruleprec + && r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"' + && !r->ruleprec->declared && !r->ruleprec->prec) + warn_at (r->location, _("token for %%prec is not defined: %s"), + r->ruleprec->tag); } @@ -368,7 +377,8 @@ grammar_midrule_action (void) code_props_rule_action_init (&midrule->action_props, current_rule->action_props.code, current_rule->action_props.location, - midrule, 0); + midrule, 0, + current_rule->action_props.is_predicate); code_props_none_init (¤t_rule->action_props); if (previous_rule_end) @@ -396,6 +406,16 @@ grammar_midrule_action (void) void grammar_current_rule_prec_set (symbol *precsym, location loc) { + /* POSIX says that any identifier is a nonterminal if it does not + appear on the LHS of a grammar rule and is not defined by %token + or by one of the directives that assigns precedence to a token. We + ignore this here because the only kind of identifier that POSIX + allows to follow a %prec is a token and because assuming it's a + token now can produce more logical error messages. Nevertheless, + grammar_rule_check does obey what we believe is the real intent of + POSIX here: that an error be reported for any identifier that + appears after %prec but that is not defined separately as a + token. */ symbol_class_set (precsym, token_sym, loc, false); if (current_rule->ruleprec) complain_at (loc, _("only one %s allowed per rule"), "%prec"); @@ -449,14 +469,14 @@ grammar_current_rule_symbol_append (symbol *sym, location loc, void grammar_current_rule_action_append (const char *action, location loc, - named_ref *name) + named_ref *name, bool is_predicate) { 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, name); + current_rule, name, is_predicate); } @@ -497,6 +517,7 @@ packgram (void) rules[ruleno].useful = true; rules[ruleno].action = p->action_props.code; rules[ruleno].action_location = p->action_props.location; + rules[ruleno].is_predicate = p->action_props.is_predicate; /* If the midrule's $$ is set or its $n is used, remove the `$' from the symbol name so that it's a user-defined symbol so that the default @@ -608,10 +629,10 @@ prepare_percent_define_front_end_variables (void) char *lr_type; /* IELR would be a better default, but LALR is historically the default. */ - muscle_percent_define_default ("lr.type", "LALR"); + 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-reductions", "all"); + if (0 != strcmp (lr_type, "canonical-lr")) + muscle_percent_define_default ("lr.default-reductions", "most"); else muscle_percent_define_default ("lr.default-reductions", "accepting"); free (lr_type); @@ -620,8 +641,8 @@ prepare_percent_define_front_end_variables (void) /* Check %define front-end variables. */ { static char const * const values[] = { - "lr.type", "LALR", "IELR", "canonical LR", NULL, - "lr.default-reductions", "all", "consistent", "accepting", NULL, + "lr.type", "lalr", "ielr", "canonical-lr", NULL, + "lr.default-reductions", "most", "consistent", "accepting", NULL, NULL }; muscle_percent_define_check_values (values); @@ -641,9 +662,6 @@ check_and_convert_grammar (void) if (nrules == 0) fatal (_("no rules in the input grammar")); - /* Report any undefined symbols and consider them nonterminals. */ - symbols_check_defined (); - /* If the user did not define her ENDTOKEN, do it now. */ if (!endtoken) { @@ -654,6 +672,9 @@ check_and_convert_grammar (void) endtoken->user_token_number = 0; } + /* Report any undefined symbols and consider them nonterminals. */ + symbols_check_defined (); + /* Find the start symbol if no %start. */ if (!start_flag) {