From a70e75b8a41755ab96ab211a0ea111ac68a4aadd Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 19 Aug 2021 09:16:00 +0200 Subject: [PATCH] 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. * examples/c/lexcalc/lexcalc.test, examples/c/lexcalc/parse.y, * examples/c/lexcalc/scan.l: Revert to a single-start example. --- TODO | 3 --- examples/c/lexcalc/lexcalc.test | 21 ++------------- examples/c/lexcalc/parse.y | 48 ++++++++++----------------------- examples/c/lexcalc/scan.l | 4 +-- 4 files changed, 18 insertions(+), 58 deletions(-) diff --git a/TODO b/TODO index 2e6e7d5a..4ef16d8d 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,3 @@ -* 3.8 -Don't showcase multi start. - * Soon ** scan-code The default case is scanning char-per-char. 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 <input <input <input < NUM "number" -%type exp expression line +%type exp %printer { fprintf (yyo, "%d", $$); } -%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; <> return TOK_YYEOF; %%