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.
This commit is contained in:
Akim Demaille
2021-08-19 09:16:00 +02:00
parent 3afa9757da
commit a70e75b8a4
4 changed files with 18 additions and 58 deletions

3
TODO
View File

@@ -1,6 +1,3 @@
* 3.8
Don't showcase multi start.
* Soon * Soon
** scan-code ** scan-code
The default case is scanning char-per-char. The default case is scanning char-per-char.

View File

@@ -38,26 +38,9 @@ run -noerr 0 9 -p
cat >input <<EOF cat >input <<EOF
(1+2) * (1+2) *
EOF EOF
run 1 'err: 1.8-2.0: syntax error, unexpected end of line, expecting ( or number run 1 'err: 1.8-2.0: syntax error, unexpected end of line, expecting ( or number'
err: errors: 1'
cat >input <<EOF cat >input <<EOF
1 / (2 - 2) 1 / (2 - 2)
EOF EOF
run 1 'err: 1.1-11: error: division by zero 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

View File

@@ -25,10 +25,10 @@
{ {
// Tell Flex the expected prototype of yylex. // Tell Flex the expected prototype of yylex.
#define YY_DECL \ #define YY_DECL \
yytoken_kind_t yylex (YYSTYPE* yylval, YYLTYPE *yylloc) yytoken_kind_t yylex (YYSTYPE* yylval, YYLTYPE *yylloc, int *nerrs)
YY_DECL; 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. // Emitted on top of the implementation file.
@@ -62,6 +62,9 @@
// Enable debug traces (see yydebug in main). // Enable debug traces (see yydebug in main).
%define parse.trace %define parse.trace
// Error count, exchanged between main, yyparse and yylex.
%param {int *nerrs}
%token %token
PLUS "+" PLUS "+"
MINUS "-" MINUS "-"
@@ -73,11 +76,9 @@
; ;
%token <int> NUM "number" %token <int> NUM "number"
%type <int> exp expression line %type <int> exp
%printer { fprintf (yyo, "%d", $$); } <int> %printer { fprintf (yyo, "%d", $$); } <int>
%start input expression NUM
// Precedence (from lowest to highest) and associativity. // Precedence (from lowest to highest) and associativity.
%left "+" "-" %left "+" "-"
%left "*" "/" %left "*" "/"
@@ -90,12 +91,8 @@ input:
; ;
line: line:
exp EOL { $$ = $exp; printf ("%d\n", $$); } exp EOL { printf ("%d\n", $exp); }
| error EOL { $$ = 0; yyerrok; } | error EOL { yyerrok; }
;
expression:
exp EOL { $$ = $exp; }
; ;
exp: exp:
@@ -106,7 +103,7 @@ exp:
{ {
if ($3 == 0) if ($3 == 0)
{ {
yyerror (&@$, "error: division by zero"); yyerror (&@$, nerrs, "error: division by zero");
YYERROR; YYERROR;
} }
else else
@@ -118,41 +115,24 @@ exp:
%% %%
// Epilogue (C code). // 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); YYLOCATION_PRINT (stderr, loc);
fprintf (stderr, ": %s\n", msg); fprintf (stderr, ": %s\n", msg);
++*nerrs;
} }
int main (int argc, const char *argv[]) int main (int argc, const char *argv[])
{ {
// Possibly enable parser runtime debugging. // Possibly enable parser runtime debugging.
yydebug = !!getenv ("YYDEBUG"); yydebug = !!getenv ("YYDEBUG");
int parse_expression_p = 0;
int nerrs = 0;
// Enable parse traces on option -p. // Enable parse traces on option -p.
for (int i = 1; i < argc; ++i) for (int i = 1; i < argc; ++i)
if (strcmp (argv[i], "-e") == 0) if (strcmp (argv[i], "-p") == 0)
parse_expression_p = 1;
else if (strcmp (argv[i], "-p") == 0)
yydebug = 1; yydebug = 1;
if (parse_expression_p) int nerrs = 0;
{ yyparse (&nerrs);
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);
// Exit on failure if there were errors. // Exit on failure if there were errors.
return !!nerrs; return !!nerrs;
} }

View File

@@ -61,7 +61,7 @@
errno = 0; errno = 0;
long n = strtol (yytext, NULL, 10); long n = strtol (yytext, NULL, 10);
if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE)) 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; yylval->TOK_NUM = (int) n;
return TOK_NUM; return TOK_NUM;
} }
@@ -71,7 +71,7 @@
/* Ignore white spaces. */ /* Ignore white spaces. */
[ \t]+ LOCATION_STEP (); continue; [ \t]+ LOCATION_STEP (); continue;
. yyerror (yylloc, "syntax error, invalid character"); continue; . yyerror (yylloc, nerrs, "syntax error, invalid character"); continue;
<<EOF>> return TOK_YYEOF; <<EOF>> return TOK_YYEOF;
%% %%