diff options
author | Akim Demaille <akim.demaille@gmail.com> | 2021-08-19 09:16:00 +0200 |
---|---|---|
committer | Akim Demaille <akim.demaille@gmail.com> | 2021-08-19 09:19:07 +0200 |
commit | a70e75b8a41755ab96ab211a0ea111ac68a4aadd (patch) | |
tree | 10f1f953eda37301d99c7d10e482eddf82ebbc7a /examples | |
parent | 3afa9757da056e2dc2abf56b0abb7b4276c030d7 (diff) | |
download | bison-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.test | 21 | ||||
-rw-r--r-- | examples/c/lexcalc/parse.y | 48 | ||||
-rw-r--r-- | examples/c/lexcalc/scan.l | 4 |
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; %% |