no-lines: avoid leaving an empty line instead of the syncline

Currently, with --no-lines, instead of "#line file line\n", we emit
"\n".  Let's emit nothing.

* data/skeletons/bison.m4 (b4_syncline): Emit at end-of-line when enabled.
* data/skeletons/bison.m4, data/skeletons/c.m4, data/skeletons/glr.cc,
* data/skeletons/lalr1.cc, src/output.c: Use dnl after b4_syncline to
avoid spurious empty lines.

* tests/synclines.at (Sync Lines): Make sure that --no-lines is like
grep -v #line.
* tests/calc.at: Make sure that a rich grammar file behaves properly
with %no-lines.
This commit is contained in:
Akim Demaille
2019-04-01 18:23:20 +02:00
parent 9832fdd6ef
commit 0f193d2d21
11 changed files with 71 additions and 37 deletions

View File

@@ -448,9 +448,9 @@ m4_define([b4_symbol_action],
[],
[(*yylocationp)])dnl
_b4_symbol_case([$1])[]dnl
b4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])
b4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])dnl
b4_symbol([$1], [$2])
b4_syncline([@oline@], [@ofile@])
b4_syncline([@oline@], [@ofile@])dnl
break;
b4_dollar_popdef[]dnl
@@ -579,13 +579,15 @@ m4_define([b4_basename],
[m4_bpatsubst([$1], [^.*/\([^/]+\)/*$], [\1])])
# b4_syncline(LINE, FILE)
# -----------------------
# b4_syncline(LINE, FILE)dnl
# --------------------------
# Should always be following by a dnl.
#
# Emit "#line LINE FILE /* __LINE__ __FILE__ */".
m4_define([b4_syncline],
[b4_flag_if([synclines],
[b4_sync_start([$1], [$2])[]dnl
b4_sync_end([__line__], [b4_basename(m4_quote(__file__))])[]dnl
b4_sync_end([__line__], [b4_basename(m4_quote(__file__))])
])])
# b4_sync_start(LINE, FILE)
@@ -757,8 +759,10 @@ m4_define([b4_percent_define_get_kind],
[m4_indir([b4_percent_define_kind(]$1[)])],
[b4_fatal([[$0: undefined %%define variable '%s']], [$1])])])
# b4_percent_define_get_syncline(VARIABLE)
# ----------------------------------------
# b4_percent_define_get_syncline(VARIABLE)dnl
# -------------------------------------------
# Should always be following by a dnl.
#
# Mimic muscle_percent_define_get_syncline in ../src/muscle-tab.h exactly.
# That is, if the %define variable VARIABLE is undefined, complain fatally
# since that's a Bison or skeleton error. Otherwise, return its definition
@@ -974,8 +978,7 @@ m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])dnl
m4_ifdef(b4_macro_name,
[b4_comment([m4_if([$#], [0], [[Unqualified %code]],
[["%code ]$1["]])[ blocks.]])
b4_user_code([m4_indir(b4_macro_name)])
])dnl
b4_user_code([m4_indir(b4_macro_name)])])dnl
m4_popdef([b4_macro_name])])
# b4_percent_code_ifdef(QUALIFIER, IF-TRUE, [IF-FALSE])

View File

@@ -147,13 +147,13 @@ m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*$]), [-1], [],
[[namespace reference has a trailing "::"]])])
m4_define([b4_namespace_open],
[b4_user_code([b4_percent_define_get_syncline([[api.namespace]])
[b4_user_code([b4_percent_define_get_syncline([[api.namespace]])dnl
[namespace ]m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref),
[^\(.\)[ ]*::], [\1])),
[::], [ { namespace ])[ {]])])
m4_define([b4_namespace_close],
[b4_user_code([b4_percent_define_get_syncline([[api.namespace]])
[b4_user_code([b4_percent_define_get_syncline([[api.namespace]])dnl
m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]),
[^\(.\)[ ]*\(::\)?\([^][:]\|:[^:]\)*],
[\1])),
@@ -194,7 +194,7 @@ m4_define([b4_value_type_declare],
[union\|union-directive],
[[ union semantic_type
{
]b4_user_union_members[
]b4_user_union_members[
};]])])dnl
])

