mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-17 00:03:03 +00:00
reader: get ready to create several initial rules
* src/reader.c (create_start_rule): New. Use it.
This commit is contained in:
44
src/reader.c
44
src/reader.c
@@ -764,6 +764,33 @@ find_start_symbol (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Insert an initial rule, whose location is that of the first rule
|
||||||
|
(not that of the start symbol):
|
||||||
|
|
||||||
|
$accept: SWITCHING_TOKEN START $end. */
|
||||||
|
static void
|
||||||
|
create_start_rule (symbol *swtok, symbol *start)
|
||||||
|
{
|
||||||
|
symbol_list *initial_rule = symbol_list_sym_new (acceptsymbol, empty_loc);
|
||||||
|
initial_rule->rhs_loc = grammar->rhs_loc;
|
||||||
|
symbol_list *p = initial_rule;
|
||||||
|
if (swtok)
|
||||||
|
{
|
||||||
|
p->next = symbol_list_sym_new (swtok, empty_loc);
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
p->next = symbol_list_sym_new (start, empty_loc);
|
||||||
|
p = p->next;
|
||||||
|
p->next = symbol_list_sym_new (eoftoken, empty_loc);
|
||||||
|
p = p->next;
|
||||||
|
p->next = symbol_list_sym_new (NULL, empty_loc);
|
||||||
|
p = p->next;
|
||||||
|
p->next = grammar;
|
||||||
|
nrules += 1;
|
||||||
|
nritems += 3 + !!swtok;
|
||||||
|
grammar = initial_rule;
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------.
|
/*-------------------------------------------------------------.
|
||||||
| Check the grammar that has just been read, and convert it to |
|
| Check the grammar that has just been read, and convert it to |
|
||||||
| internal form. |
|
| internal form. |
|
||||||
@@ -801,21 +828,8 @@ check_and_convert_grammar (void)
|
|||||||
grammar_start_symbol_set (start, start->location);
|
grammar_start_symbol_set (start, start->location);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insert the initial rule, whose line is that of the first rule
|
/* Insert the initial rule. */
|
||||||
(not that of the start symbol):
|
create_start_rule (NULL, startsymbol);
|
||||||
|
|
||||||
$accept: %start $end. */
|
|
||||||
{
|
|
||||||
symbol_list *p = symbol_list_sym_new (acceptsymbol, empty_loc);
|
|
||||||
p->rhs_loc = grammar->rhs_loc;
|
|
||||||
p->next = symbol_list_sym_new (startsymbol, empty_loc);
|
|
||||||
p->next->next = symbol_list_sym_new (eoftoken, empty_loc);
|
|
||||||
p->next->next->next = symbol_list_sym_new (NULL, empty_loc);
|
|
||||||
p->next->next->next->next = grammar;
|
|
||||||
nrules += 1;
|
|
||||||
nritems += 3;
|
|
||||||
grammar = p;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SYMBOL_NUMBER_MAXIMUM - nnterms < ntokens)
|
if (SYMBOL_NUMBER_MAXIMUM - nnterms < ntokens)
|
||||||
complain (NULL, fatal, "too many symbols in input grammar (limit is %d)",
|
complain (NULL, fatal, "too many symbols in input grammar (limit is %d)",
|
||||||
|
|||||||
Reference in New Issue
Block a user