[PATCH 02/17] reader: get ready to create several initial rules

Akim Demaille <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches
Message-ID <[email protected]>
* 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)",
-- 
2.28.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.