glr2.cc: rely on symbol kinds rather than token kinds

Instead of tracking the lookahead with yychar, use yytoken.  This is
consistent with lalr1.cc, saves us from calls to YYTRANSLATE (except
when calling yylex), and makes it easier to migrate to using
symbol_type.

* data/skeletons/glr2.cc: Replace all uses of `int yychar` with
`symbol_kind_type yytoken`.
(yygetToken): Don't take/return the lookahead's token-kind and
symbol-kind, just work directly on yystack's `yytoken` member.

* tests/glr-regression.at (AT_PRINT_LOOKAHEAD_DECLARE)
(AT_PRINT_LOOKAHEAD_DEFINE): New.
Adjust to the fact that we have yytoken, not yychar, in glr2.cc.
This commit is contained in:
Akim Demaille
2021-01-10 08:17:11 +01:00
parent 47612d987b
commit 3fa59c32fc
2 changed files with 155 additions and 144 deletions

View File

@@ -38,6 +38,63 @@ yyparse ()
]])])
# AT_PRINT_LOOKAHEAD_DECLARE
# --------------------------
m4_define([AT_PRINT_LOOKAHEAD_DECLARE],
[AT_GLR2_CC_IF(
[[ static void
print_lookahead (int yytoken, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
char const *reduction);
#define PRINT_LOOKAHEAD(Msg) \
print_lookahead (yytoken, &yylval, &yylloc, Msg)
]],
[[ static void
print_lookahead (int yychr, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
char const *reduction);
#define PRINT_LOOKAHEAD(Msg) \
print_lookahead (yychar, &yylval, &yylloc, Msg)
]])])
# AT_PRINT_LOOKAHEAD_DEFINE
# -------------------------
m4_define([AT_PRINT_LOOKAHEAD_DEFINE],
[AT_GLR2_CC_IF(
[[static void
print_lookahead (int yytoken, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
char const *reduction)
]],
[[static void
print_lookahead (int yychr, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
char const *reduction)
]])[
{
]AT_GLR2_CC_IF([[
int yychr
= yytoken == YYTRANSLATE (]AT_TOKEN([YYEMPTY])[) ? -2
: yytoken == YYTRANSLATE (]AT_TOKEN([YYEOF])[) ? 0
: yytoken == YYTRANSLATE ('a') ? 'a'
: yytoken == YYTRANSLATE ('b') ? 'b'
: '?';
]])[
printf ("%s:\n yychar=", reduction);
if (yychr == ]AT_TOKEN([YYEMPTY])[)
printf ("YYEMPTY");
else if (yychr == ]AT_TOKEN([YYEOF])[)
printf ("YYEOF");
else
{
printf ("'%c', yylval='", yychr);
if (yylvalp->value > ' ')
printf ("%c", yylvalp->value);
printf ("', yylloc=(%d,%d),(%d,%d)",
yyllocp->]AT_FIRST_LINE[, yyllocp->]AT_FIRST_COLUMN[,
yyllocp->]AT_LAST_LINE[, yyllocp->]AT_LAST_COLUMN[);
}
printf ("\n");
}
]])
## ---------------------------- ##
## Badly Collapsed GLR States. ##
## ---------------------------- ##
@@ -1266,12 +1323,8 @@ AT_DATA_GRAMMAR([glr-regr13.y],
#include <assert.h>
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
static void
print_lookahead (int yychr, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
char const *reduction);
#define PRINT_LOOKAHEAD(Msg) \
print_lookahead (yychar, &yylval, &yylloc, Msg)
#define USE(value)
]AT_PRINT_LOOKAHEAD_DECLARE[
#define USE(value)
}
%define parse.assert
@@ -1330,7 +1383,7 @@ nondefstate:
change_lookahead:
%empty
{
yychar = 'a';
]AT_GLR2_CC_IF([[yytoken = YYTRANSLATE ('a')]], [[yychar = 'a']])[;
}
;
@@ -1338,30 +1391,10 @@ change_lookahead:
]AT_YYERROR_DEFINE[
]AT_YYPARSE_DEFINE[
]AT_PRINT_LOOKAHEAD_DEFINE[
]AT_YYLEX_DEFINE(["ab"],
[]AT_VAL[.value = YY_CAST (char, res + 'A' - 'a')])[
static void
print_lookahead (int yychr, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
char const *reduction)
{
printf ("%s:\n yychar=", reduction);
if (yychr == ]AT_TOKEN([YYEMPTY])[)
printf ("YYEMPTY");
else if (yychr == ]AT_TOKEN([YYEOF])[)
printf ("YYEOF");
else
{
printf ("'%c', yylval='", yychr);
if (yylvalp->value > ' ')
printf ("%c", yylvalp->value);
printf ("', yylloc=(%d,%d),(%d,%d)",
yyllocp->]AT_FIRST_LINE[, yyllocp->]AT_FIRST_COLUMN[,
yyllocp->]AT_LAST_LINE[, yyllocp->]AT_LAST_COLUMN[);
}
printf ("\n");
}
int
main (void)
{
@@ -1448,11 +1481,7 @@ AT_DATA_GRAMMAR([glr-regr14.y],
#include <assert.h>
]AT_YYERROR_DECLARE[
]AT_YYLEX_DECLARE[
static void
print_lookahead (int yychr, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
char const *reduction);
#define PRINT_LOOKAHEAD(Msg) \
print_lookahead (yychar, &yylval, &yylloc, Msg)
]AT_PRINT_LOOKAHEAD_DECLARE[
static char merge (]AT_YYSTYPE[, ]AT_YYSTYPE[);
#define USE(value)
}
@@ -1534,8 +1563,10 @@ alt1:
'd' no_look
{
USE ($][1);
if (yychar != 'd' && yychar != ]AT_GLR2_CC_IF([yy::parser::token::])[YYEOF)
fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
if (]AT_GLR2_CC_IF(
[[yytoken != YYTRANSLATE('d') && yytoken != symbol_kind::S_YYEOF]],
[[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([yy::parser::token::])[YYEOF]])[)
PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
}
;
@@ -1543,25 +1574,31 @@ alt2:
'd' no_look
{
USE ($][1);
if (yychar != 'd' && yychar != ]AT_GLR2_CC_IF([yy::parser::token::])[YYEOF)
fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
if (]AT_GLR2_CC_IF(
[[yytoken != YYTRANSLATE('d') && yytoken != symbol_kind::S_YYEOF]],
[[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([yy::parser::token::])[YYEOF]])[)
PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
}
;
alt3:
'd' no_look {
USE ($][1);
if (yychar != 'd' && yychar != ]AT_GLR2_CC_IF([yy::parser::token::])[YYEOF)
fprintf (stderr, "Incorrect lookahead during stack explosion.\n");
}
'd' no_look
{
USE ($][1);
if (]AT_GLR2_CC_IF(
[[yytoken != YYTRANSLATE('d') && yytoken != symbol_kind::S_YYEOF]],
[[yychar != 'd' && yychar != ]AT_GLR2_CC_IF([yy::parser::token::])[YYEOF]])[)
PRINT_LOOKAHEAD ("Incorrect lookahead during stack explosion.");
}
;
no_look:
%empty
{
if (yychar != ]AT_GLR2_CC_IF([yy::parser::token::])[YYEMPTY)
fprintf (stderr,
"Found lookahead where shouldn't during stack explosion.\n");
if (]AT_GLR2_CC_IF(
[[yytoken != symbol_kind::S_YYEMPTY]],
[[yychar != ]AT_GLR2_CC_IF([yy::parser::token::])[YYEMPTY]])[)
PRINT_LOOKAHEAD ("Found lookahead where shouldn't during stack explosion.");
}
;
@@ -1569,6 +1606,8 @@ no_look:
]AT_YYERROR_DEFINE[
]AT_YYPARSE_DEFINE[
]AT_PRINT_LOOKAHEAD_DEFINE[
]AT_YYLEX_PROTOTYPE[
{
]AT_USE_LEX_ARGS[
@@ -1587,28 +1626,6 @@ merge (]AT_YYSTYPE[ s1, ]AT_YYSTYPE[ s2)
return YY_CAST (char, s1.value + s2.value);
}
/* FIXME: Factor duplicate. Possibly use yy_symbol_print. */
static void
print_lookahead (int yychr, ]AT_YYSTYPE[ *yylvalp, ]AT_YYLTYPE[ *yyllocp,
char const *reduction)
{
printf ("%s:\n yychar=", reduction);
if (yychr == ]AT_TOKEN([YYEMPTY])[)
printf ("YYEMPTY");
else if (yychr == ]AT_TOKEN([YYEOF])[)
printf ("YYEOF");
else
{
printf ("'%c', yylval='", yychr);
if (yylvalp->value > ' ')
printf ("%c", yylvalp->value);
printf ("', yylloc=(%d,%d),(%d,%d)",
yyllocp->]AT_FIRST_LINE[, yyllocp->]AT_FIRST_COLUMN[,
yyllocp->]AT_LAST_LINE[, yyllocp->]AT_LAST_COLUMN[);
}
printf ("\n");
}
int
main (void)
{