summaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2021-08-07 09:30:24 +0200
committerAkim Demaille <akim.demaille@gmail.com>2021-08-07 12:53:19 +0200
commit80db1029e67e5d42fa6329489558b114fdfea880 (patch)
tree72f350019318187faa1d941c04eb79145cf996c0 /data
parent6118406c3eac88a06a414edf4a50b175fa339916 (diff)
downloadbison-80db1029e67e5d42fa6329489558b114fdfea880.tar.gz
m4: catch suspicions of unevaluated macros
Check in m4's output if there are sequences such as m4_foo or b4_foo, which are probably resulting from incorrect m4 processing. It actually already is useful: - it caught a leaking b4_lac_if leaking from glr.c, where LAC is not supported, hence b4_lac_if is not defined. - it also caught references to location.hh in position.hh when location.hh does not exist. - while making "Code injection" robust to these new warnings (it is its very purpose to let b4_canary pass unevaluated), I saw that it did not check lalr1.d, and when adding lalr1.d, it revealed it did underquote ocurrences of token value types. * src/scan-skel.l (macro): New abbreviation. Use it. * data/skeletons/glr.c: Don't use b4_lac_if, we don't have it. * data/skeletons/location.cc: Don't generate position.hh when we don't generate location.hh. * data/skeletons/d.m4 (b4_basic_symbol_constructor_define): Fix underquotation. * data/skeletons/bison.m4 (b4_canary): New. * tests/input.at (Code injection): Use it, and check lalr1.d too.
Diffstat (limited to 'data')
-rw-r--r--data/skeletons/bison.m47
-rw-r--r--data/skeletons/d.m44
-rw-r--r--data/skeletons/glr.c9
-rw-r--r--data/skeletons/location.cc17
4 files changed, 21 insertions, 16 deletions
diff --git a/data/skeletons/bison.m4 b/data/skeletons/bison.m4
index 6d92e4f9..488ad610 100644
--- a/data/skeletons/bison.m4
+++ b/data/skeletons/bison.m4
@@ -261,6 +261,13 @@ m4_define([b4_fatal_at],
[b4_error([[fatal]], $@)dnl
m4_exit(1)])
+# b4_canary(MSG)
+# --------------
+# Issue a warning on stderr and in the output. Used in the test suite
+# to catch spurious m4 evaluations.
+m4_define([b4_canary],
+[m4_errprintn([dead canary: $1])DEAD CANARY($1)])
+
## ------------ ##
## Data Types. ##
diff --git a/data/skeletons/d.m4 b/data/skeletons/d.m4
index b69df1a7..c0632e47 100644
--- a/data/skeletons/d.m4
+++ b/data/skeletons/d.m4
@@ -586,7 +586,7 @@ alias ACCEPT = ]b4_parser_class[.YYACCEPT;]])[]])[
# Create Symbol struct constructors for all the visible types.
m4_define([b4_basic_symbol_constructor_define],
[b4_token_visible_if([$1],
-[ this(TokenKind token]b4_symbol_if([$1], [has_type],
+[[ this(TokenKind token]b4_symbol_if([$1], [has_type],
[[, ]b4_union_if([], [[typeof(YYSemanticType.]])b4_symbol([$1], [type])dnl
[]b4_union_if([], [[) ]])[ val]])[]b4_locations_if([[, Location loc]])[)
{
@@ -601,7 +601,7 @@ m4_define([b4_basic_symbol_constructor_define],
value_.]b4_symbol([$1], [type])[ = val;]])])[]b4_locations_if([
location_ = loc;])[
}
-])])
+]])])
# b4_symbol_type_define
diff --git a/data/skeletons/glr.c b/data/skeletons/glr.c
index 1f956955..70ab8b1d 100644
--- a/data/skeletons/glr.c
+++ b/data/skeletons/glr.c
@@ -2204,12 +2204,7 @@ yy_syntax_error_arguments (const yyGLRStack* yystackp,
- Don't assume there isn't a lookahead just because this state is a
consistent state with a default action. There might have been a
previous inconsistent state, consistent state with a non-default
- action, or user semantic action that manipulated yychar.]b4_lac_if([[
- In the first two cases, it might appear that the current syntax
- error should have been detected in the previous state when yy_lac
- was invoked. However, at that time, there might have been a
- different syntax error that discarded a different initial context
- during error recovery, leaving behind the current lookahead.]], [[
+ action, or user semantic action that manipulated yychar.
- Of course, the expected token list depends on states to have
correct lookahead information, and it depends on the parser not
to perform extra reductions after fetching a lookahead from the
@@ -2217,7 +2212,7 @@ yy_syntax_error_arguments (const yyGLRStack* yystackp,
(from LALR or IELR) and default reductions corrupt the expected
token list. However, the list is correct for canonical LR with
one exception: it will still contain any token that will not be
- accepted due to an error action in a later state.]])[
+ accepted due to an error action in a later state.
*/
if (yytoken != ]b4_symbol(empty, kind)[)
{
diff --git a/data/skeletons/location.cc b/data/skeletons/location.cc
index b32c1377..3870b2bc 100644
--- a/data/skeletons/location.cc
+++ b/data/skeletons/location.cc
@@ -19,13 +19,6 @@ m4_pushdef([b4_copyright_years],
[2002-2015, 2018-2021])
-# b4_position_file
-# ----------------
-# Name of the file containing the position class, if we want this file.
-b4_header_if([b4_required_version_if([30200], [],
- [m4_define([b4_position_file], [position.hh])])])])
-
-
# b4_location_file
# ----------------
# Name of the file containing the position/location class,
@@ -54,6 +47,16 @@ m4_ifdef([b4_location_file],
])
+# b4_position_file
+# ----------------
+# Name of the file containing the position class, if we want this file.
+b4_header_if(
+ [b4_required_version_if(
+ [30200], [],
+ [m4_ifdef([b4_location_file],
+ [m4_define([b4_position_file], [position.hh])])])])
+
+
# b4_location_define
# ------------------