/* Input parser for Bison
Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003,
- 2005, 2006, 2007 Free Software Foundation, Inc.
+ 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
#include <config.h>
#include "system.h"
+#include <quote.h>
#include <quotearg.h>
#include "complain.h"
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);
part of it. */
if (sym)
++nritems;
+
+ return p;
}
/* The rule currently being defined, and the previous rule.
`----------------------------------------------*/
void
-grammar_current_rule_begin (symbol *lhs, location loc)
+grammar_current_rule_begin (symbol *lhs, location loc,
+ named_ref *lhs_named_ref)
{
+ 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_named_ref)
+ {
+ if (lhs_named_ref->id == lhs->tag)
+ {
+ warn_at (lhs_named_ref->loc,
+ _("duplicated symbol name for %s ignored"),
+ quote (lhs->tag));
+ named_ref_free (lhs_named_ref);
+ }
+ else
+ p->named_ref = lhs_named_ref;
+ }
+
current_rule = grammar_end;
/* Mark the rule's lhs as a nonterminal if not already so. */
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 *named_ref = 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;
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)
/* 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, named_ref);
grammar_end->midrule = midrule;
midrule->midrule_parent_rule = current_rule;
midrule->midrule_parent_rhs_index = symbol_list_length (current_rule->next);
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 *named_ref)
{
+ symbol_list *p;
if (current_rule->action_props.code)
grammar_midrule_action ();
- grammar_symbol_append (sym, loc);
+ p = grammar_symbol_append (sym, loc);
+
+ if (named_ref)
+ {
+ if (named_ref->id == sym->tag)
+ {
+ warn_at (named_ref->loc,
+ _("duplicated symbol name for %s ignored"),
+ quote (sym->tag));
+ named_ref_free (named_ref);
+ }
+ else
+ p->named_ref = named_ref;
+ }
}
/* 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 *named_ref)
{
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, named_ref);
}
\f
gram_scanner_initialize ();
gram_parse ();
+ /* 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-reductions", "all");
+ else
+ muscle_percent_define_default ("lr.default-reductions", "accepting");
+ free (lr_type);
+ }
+
+ /* Check front-end %define variables. */
+ {
+ static char const * const values[] = {
+ "lr.type", "LALR", "IELR", "canonical LR", NULL,
+ "lr.default-reductions", "all", "consistent", "accepting", NULL,
+ NULL
+ };
+ muscle_percent_define_check_values (values);
+ }
+
if (! complaint_issued)
check_and_convert_grammar ();