From e50ec281531a3c39757cfc69c9dfd3efa586c0d0 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 20 Feb 2020 18:10:45 +0100 Subject: [PATCH] reader: get ready to create several initial rules * src/reader.c (create_start_rule): New. Use it. --- src/reader.c | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/reader.c b/src/reader.c index 0f9b7ee4..6932decd 100644 --- a/src/reader.c +++ b/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 | | internal form. | @@ -801,21 +828,8 @@ check_and_convert_grammar (void) grammar_start_symbol_set (start, start->location); } - /* Insert the initial rule, whose line is that of the first rule - (not that of the start symbol): - - $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; - } + /* Insert the initial rule. */ + create_start_rule (NULL, startsymbol); if (SYMBOL_NUMBER_MAXIMUM - nnterms < ntokens) complain (NULL, fatal, "too many symbols in input grammar (limit is %d)",