[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
glr2.cc: get rid of the yyerror scaffolding
From: |
Akim Demaille |
Subject: |
glr2.cc: get rid of the yyerror scaffolding |
Date: |
Sat, 5 Sep 2020 07:45:55 +0200 |
With more TODO :)
commit f3f7f6e1dca60cae09146f0a6439477a055567e1
Author: Akim Demaille <akim.demaille@gmail.com>
Date: Sat Sep 5 07:37:34 2020 +0200
glr2.cc: get rid of the yyerror scaffolding
The yyerror stand-alone function was used to bounce from glr.c's call
to yyerror to glr.cc's parser.error. Now that glr.c is out of the
way, just directly use parser.error.
* data/skeletons/glr2.cc (yyerror): Remove.
Adjust callers.
(b4_yyerror_args, b4_lyyerror_args, b4_pure_formals): Remove.
Now unused.
diff --git a/TODO b/TODO
index 5e0149cd..5c3210d2 100644
--- a/TODO
+++ b/TODO
@@ -187,6 +187,13 @@ It should be a member of the parser object, see lalr1.cc.
Let the parser
object decide what the debug stream is, rather than open coding std::cerr.
And use YYCDEBUG rather than YY_DEBUG_STREAM.
+*** Avoid pointers
+There are many places where pointers should be replaced with references.
+
+*** Use proper type names
+Don't use YYSTYPE and YYLTYPE but parser::semantic_type and
+parser::location_type. Undefine YYSTYPE and YYLTYPE.
+
* Chains
** Unit rules / Injection rules (Akim Demaille)
Maybe we could expand unit rules (or "injections", see
diff --git a/data/skeletons/glr2.cc b/data/skeletons/glr2.cc
index 81ee2299..b69a74bb 100644
--- a/data/skeletons/glr2.cc
+++ b/data/skeletons/glr2.cc
@@ -86,15 +86,6 @@ yy_symbol_print (FILE *,
]b4_namespace_ref[::]b4_parser_class[& yyparser, ]b4_na
[yylloc.initialize ();]m4_ifdef([b4_initial_action], [
m4_defn([b4_initial_action])]))])[
-# Hijack the post prologue to declare yyerror.
-]m4_append([b4_post_prologue],
-[b4_syncline([@oline@], [@ofile@])dnl
-[static void
-yyerror (]b4_namespace_ref[::]b4_parser_class[& yyparser,
]b4_locations_if([[const ]b4_namespace_ref::b4_parser_class[::location_type
*yylocationp,
- ]])[]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param),
- ])[const std::string& msg);]])[
-
-
]m4_define([b4_define_symbol_kind],
[m4_format([#define %-15s %s],
b4_symbol($][1, kind_base),
@@ -396,32 +387,16 @@ m4_define([b4_user_formals],
[m4_ifset([b4_parse_param], [, b4_user_formals_no_comma])])
# b4_user_formals_no_comma
-# ---------------
+# ------------------------
# The possible parse-params formal arguments.
m4_define([b4_user_formals_no_comma],
[m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)])])
-# b4_yyerror_args
-# ---------------
-# Optional effective arguments passed to yyerror: user args plus yylloc, and
-# a trailing comma.
-m4_define([b4_yyerror_args],
-[yyparser, b4_pure_if([b4_locations_if([yylocp, ])])dnl
-m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
-
-
-
-# b4_lyyerror_args
-# ----------------
-# Same as above, but on the lookahead, hence &yylloc instead of yylocp.
-m4_define([b4_lyyerror_args],
-[yyparser, []b4_pure_if([b4_locations_if([&yylloc, ])])dnl
-m4_ifset([b4_parse_param], [b4_args(b4_parse_param), ])])
-
# b4_pure_args
# ------------
-# Same as b4_yyerror_args, but with a leading comma.
+# Optional effective arguments passed to yyerror: user args plus yylloc, and
+# a leading comma.
m4_define([b4_pure_args],
[b4_pure_if([b4_locations_if([, yylocp])])[]b4_user_args])
@@ -433,14 +408,6 @@ m4_define([b4_lpure_args],
[b4_pure_if([b4_locations_if([, &yylloc])])[]b4_user_args])
-
-# b4_pure_formals
-# ---------------
-# Arguments passed to yyerror: user formals plus yylocp with leading comma.
-m4_define([b4_pure_formals],
-[b4_pure_if([b4_locations_if([, YYLTYPE *yylocp])])[]b4_user_formals])
-
-
# b4_locuser_formals(LOC = yylocp)
# --------------------------------
# User formal arguments, possibly preceded by location argument.
@@ -1733,7 +1700,7 @@ struct yyStateStack {
YYRESULTTAG
yyreportAmbiguity (yySemanticOption* yyx0,
- yySemanticOption* yyx1,
]b4_namespace_ref[::]b4_parser_class[& yyparser]b4_pure_formals[)
+ yySemanticOption* yyx1,
]b4_namespace_ref[::]b4_parser_class[& yyparser]b4_locations_if([, YYLTYPE
*yylocp])[)
{
YYUSE (yyx0);
YYUSE (yyx1);
@@ -1747,7 +1714,7 @@ struct yyStateStack {
std::cerr << "\n";
#endif
- yyerror (]b4_yyerror_args[YY_("syntax is ambiguous"));
+ yyparser.error (]b4_locations_if([*yylocp, ])[YY_("syntax is ambiguous"));
return yyabort;
}
@@ -1895,7 +1862,7 @@ struct yyGLRStack {
yyFail (]b4_locations_if([YYLTYPE* yylocp, ])[const char* yymsg)
{
if (yymsg != YY_NULLPTR)
- yyerror (]b4_yyerror_args[yymsg);
+ yyparser.error (]b4_locations_if([*yylocp, ])[yymsg);
YYLONGJMP (yyexception_buffer, 1);
}
@@ -1937,7 +1904,7 @@ struct yyGLRStack {
return;
]b4_parse_error_bmatch(
[simple],
-[[ yyerror (]b4_lyyerror_args[YY_("syntax error"));]],
+[[ yyparser.error (]b4_locations_if([yylloc, ])[YY_("syntax error"));]],
[[ {
]b4_namespace_ref::b4_parser_class[::symbol_kind_type yytoken
= yychar == ]b4_namespace_ref::b4_parser_class::token::b4_symbol(-2, id)[
@@ -2030,7 +1997,7 @@ struct yyGLRStack {
}
else
yymsg += *yyp;
- yyerror (]b4_lyyerror_args[yymsg);
+ yyparser.error (]b4_locations_if([[yylloc, ]])[yymsg);
}
]])[
yynerrs += 1;
@@ -2231,7 +2198,7 @@ struct yyGLRStack {
# define yyclearin (yychar =
]b4_namespace_ref::b4_parser_class::token::b4_symbol(-2, id)[)
# undef YYBACKUP
# define YYBACKUP(Token, Value)
\
- return yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")),
\
+ return yyparser.error (]b4_locations_if([*yylocp, ])[YY_("syntax error:
cannot back up")), \
yyerrok, yyerr
yylow = 1;
@@ -2259,7 +2226,7 @@ struct yyGLRStack {
{
YY_DEBUG_STREAM << "Caught exception: " << yyexc.what() <<
'\n';]b4_locations_if([
*yylocp = yyexc.location;])[
- yyerror (]b4_yyerror_args[yyexc.what ());
+ yyparser.error (]b4_locations_if([*yylocp, ])[yyexc.what ());
YYERROR;
}
#endif // YY_EXCEPTIONS
@@ -2530,7 +2497,7 @@ struct yyGLRStack {
{
case 0:]b4_locations_if([[
yyresolveLocations (yys, 1);]])[
- return yystateStack.yyreportAmbiguity (yybest, yyp,
yyparser]b4_pure_args[);
+ return yystateStack.yyreportAmbiguity (yybest, yyp,
yyparser]b4_locations_if([, yylocp])[);
break;
case 1:
yymerge = true;
@@ -2699,7 +2666,7 @@ yygetToken (int *yycharp,
]b4_namespace_ref[::]b4_parser_class[& yyparser][]b4_p
{
YY_DEBUG_STREAM << "Caught exception: " << yyexc.what() <<
"\n";]b4_locations_if([
yylloc = yyexc.location;])[
- yyerror (]b4_lyyerror_args[yyexc.what ());
+ yyparser.error (]b4_locations_if([yylloc, ])[yyexc.what ());
// Map errors caught in the scanner to the error token, so that error
// handling is started.
*yycharp = ]b4_namespace_ref::b4_parser_class::token::b4_symbol(1,
id)[;
@@ -3014,7 +2981,7 @@ b4_dollar_popdef])[]dnl
goto yyreturn;
yyexhaustedlab:
- yyerror (]b4_lyyerror_args[YY_("memory exhausted"));
+ yyparser.error (]b4_locations_if([yylloc, ])[YY_("memory exhausted"));
yyresult = 2;
goto yyreturn;
@@ -3057,15 +3024,6 @@ m4_if(b4_prefix, [yy], [],
| Report an error. |
`------------------*/
-static void
-yyerror (]b4_namespace_ref[::]b4_parser_class[& yyparser,
]b4_locations_if([[const ]b4_namespace_ref::b4_parser_class[::location_type
*yylocationp,
- ]])[]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param),
- ])[const std::string& msg)
-{
-]b4_parse_param_use[]dnl
-[ yyparser.error (]b4_locations_if([[*yylocationp, ]])[msg);
-}
-
]b4_namespace_open[
]dnl In this section, the parse params are the original parse_params.
- glr2.cc: get rid of the yyerror scaffolding,
Akim Demaille <=