d: add support for %printer

Currently we display the addresses of the semantic values.  Instead,
print the values.

Add support for YY_USE across languages.

* data/skeletons/c.m4, data/skeletons/d.m4 (b4_use): New.
* data/skeletons/bison.m4 (b4_symbol_actions): Use b4_use to be
portable to D.

Add support for %printer, and use it.

* data/skeletons/d.m4: Instead of duplicating what's already in
c-like.m4, include it.
(b4_symbol_action): New.
Differs from the one in bison.m4 in that it uses yyval/yyloc instead
of *yyvaluep and *yylocationp.

* data/skeletons/lalr1.d (yy_symbol_print): Avoid calls to formatting,
just call write directly.
Use the %printer.
* examples/d/calc/calc.y: Specify a printer.
Enable traces when $YYDEBUG is set.
* tests/calc.at: Fix the use of %printer with D.
This commit is contained in:
Akim Demaille
2021-01-06 19:22:18 +01:00
parent dc8b16424a
commit f859462658
6 changed files with 50 additions and 32 deletions

View File

@@ -399,20 +399,17 @@ b4_user_union_members
`--------------------------------*/
private final void yy_symbol_print (string s, SymbolKind yykind,
ref Value yyvaluep]dnl
b4_locations_if([, ref Location yylocationp])[)
ref Value yyval]b4_locations_if([, ref Location yyloc])[)
{
if (0 < yydebug)
{
string message = s ~ (yykind < yyntokens_ ? " token " : " nterm ")
~ format("%s", yykind) ~ " ("]b4_locations_if([
~ yylocationp.toString() ~ ": "])[;
static if (__traits(compiles, message ~= yyvaluep.toString()))
message ~= yyvaluep.toString();
else
message ~= format("%s", &yyvaluep);
message ~= ")";
yycdebugln (message);
File yyo = yyDebugStream;
yyo.write(s);
yyo.write(yykind < yyntokens_ ? " token " : " nterm ");
yyo.write(format("%s", yykind));
yyo.write(" ("]b4_locations_if([ ~ yyloc.toString() ~ ": "])[);
]b4_symbol_actions([printer])[
yyo.write(")\n");
}
}
]])[