summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2021-08-19 09:16:00 +0200
committerAkim Demaille <akim.demaille@gmail.com>2021-08-19 09:19:07 +0200
commita70e75b8a41755ab96ab211a0ea111ac68a4aadd (patch)
tree10f1f953eda37301d99c7d10e482eddf82ebbc7a /examples
parent3afa9757da056e2dc2abf56b0abb7b4276c030d7 (diff)
downloadbison-a70e75b8a41755ab96ab211a0ea111ac68a4aadd.tar.gz
examples: don't demonstrate multistart, which is not part of 3.8
Besides, for mysterious reasons, this fails on some environment. Reported by Dagobert Michelsen. <https://lists.gnu.org/archive/html/bug-bison/2021-08/msg00008.html> * examples/c/lexcalc/lexcalc.test, examples/c/lexcalc/parse.y, * examples/c/lexcalc/scan.l: Revert to a single-start example.
Diffstat (limited to 'examples')
-rw-r--r--examples/c/lexcalc/lexcalc.test21
-rw-r--r--examples/c/lexcalc/parse.y48
-rw-r--r--examples/c/lexcalc/scan.l4
3 files changed, 18 insertions, 55 deletions
diff --git a/examples/c/lexcalc/lexcalc.test b/examples/c/lexcalc/lexcalc.test
index df8da33b..7559a21e 100644
--- a/examples/c/lexcalc/lexcalc.test
+++ b/examples/c/lexcalc/lexcalc.test
@@ -38,26 +38,9 @@ run -noerr 0 9 -p
cat >input <<EOF
(1+2) *
EOF
-run 1 'err: 1.8-2.0: syntax error, unexpected end of line, expecting ( or number
-err: errors: 1'
+run 1 'err: 1.8-2.0: syntax error, unexpected end of line, expecting ( or number'
cat >input <<EOF
1 / (2 - 2)
EOF
-run 1 'err: 1.1-11: error: division by zero
-err: errors: 1'
-
-
-# Multistart: parse "expression" instead of "input".
-cat >input <<EOF
-1+2*3
-EOF
-run 0 'expression: 7' -e
-
-cat >input <<EOF
-1
-2
-EOF
-run 1 'expression: failure
-err: 2.1: syntax error, unexpected number, expecting end of file
-err: errors: 1' -e
+run 1 'err: 1.1-11: error: division by zero'
diff --git a/examples/c/lexcalc/parse.y b/examples/c/lexcalc/parse.y
index aa72a410..ee559887 100644
--- a/examples/c/lexcalc/parse.y
+++ b/examples/c/lexcalc/parse.y
@@ -25,10 +25,10 @@
{
// Tell Flex the expected prototype of yylex.
#define YY_DECL \
- yytoken_kind_t yylex (YYSTYPE* yylval, YYLTYPE *yylloc)
+ yytoken_kind_t yylex (YYSTYPE* yylval, YYLTYPE *yylloc, int *nerrs)
YY_DECL;
- void yyerror (const YYLTYPE *loc, const char *msg);
+ void yyerror (const YYLTYPE *loc, int *nerrs, const char *msg);
}
// Emitted on top of the implementation file.
@@ -62,6 +62,9 @@
// Enable debug traces (see yydebug in main).
%define parse.trace
+// Error count, exchanged between main, yyparse and yylex.
+%param {int *nerrs}
+
%token
PLUS "+"
MINUS "-"
@@ -73,11 +76,9 @@
;
%token <int> NUM "number"
-%type <int> exp expression line
+%type <int> exp
%printer { fprintf (yyo, "%d", $$); } <int>
-%start input expression NUM
-
// Precedence (from lowest to highest) and associativity.
%left "+" "-"
%left "*" "/"
@@ -90,12 +91,8 @@ input:
;
line:
- exp EOL { $$ = $exp; printf ("%d\n", $$); }
-| error EOL { $$ = 0; yyerrok; }
-;
-
-expression:
- exp EOL { $$ = $exp; }
+ exp EOL { printf ("%d\n", $exp); }
+| error EOL { yyerrok; }
;
exp:
@@ -106,7 +103,7 @@ exp:
{
if ($3 == 0)
{
- yyerror (&@$, "error: division by zero");
+ yyerror (&@$, nerrs, "error: division by zero");
YYERROR;
}
else
@@ -118,41 +115,24 @@ exp:
%%
// Epilogue (C code).
-void yyerror (const YYLTYPE *loc, const char *msg)
+void yyerror (const YYLTYPE *loc, int *nerrs, const char *msg)
{
YYLOCATION_PRINT (stderr, loc);
fprintf (stderr, ": %s\n", msg);
+ ++*nerrs;
}
int main (int argc, const char *argv[])
{
// Possibly enable parser runtime debugging.
yydebug = !!getenv ("YYDEBUG");
- int parse_expression_p = 0;
- int nerrs = 0;
-
// Enable parse traces on option -p.
for (int i = 1; i < argc; ++i)
- if (strcmp (argv[i], "-e") == 0)
- parse_expression_p = 1;
- else if (strcmp (argv[i], "-p") == 0)
+ if (strcmp (argv[i], "-p") == 0)
yydebug = 1;
- if (parse_expression_p)
- {
- yyparse_expression_t res = yyparse_expression ();
- nerrs = res.yynerrs;
- if (res.yystatus == 0)
- printf ("expression: %d\n", res.yyvalue);
- else
- printf ("expression: failure\n");
- }
- else
- nerrs = yyparse_input ().yynerrs;
-
- if (nerrs)
- fprintf (stderr, "errors: %d\n", nerrs);
-
+ int nerrs = 0;
+ yyparse (&nerrs);
// Exit on failure if there were errors.
return !!nerrs;
}
diff --git a/examples/c/lexcalc/scan.l b/examples/c/lexcalc/scan.l
index 51129a56..983fbdaf 100644
--- a/examples/c/lexcalc/scan.l
+++ b/examples/c/lexcalc/scan.l
@@ -61,7 +61,7 @@
errno = 0;
long n = strtol (yytext, NULL, 10);
if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
- yyerror (yylloc, "integer is out of range");
+ yyerror (yylloc, nerrs, "integer is out of range");
yylval->TOK_NUM = (int) n;
return TOK_NUM;
}
@@ -71,7 +71,7 @@
/* Ignore white spaces. */
[ \t]+ LOCATION_STEP (); continue;
-. yyerror (yylloc, "syntax error, invalid character"); continue;
+. yyerror (yylloc, nerrs, "syntax error, invalid character"); continue;
<<EOF>> return TOK_YYEOF;
%%