mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-17 08:13:02 +00:00
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:
3
TODO
3
TODO
@@ -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.
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
%%
|
%%
|
||||||
|
|||||||
Reference in New Issue
Block a user