[PATCH 11/17] multistart: toy with it in lexcalc

Akim Demaille <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches
Message-ID <[email protected]>
* examples/c/lexcalc/parse.y: Define several start symbols.
* examples/c/lexcalc/lexcalc.test: Check support.
---
 examples/c/lexcalc/lexcalc.test | 23 +++++++++++++++++++++++
 examples/c/lexcalc/parse.y      | 18 ++++++++++++++++--
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/examples/c/lexcalc/lexcalc.test b/examples/c/lexcalc/lexcalc.test
index 48a51575..ef02f6c1 100644
--- a/examples/c/lexcalc/lexcalc.test
+++ b/examples/c/lexcalc/lexcalc.test
@@ -20,6 +20,15 @@ cat >input <<EOF
 EOF
 run 0 7
 
+cat >input <<EOF
+1
+2
+3
+EOF
+run 0 '1
+2
+3'
+
 cat >input <<EOF
 (1+2) * 3
 EOF
@@ -35,3 +44,17 @@ cat >input <<EOF
 1 / (2 - 2)
 EOF
 run 1 'err: 1.1-11: error: division by zero'
+
+
+# Multistart: parse "line" instead of "input".
+cat >input <<EOF
+1+2*3
+EOF
+run 0 7 -l
+
+cat >input <<EOF
+1
+2
+EOF
+run 1 '1
+err: 2.1: syntax error, unexpected number, expecting end of file' -l
diff --git a/examples/c/lexcalc/parse.y b/examples/c/lexcalc/parse.y
index d06a2036..dfbf4349 100644
--- a/examples/c/lexcalc/parse.y
+++ b/examples/c/lexcalc/parse.y
@@ -36,6 +36,7 @@
 {
 #include <stdio.h>  // printf.
 #include <stdlib.h> // getenv.
+#include <string.h> // strcmp.
 }
 
 // Include the header in the implementation rather than duplicating it.
@@ -78,6 +79,8 @@
 %type <int> exp
 %printer { fprintf (yyo, "%d", $$); } <int>
 
+%start input line
+
 // Precedence (from lowest to highest) and associativity.
 %left "+" "-"
 %left "*" "/"
@@ -121,12 +124,23 @@ void yyerror (YYLTYPE *loc, int *nerrs, const char *msg)
   ++*nerrs;
 }
 
-int main (void)
+int main (int argc, const char *argv[])
 {
   int nerrs = 0;
   // Possibly enable parser runtime debugging.
   yydebug = !!getenv ("YYDEBUG");
-  yyparse (&nerrs);
+  // Enable parse traces on option -p.
+  int parse_line_p = 0;
+  for (int i = 0; i < argc; ++i)
+    if (1 < argc && strcmp (argv[1], "-p") == 0)
+      yydebug = 1;
+    else if (strcmp (argv[i], "-l") == 0)
+      parse_line_p = 1;
+
+  if (parse_line_p)
+    yyparse_line (&nerrs);
+  else
+    yyparse_input (&nerrs);
   // Exit on failure if there were errors.
   return !!nerrs;
 }
-- 
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.