#include "conflicts.h"
#include "muscle_tab.h"
-int lineno;
static symbol_list_t *grammar = NULL;
static int start_flag = 0;
merger_list *merge_functions;
`-------------------------------------------------------------------*/
static int
-get_merge_function (const char* name, const char* type)
+get_merge_function (const char* name, const char* type,
+ location_t loc)
{
merger_list *syms;
merger_list head;
for (syms = &head, n = 1; syms->next != NULL; syms = syms->next, n += 1)
if (strcmp (name, syms->next->name) == 0)
break;
- if (syms->next == NULL) {
- syms->next = XMALLOC (merger_list, 1);
- syms->next->name = strdup (name);
- syms->next->type = strdup (type);
- syms->next->next = NULL;
- merge_functions = head.next;
- } else if (strcmp (type, syms->next->type) != 0)
- warn (_("result type clash on merge function %s: `%s' vs. `%s'"),
- name, type, syms->next->type);
+ if (syms->next == NULL)
+ {
+ syms->next = XMALLOC (merger_list, 1);
+ syms->next->name = strdup (name);
+ syms->next->type = strdup (type);
+ syms->next->next = NULL;
+ merge_functions = head.next;
+ }
+ else if (strcmp (type, syms->next->type) != 0)
+ warn_at (loc, _("result type clash on merge function %s: `%s' vs. `%s'"),
+ name, type, syms->next->type);
return n;
}
if (current_rule->merger != 0)
complain_at (location, _("only one %%merge allowed per rule"));
current_rule->merger =
- get_merge_function (name, current_rule->sym->type_name);
+ get_merge_function (name, current_rule->sym->type_name, location);
}
/* Attach a SYMBOL to the current rule. If needed, move the previous
static void
packgram (void)
{
- unsigned int itemno;
- int ruleno;
- symbol_list_t *p;
+ unsigned int itemno = 0;
+ rule_number_t ruleno = 0;
+ symbol_list_t *p = grammar;
ritem = XCALLOC (item_number_t, nritems);
- rules = XCALLOC (rule_t, nrules) - 1;
+ rules = XCALLOC (rule_t, nrules);
- itemno = 0;
- ruleno = 1;
-
- p = grammar;
while (p)
{
symbol_t *ruleprec = p->ruleprec;
rules[ruleno].precsym = ruleprec;
rules[ruleno].prec = ruleprec;
}
- ritem[itemno++] = -ruleno;
+ ritem[itemno++] = rule_number_as_item_number (ruleno);
++ruleno;
if (p)
reader (void)
{
gram_control_t gram_control;
- lineno = 1;
/* Initialize the symbol table. */
symbols_new ();
scanner_initialize ();
gram_parse (&gram_control);
+ /* If something went wrong during the parsing, don't try to
+ continue. */
+ if (complain_message_count)
+ exit (1);
+
/* Grammar has been read. Do some checking */
if (nrules == 0)
fatal (_("no rules in the input grammar"));