View File

@@ -474,7 +474,7 @@ m4_define([b4_sync_start], [[#]line $1 $2])
m4_define([b4_case],
[ case $1:
$2
b4_syncline([@oline@], [@ofile@])
b4_syncline([@oline@], [@ofile@])dnl
break;])
@@ -484,7 +484,7 @@ m4_define([b4_predicate_case],
[ case $1:
if (! (
$2)) YYERROR;
b4_syncline([@oline@], [@ofile@])
b4_syncline([@oline@], [@ofile@])dnl
break;])
@@ -713,13 +713,13 @@ typedef ]b4_percent_define_get([[api.value.type]])[ ]b4_api_PREFIX[STYPE;
[m4_bmatch(b4_percent_define_get([[api.value.type]]),
[union\|union-directive],
[[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
]b4_percent_define_get_syncline([[api.value.union.name]])[
union ]b4_percent_define_get([[api.value.union.name]])[
]b4_percent_define_get_syncline([[api.value.union.name]])dnl
[union ]b4_percent_define_get([[api.value.union.name]])[
{
]b4_user_union_members[
};
]b4_percent_define_get_syncline([[api.value.union.name]])[
typedef union ]b4_percent_define_get([[api.value.union.name]])[ ]b4_api_PREFIX[STYPE;
]b4_percent_define_get_syncline([[api.value.union.name]])dnl
[typedef union ]b4_percent_define_get([[api.value.union.name]])[ ]b4_api_PREFIX[STYPE;
# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1
# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
#endif

View File

@@ -202,8 +202,8 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C],
]b4_cpp_guard_open([b4_spec_header_file])[
]b4_shared_declarations[
]b4_cpp_guard_close([b4_spec_header_file])[
]b4_output_end
])])
]b4_output_end[
]])])
# ------------------------- #

View File

@@ -100,8 +100,8 @@ m4_defn([b4_initial_action])]))])[
# Hijack the post prologue to declare yyerror.
]m4_append([b4_post_prologue],
[b4_syncline([@oline@], [@ofile@])[
]b4_function_declare([yyerror],
[b4_syncline([@oline@], [@ofile@])dnl
b4_function_declare([yyerror],
[static void],b4_locations_if([
[[const ]b4_namespace_ref::b4_parser_class[::location_type *yylocationp],
[yylocationp]],])
@@ -128,8 +128,8 @@ m4_if(b4_prefix, [yy], [],
# Hijack the epilogue to define implementations (yyerror, parser member
# functions etc.).
m4_append([b4_epilogue],
[b4_syncline([@oline@], [@ofile@])[
[b4_syncline([@oline@], [@ofile@])dnl
[
/*------------------.
| Report an error. |
`------------------*/
@@ -234,7 +234,7 @@ m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
#endif
]m4_popdef([b4_parse_param])dnl
b4_namespace_close
b4_namespace_close[]dnl
])

View File

@@ -111,9 +111,9 @@ b4_dollar_pushdef([yysym.value],
[],
[yysym.location])dnl
_b4_symbol_case([$1])[]dnl
b4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])
b4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])dnl
b4_symbol([$1], [$2])
b4_syncline([@oline@], [@ofile@])
b4_syncline([@oline@], [@ofile@])dnl
break;
m4_popdef([b4_symbol_value])[]dnl
@@ -412,9 +412,9 @@ b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++])
]b4_disclaimer[
]b4_cpp_guard_open([b4_spec_header_file])[
]b4_shared_declarations(hh)[
]b4_cpp_guard_close([b4_spec_header_file])
b4_output_end
])
]b4_cpp_guard_close([b4_spec_header_file])[
]b4_output_end[
]])
b4_output_begin([b4_parser_file_name])[

View File

@@ -1699,7 +1699,7 @@ yyreduce:
}]], [[
switch (yyn)
{
]b4_user_actions[
]b4_user_actions[
default: break;
}]])[
/* User semantic actions sometimes alter yychar, and that requires