d: add api.value.type union support

The union of the values is handled by the backend.
In D, unions can hold classes, structs, etc., so this is more similar
to the C++ api.value.type variant.

* data/skeletons/d.m4, data/skeletons/lalr1.d: Here.
* tests/calc.at, tests/local.at: Test it.
This commit is contained in:
Akim Demaille
2021-01-21 21:45:45 +01:00
parent a9c2549c27
commit ae0889d805
4 changed files with 124 additions and 11 deletions

View File

@@ -645,11 +645,11 @@ m4_define([_AT_DATA_CALC_Y(d)],
alias semantic_value = int;
}
/* Exercise %union. */
%union
]AT_UNION_IF([[]], [[%union
{
semantic_value ival;
};
%printer { yyo.write($$); } <ival>;
};]])[
%printer { yyo.write($$); } <]AT_UNION_IF([[int]], [[ival]])[>;
%code {
]AT_TOKEN_TRANSLATE_IF([[
@@ -670,8 +670,8 @@ m4_define([_AT_DATA_CALC_Y(d)],
/* Bison Declarations */
%token EOF 0 ]AT_TOKEN_TRANSLATE_IF([_("end of file")], ["end of input"])[
%token <ival> NUM "number"
%type <ival> exp
%token <]AT_UNION_IF([[int]], [[ival]])[> NUM "number"
%type <]AT_UNION_IF([[int]], [[ival]])[> exp
%token EQUAL "="
MINUS "-"
@@ -1499,6 +1499,7 @@ AT_CHECK_CALC_LALR1_D([%locations %define parse.lac full %define parse.error det
#AT_CHECK_CALC_LALR1_D([%locations %define parse.error detailed %debug %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
#AT_CHECK_CALC_LALR1_D([%locations %define parse.error detailed %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}])
AT_CHECK_CALC_LALR1_D([%define parse.error custom %define api.value.type union])
# ----------------------- #
# LALR1 Java Calculator. #

View File

@@ -319,6 +319,8 @@ m4_pushdef([AT_UNION_IF],
[m4_bmatch([$3], [%define api\.value\.type union], [$1], [$2])])
m4_pushdef([AT_VARIANT_IF],
[m4_bmatch([$3], [%define api\.value\.type variant], [$1], [$2])])
m4_pushdef([AT_UNION_IF],
[m4_bmatch([$3], [%define api\.value\.type union], [$1], [$2])])
m4_pushdef([AT_API_prefix],
[m4_bmatch([$3], [%define api\.prefix {.*}],
[m4_bregexp([$3], [%define api\.prefix {\([^\}]*\)}], [\1])],