xref: /aosp_15_r20/prebuilts/build-tools/common/bison/skeletons/d.m4 (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker                                                            -*- Autoconf -*-
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard Worker# D language support for Bison
4*cda5da8dSAndroid Build Coastguard Worker
5*cda5da8dSAndroid Build Coastguard Worker# Copyright (C) 2018-2021 Free Software Foundation, Inc.
6*cda5da8dSAndroid Build Coastguard Worker
7*cda5da8dSAndroid Build Coastguard Worker# This program is free software: you can redistribute it and/or modify
8*cda5da8dSAndroid Build Coastguard Worker# it under the terms of the GNU General Public License as published by
9*cda5da8dSAndroid Build Coastguard Worker# the Free Software Foundation, either version 3 of the License, or
10*cda5da8dSAndroid Build Coastguard Worker# (at your option) any later version.
11*cda5da8dSAndroid Build Coastguard Worker#
12*cda5da8dSAndroid Build Coastguard Worker# This program is distributed in the hope that it will be useful,
13*cda5da8dSAndroid Build Coastguard Worker# but WITHOUT ANY WARRANTY; without even the implied warranty of
14*cda5da8dSAndroid Build Coastguard Worker# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*cda5da8dSAndroid Build Coastguard Worker# GNU General Public License for more details.
16*cda5da8dSAndroid Build Coastguard Worker#
17*cda5da8dSAndroid Build Coastguard Worker# You should have received a copy of the GNU General Public License
18*cda5da8dSAndroid Build Coastguard Worker# along with this program.  If not, see <https://www.gnu.org/licenses/>.
19*cda5da8dSAndroid Build Coastguard Worker
20*cda5da8dSAndroid Build Coastguard Worker
21*cda5da8dSAndroid Build Coastguard Workerm4_include(b4_skeletonsdir/[c-like.m4])
22*cda5da8dSAndroid Build Coastguard Worker
23*cda5da8dSAndroid Build Coastguard Worker
24*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_action(SYMBOL-NUM, ACTION)
25*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------
26*cda5da8dSAndroid Build Coastguard Worker# Run the action ACTION ("destructor" or "printer") for SYMBOL-NUM.
27*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_action],
28*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_if([$1], [has_$2],
29*cda5da8dSAndroid Build Coastguard Worker[b4_dollar_pushdef([yyval],
30*cda5da8dSAndroid Build Coastguard Worker                   [$1],
31*cda5da8dSAndroid Build Coastguard Worker                   [],
32*cda5da8dSAndroid Build Coastguard Worker                   [yyloc])dnl
33*cda5da8dSAndroid Build Coastguard Worker    _b4_symbol_case([$1])[]dnl
34*cda5da8dSAndroid Build Coastguard Workerb4_syncline([b4_symbol([$1], [$2_line])], [b4_symbol([$1], [$2_file])])dnl
35*cda5da8dSAndroid Build Coastguard Workerb4_symbol([$1], [$2])
36*cda5da8dSAndroid Build Coastguard Workerb4_syncline([@oline@], [@ofile@])dnl
37*cda5da8dSAndroid Build Coastguard Worker        break;
38*cda5da8dSAndroid Build Coastguard Worker
39*cda5da8dSAndroid Build Coastguard Workerb4_dollar_popdef[]dnl
40*cda5da8dSAndroid Build Coastguard Worker])])
41*cda5da8dSAndroid Build Coastguard Worker
42*cda5da8dSAndroid Build Coastguard Worker
43*cda5da8dSAndroid Build Coastguard Worker# b4_use(EXPR)
44*cda5da8dSAndroid Build Coastguard Worker# ------------
45*cda5da8dSAndroid Build Coastguard Worker# Pacify the compiler about some maybe unused value.
46*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_use],
47*cda5da8dSAndroid Build Coastguard Worker[])
48*cda5da8dSAndroid Build Coastguard Worker
49*cda5da8dSAndroid Build Coastguard Worker
50*cda5da8dSAndroid Build Coastguard Worker# b4_sync_start(LINE, FILE)
51*cda5da8dSAndroid Build Coastguard Worker# -------------------------
52*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_sync_start], [[#]line $1 $2])
53*cda5da8dSAndroid Build Coastguard Worker
54*cda5da8dSAndroid Build Coastguard Worker
55*cda5da8dSAndroid Build Coastguard Worker# b4_list2(LIST1, LIST2)
56*cda5da8dSAndroid Build Coastguard Worker# ----------------------
57*cda5da8dSAndroid Build Coastguard Worker# Join two lists with a comma if necessary.
58*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_list2],
59*cda5da8dSAndroid Build Coastguard Worker          [$1[]m4_ifval(m4_quote($1), [m4_ifval(m4_quote($2), [[, ]])])[]$2])
60*cda5da8dSAndroid Build Coastguard Worker
61*cda5da8dSAndroid Build Coastguard Worker
62*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_get3(DEF, PRE, POST, NOT)
63*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------------
64*cda5da8dSAndroid Build Coastguard Worker# Expand to the value of DEF surrounded by PRE and POST if it's %define'ed,
65*cda5da8dSAndroid Build Coastguard Worker# otherwise NOT.
66*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_get3],
67*cda5da8dSAndroid Build Coastguard Worker          [m4_ifval(m4_quote(b4_percent_define_get([$1])),
68*cda5da8dSAndroid Build Coastguard Worker                [$2[]b4_percent_define_get([$1])[]$3], [$4])])
69*cda5da8dSAndroid Build Coastguard Worker
70*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_if_get2(ARG1, ARG2, DEF, NOT)
71*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------------------
72*cda5da8dSAndroid Build Coastguard Worker# Expand to the value of DEF if ARG1 or ARG2 are %define'ed,
73*cda5da8dSAndroid Build Coastguard Worker# otherwise NOT.
74*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_if_get2],
75*cda5da8dSAndroid Build Coastguard Worker          [m4_ifval(m4_quote(b4_percent_define_get([$1])),
76*cda5da8dSAndroid Build Coastguard Worker                [$3], [m4_ifval(m4_quote(b4_percent_define_get([$2])),
77*cda5da8dSAndroid Build Coastguard Worker                      [$3], [$4])])])
78*cda5da8dSAndroid Build Coastguard Worker
79*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_class_before_interface(CLASS, INTERFACE)
80*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------------------
81*cda5da8dSAndroid Build Coastguard Worker# Expand to a ', ' if both a class and an interface have been %define'ed
82*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_class_before_interface],
83*cda5da8dSAndroid Build Coastguard Worker          [m4_ifval(m4_quote(b4_percent_define_get([$1])),
84*cda5da8dSAndroid Build Coastguard Worker                [m4_ifval(m4_quote(b4_percent_define_get([$2])),
85*cda5da8dSAndroid Build Coastguard Worker                      [, ])])])
86*cda5da8dSAndroid Build Coastguard Worker
87*cda5da8dSAndroid Build Coastguard Worker
88*cda5da8dSAndroid Build Coastguard Worker# b4_flag_value(BOOLEAN-FLAG)
89*cda5da8dSAndroid Build Coastguard Worker# ---------------------------
90*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_flag_value], [b4_flag_if([$1], [true], [false])])
91*cda5da8dSAndroid Build Coastguard Worker
92*cda5da8dSAndroid Build Coastguard Worker
93*cda5da8dSAndroid Build Coastguard Worker# b4_parser_class_declaration
94*cda5da8dSAndroid Build Coastguard Worker# ---------------------------
95*cda5da8dSAndroid Build Coastguard Worker# The declaration of the parser class ("class YYParser"), with all its
96*cda5da8dSAndroid Build Coastguard Worker# qualifiers/annotations.
97*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.parser.abstract]], [[false]])
98*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.parser.final]],    [[false]])
99*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.parser.public]],   [[false]])
100*cda5da8dSAndroid Build Coastguard Worker
101*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parser_class_declaration],
102*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_get3([api.parser.annotations], [], [ ])dnl
103*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_flag_if([api.parser.public],   [public ])dnl
104*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_flag_if([api.parser.abstract], [abstract ])dnl
105*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_flag_if([api.parser.final],    [final ])dnl
106*cda5da8dSAndroid Build Coastguard Worker[class ]b4_parser_class[]dnl
107*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_if_get2([api.parser.extends], [api.parser.implements], [ : ])dnl
108*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_get([api.parser.extends])dnl
109*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_class_before_interface([api.parser.extends], [api.parser.implements])dnl
110*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_get([api.parser.implements])])
111*cda5da8dSAndroid Build Coastguard Worker
112*cda5da8dSAndroid Build Coastguard Worker
113*cda5da8dSAndroid Build Coastguard Worker# b4_lexer_if(TRUE, FALSE)
114*cda5da8dSAndroid Build Coastguard Worker# ------------------------
115*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_lexer_if],
116*cda5da8dSAndroid Build Coastguard Worker[b4_percent_code_ifdef([[lexer]], [$1], [$2])])
117*cda5da8dSAndroid Build Coastguard Worker
118*cda5da8dSAndroid Build Coastguard Worker
119*cda5da8dSAndroid Build Coastguard Worker# b4_position_type_if(TRUE, FALSE)
120*cda5da8dSAndroid Build Coastguard Worker# --------------------------------
121*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_position_type_if],
122*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_ifdef([[position_type]], [$1], [$2])])
123*cda5da8dSAndroid Build Coastguard Worker
124*cda5da8dSAndroid Build Coastguard Worker
125*cda5da8dSAndroid Build Coastguard Worker# b4_location_type_if(TRUE, FALSE)
126*cda5da8dSAndroid Build Coastguard Worker# --------------------------------
127*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_location_type_if],
128*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_ifdef([[location_type]], [$1], [$2])])
129*cda5da8dSAndroid Build Coastguard Worker
130*cda5da8dSAndroid Build Coastguard Worker
131*cda5da8dSAndroid Build Coastguard Worker# b4_identification
132*cda5da8dSAndroid Build Coastguard Worker# -----------------
133*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_identification],
134*cda5da8dSAndroid Build Coastguard Worker[[/** Version number for the Bison executable that generated this parser.  */
135*cda5da8dSAndroid Build Coastguard Worker  public static immutable string yy_bison_version = "]b4_version_string[";
136*cda5da8dSAndroid Build Coastguard Worker
137*cda5da8dSAndroid Build Coastguard Worker  /** Name of the skeleton that generated this parser.  */
138*cda5da8dSAndroid Build Coastguard Worker  public static immutable string yy_bison_skeleton = ]b4_skeleton[;
139*cda5da8dSAndroid Build Coastguard Worker]])
140*cda5da8dSAndroid Build Coastguard Worker
141*cda5da8dSAndroid Build Coastguard Worker
142*cda5da8dSAndroid Build Coastguard Worker## ------------ ##
143*cda5da8dSAndroid Build Coastguard Worker## Data types.  ##
144*cda5da8dSAndroid Build Coastguard Worker## ------------ ##
145*cda5da8dSAndroid Build Coastguard Worker
146*cda5da8dSAndroid Build Coastguard Worker# b4_int_type(MIN, MAX)
147*cda5da8dSAndroid Build Coastguard Worker# ---------------------
148*cda5da8dSAndroid Build Coastguard Worker# Return the smallest int type able to handle numbers ranging from
149*cda5da8dSAndroid Build Coastguard Worker# MIN to MAX (included).
150*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_int_type],
151*cda5da8dSAndroid Build Coastguard Worker[m4_if(b4_ints_in($@,   [-128],   [127]), [1], [byte],
152*cda5da8dSAndroid Build Coastguard Worker       b4_ints_in($@, [-32768], [32767]), [1], [short],
153*cda5da8dSAndroid Build Coastguard Worker                                               [int])])
154*cda5da8dSAndroid Build Coastguard Worker
155*cda5da8dSAndroid Build Coastguard Worker# b4_int_type_for(NAME)
156*cda5da8dSAndroid Build Coastguard Worker# ---------------------
157*cda5da8dSAndroid Build Coastguard Worker# Return the smallest int type able to handle numbers ranging from
158*cda5da8dSAndroid Build Coastguard Worker# `NAME_min' to `NAME_max' (included).
159*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_int_type_for],
160*cda5da8dSAndroid Build Coastguard Worker[b4_int_type($1_min, $1_max)])
161*cda5da8dSAndroid Build Coastguard Worker
162*cda5da8dSAndroid Build Coastguard Worker# b4_null
163*cda5da8dSAndroid Build Coastguard Worker# -------
164*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_null], [null])
165*cda5da8dSAndroid Build Coastguard Worker
166*cda5da8dSAndroid Build Coastguard Worker
167*cda5da8dSAndroid Build Coastguard Worker# b4_integral_parser_table_define(NAME, DATA, COMMENT)
168*cda5da8dSAndroid Build Coastguard Worker#-----------------------------------------------------
169*cda5da8dSAndroid Build Coastguard Worker# Define "yy<TABLE-NAME>" whose contents is CONTENT.
170*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_integral_parser_table_define],
171*cda5da8dSAndroid Build Coastguard Worker[m4_ifvaln([$3], [b4_comment([$3], [  ])])dnl
172*cda5da8dSAndroid Build Coastguard Workerprivate static immutable b4_int_type_for([$2])[[]] yy$1_ =
173*cda5da8dSAndroid Build Coastguard Worker@{
174*cda5da8dSAndroid Build Coastguard Worker  $2
175*cda5da8dSAndroid Build Coastguard Worker@};dnl
176*cda5da8dSAndroid Build Coastguard Worker])
177*cda5da8dSAndroid Build Coastguard Worker
178*cda5da8dSAndroid Build Coastguard Worker
179*cda5da8dSAndroid Build Coastguard Worker## ------------- ##
180*cda5da8dSAndroid Build Coastguard Worker## Token kinds.  ##
181*cda5da8dSAndroid Build Coastguard Worker## ------------- ##
182*cda5da8dSAndroid Build Coastguard Worker
183*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol(-2, id)],  [[YYEMPTY]])
184*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.token.raw]], [[true]])
185*cda5da8dSAndroid Build Coastguard Worker
186*cda5da8dSAndroid Build Coastguard Worker# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
187*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------------
188*cda5da8dSAndroid Build Coastguard Worker# Output the definition of this token as an enum.
189*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_enum],
190*cda5da8dSAndroid Build Coastguard Worker[b4_token_format([  %s = %s,
191*cda5da8dSAndroid Build Coastguard Worker], [$1])])
192*cda5da8dSAndroid Build Coastguard Worker
193*cda5da8dSAndroid Build Coastguard Worker# b4_token_enums
194*cda5da8dSAndroid Build Coastguard Worker# --------------
195*cda5da8dSAndroid Build Coastguard Worker# Output the definition of the tokens as enums.
196*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_enums],
197*cda5da8dSAndroid Build Coastguard Worker[/* Token kinds.  */
198*cda5da8dSAndroid Build Coastguard Workerpublic enum TokenKind {
199*cda5da8dSAndroid Build Coastguard Worker  ]b4_symbol(empty, id)[ = -2,
200*cda5da8dSAndroid Build Coastguard Workerb4_symbol_foreach([b4_token_enum])dnl
201*cda5da8dSAndroid Build Coastguard Worker}
202*cda5da8dSAndroid Build Coastguard Worker])
203*cda5da8dSAndroid Build Coastguard Worker
204*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_translate(STRING)
205*cda5da8dSAndroid Build Coastguard Worker# ---------------------------
206*cda5da8dSAndroid Build Coastguard Worker# Used by "bison" in the array of symbol names to mark those that
207*cda5da8dSAndroid Build Coastguard Worker# require translation.
208*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_translate],
209*cda5da8dSAndroid Build Coastguard Worker[[_($1)]])
210*cda5da8dSAndroid Build Coastguard Worker
211*cda5da8dSAndroid Build Coastguard Worker
212*cda5da8dSAndroid Build Coastguard Worker# _b4_token_constructor_define(SYMBOL-NUM)
213*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------
214*cda5da8dSAndroid Build Coastguard Worker# Define Symbol.FOO for SYMBOL-NUM.
215*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_token_constructor_define],
216*cda5da8dSAndroid Build Coastguard Worker[b4_token_visible_if([$1],
217*cda5da8dSAndroid Build Coastguard Worker[[
218*cda5da8dSAndroid Build Coastguard Worker    static auto ]b4_symbol([$1], [id])[(]b4_symbol_if([$1], [has_type],
219*cda5da8dSAndroid Build Coastguard Worker[b4_union_if([b4_symbol([$1], [type]],
220*cda5da8dSAndroid Build Coastguard Worker[[typeof(YYSemanticType.]b4_symbol([$1], [type])[]])) [val]])dnl
221*cda5da8dSAndroid Build Coastguard Worker[]b4_locations_if([b4_symbol_if([$1], [has_type], [[, ]])[Location l]])[)
222*cda5da8dSAndroid Build Coastguard Worker    {
223*cda5da8dSAndroid Build Coastguard Worker      return Symbol(TokenKind.]b4_symbol([$1], [id])[]b4_symbol_if([$1], [has_type],
224*cda5da8dSAndroid Build Coastguard Worker      [[, val]])[]b4_locations_if([[, l]])[);
225*cda5da8dSAndroid Build Coastguard Worker    }]])])
226*cda5da8dSAndroid Build Coastguard Worker
227*cda5da8dSAndroid Build Coastguard Worker# b4_token_constructor_define
228*cda5da8dSAndroid Build Coastguard Worker# ---------------------------
229*cda5da8dSAndroid Build Coastguard Worker# Define Symbol.FOO for each token kind FOO.
230*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_constructor_define],
231*cda5da8dSAndroid Build Coastguard Worker[[
232*cda5da8dSAndroid Build Coastguard Worker    /* Implementation of token constructors for each symbol type visible to
233*cda5da8dSAndroid Build Coastguard Worker     * the user. The code generates static methods that have the same names
234*cda5da8dSAndroid Build Coastguard Worker     * as the TokenKinds.
235*cda5da8dSAndroid Build Coastguard Worker     */]b4_symbol_foreach([_b4_token_constructor_define])dnl
236*cda5da8dSAndroid Build Coastguard Worker])
237*cda5da8dSAndroid Build Coastguard Worker
238*cda5da8dSAndroid Build Coastguard Worker## -------------- ##
239*cda5da8dSAndroid Build Coastguard Worker## Symbol kinds.  ##
240*cda5da8dSAndroid Build Coastguard Worker## -------------- ##
241*cda5da8dSAndroid Build Coastguard Worker
242*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_kind(NUM)
243*cda5da8dSAndroid Build Coastguard Worker# -------------------
244*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_kind],
245*cda5da8dSAndroid Build Coastguard Worker[SymbolKind.b4_symbol_kind_base($@)])
246*cda5da8dSAndroid Build Coastguard Worker
247*cda5da8dSAndroid Build Coastguard Worker
248*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_enum(SYMBOL-NUM)
249*cda5da8dSAndroid Build Coastguard Worker# --------------------------
250*cda5da8dSAndroid Build Coastguard Worker# Output the definition of this symbol as an enum.
251*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_enum],
252*cda5da8dSAndroid Build Coastguard Worker[m4_format([    %-30s %s],
253*cda5da8dSAndroid Build Coastguard Worker           m4_format([[%s = %s,]],
254*cda5da8dSAndroid Build Coastguard Worker                     b4_symbol([$1], [kind_base]),
255*cda5da8dSAndroid Build Coastguard Worker                     [$1]),
256*cda5da8dSAndroid Build Coastguard Worker           [b4_symbol_tag_comment([$1])])])
257*cda5da8dSAndroid Build Coastguard Worker
258*cda5da8dSAndroid Build Coastguard Worker
259*cda5da8dSAndroid Build Coastguard Worker# b4_declare_symbol_enum
260*cda5da8dSAndroid Build Coastguard Worker# ----------------------
261*cda5da8dSAndroid Build Coastguard Worker# The definition of the symbol internal numbers as an enum.
262*cda5da8dSAndroid Build Coastguard Worker# Defining YYEMPTY here is important: it forces the compiler
263*cda5da8dSAndroid Build Coastguard Worker# to use a signed type, which matters for yytoken.
264*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_declare_symbol_enum],
265*cda5da8dSAndroid Build Coastguard Worker[[  /* Symbol kinds.  */
266*cda5da8dSAndroid Build Coastguard Worker  struct SymbolKind
267*cda5da8dSAndroid Build Coastguard Worker  {
268*cda5da8dSAndroid Build Coastguard Worker    enum
269*cda5da8dSAndroid Build Coastguard Worker    {
270*cda5da8dSAndroid Build Coastguard Worker    ]b4_symbol(empty, kind_base)[ = -2,  /* No symbol.  */
271*cda5da8dSAndroid Build Coastguard Worker]b4_symbol_foreach([b4_symbol_enum])dnl
272*cda5da8dSAndroid Build Coastguard Worker[    }
273*cda5da8dSAndroid Build Coastguard Worker
274*cda5da8dSAndroid Build Coastguard Worker    private int yycode_;
275*cda5da8dSAndroid Build Coastguard Worker    alias yycode_ this;
276*cda5da8dSAndroid Build Coastguard Worker
277*cda5da8dSAndroid Build Coastguard Worker    this(int code)
278*cda5da8dSAndroid Build Coastguard Worker    {
279*cda5da8dSAndroid Build Coastguard Worker      yycode_ = code;
280*cda5da8dSAndroid Build Coastguard Worker    }
281*cda5da8dSAndroid Build Coastguard Worker
282*cda5da8dSAndroid Build Coastguard Worker    /* Return YYSTR after stripping away unnecessary quotes and
283*cda5da8dSAndroid Build Coastguard Worker     backslashes, so that it's suitable for yyerror.  The heuristic is
284*cda5da8dSAndroid Build Coastguard Worker     that double-quoting is unnecessary unless the string contains an
285*cda5da8dSAndroid Build Coastguard Worker     apostrophe, a comma, or backslash (other than backslash-backslash).
286*cda5da8dSAndroid Build Coastguard Worker     YYSTR is taken from yytname.  */
287*cda5da8dSAndroid Build Coastguard Worker    final void toString(W)(W sink) const
288*cda5da8dSAndroid Build Coastguard Worker    if (isOutputRange!(W, char))
289*cda5da8dSAndroid Build Coastguard Worker    {
290*cda5da8dSAndroid Build Coastguard Worker      immutable string[] yy_sname = @{
291*cda5da8dSAndroid Build Coastguard Worker  ]b4_symbol_names[
292*cda5da8dSAndroid Build Coastguard Worker      @};]b4_has_translations_if([[
293*cda5da8dSAndroid Build Coastguard Worker      /* YYTRANSLATABLE[SYMBOL-NUM] -- Whether YY_SNAME[SYMBOL-NUM] is
294*cda5da8dSAndroid Build Coastguard Worker        internationalizable.  */
295*cda5da8dSAndroid Build Coastguard Worker      immutable ]b4_int_type_for([b4_translatable])[[] yytranslatable = @{
296*cda5da8dSAndroid Build Coastguard Worker  ]b4_translatable[
297*cda5da8dSAndroid Build Coastguard Worker      @};]])[
298*cda5da8dSAndroid Build Coastguard Worker
299*cda5da8dSAndroid Build Coastguard Worker      put(sink, yy_sname[yycode_]);
300*cda5da8dSAndroid Build Coastguard Worker    }
301*cda5da8dSAndroid Build Coastguard Worker  }
302*cda5da8dSAndroid Build Coastguard Worker]])
303*cda5da8dSAndroid Build Coastguard Worker
304*cda5da8dSAndroid Build Coastguard Worker
305*cda5da8dSAndroid Build Coastguard Worker# b4_case(ID, CODE, [COMMENTS])
306*cda5da8dSAndroid Build Coastguard Worker# -----------------------------
307*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_case], [    case $1:m4_ifval([$3], [ b4_comment([$3])])
308*cda5da8dSAndroid Build Coastguard Worker$2
309*cda5da8dSAndroid Build Coastguard Worker      break;])
310*cda5da8dSAndroid Build Coastguard Worker
311*cda5da8dSAndroid Build Coastguard Worker
312*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
313*cda5da8dSAndroid Build Coastguard Worker## Default values.  ##
314*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
315*cda5da8dSAndroid Build Coastguard Worker
316*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_yystype], [b4_percent_define_get([[stype]])])
317*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[stype]], [[YYSemanticType]])])
318*cda5da8dSAndroid Build Coastguard Worker
319*cda5da8dSAndroid Build Coastguard Worker# %name-prefix
320*cda5da8dSAndroid Build Coastguard Workerm4_define_default([b4_prefix], [[YY]])
321*cda5da8dSAndroid Build Coastguard Worker
322*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.parser.class]], [b4_prefix[]Parser])])
323*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parser_class], [b4_percent_define_get([[api.parser.class]])])
324*cda5da8dSAndroid Build Coastguard Worker
325*cda5da8dSAndroid Build Coastguard Worker#b4_percent_define_default([[location_type]], [Location])])
326*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_location_type], b4_percent_define_ifdef([[location_type]],[b4_percent_define_get([[location_type]])],[YYLocation]))
327*cda5da8dSAndroid Build Coastguard Worker
328*cda5da8dSAndroid Build Coastguard Worker#b4_percent_define_default([[position_type]], [Position])])
329*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_position_type], b4_percent_define_ifdef([[position_type]],[b4_percent_define_get([[position_type]])],[YYPosition]))
330*cda5da8dSAndroid Build Coastguard Worker
331*cda5da8dSAndroid Build Coastguard Worker
332*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
333*cda5da8dSAndroid Build Coastguard Worker## api.value.type.  ##
334*cda5da8dSAndroid Build Coastguard Worker## ---------------- ##
335*cda5da8dSAndroid Build Coastguard Worker
336*cda5da8dSAndroid Build Coastguard Worker
337*cda5da8dSAndroid Build Coastguard Worker# ---------------------- #
338*cda5da8dSAndroid Build Coastguard Worker# api.value.type=union.  #
339*cda5da8dSAndroid Build Coastguard Worker# ---------------------- #
340*cda5da8dSAndroid Build Coastguard Worker
341*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_type_register(SYMBOL-NUM)
342*cda5da8dSAndroid Build Coastguard Worker# -----------------------------------
343*cda5da8dSAndroid Build Coastguard Worker# Symbol SYMBOL-NUM has a type (for union) instead of a type-tag.
344*cda5da8dSAndroid Build Coastguard Worker# Extend the definition of %union's body (b4_union_members) with a
345*cda5da8dSAndroid Build Coastguard Worker# field of that type, and extend the symbol's "type" field to point to
346*cda5da8dSAndroid Build Coastguard Worker# the field name, instead of the type name.
347*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_type_register],
348*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_symbol($1, type_tag)],
349*cda5da8dSAndroid Build Coastguard Worker           [b4_symbol_if([$1], [has_id],
350*cda5da8dSAndroid Build Coastguard Worker                         [b4_symbol([$1], [id])],
351*cda5da8dSAndroid Build Coastguard Worker                         [yykind_[]b4_symbol([$1], [number])])])dnl
352*cda5da8dSAndroid Build Coastguard Workerm4_append([b4_union_members],
353*cda5da8dSAndroid Build Coastguard Workerm4_expand([m4_format([  %-40s %s],
354*cda5da8dSAndroid Build Coastguard Worker                     m4_expand([b4_symbol([$1], [type]) b4_symbol([$1], [type_tag]);]),
355*cda5da8dSAndroid Build Coastguard Worker                     [b4_symbol_tag_comment([$1])])]))
356*cda5da8dSAndroid Build Coastguard Worker])
357*cda5da8dSAndroid Build Coastguard Worker
358*cda5da8dSAndroid Build Coastguard Worker
359*cda5da8dSAndroid Build Coastguard Worker# b4_type_define_tag(SYMBOL1-NUM, ...)
360*cda5da8dSAndroid Build Coastguard Worker# ------------------------------------
361*cda5da8dSAndroid Build Coastguard Worker# For the batch of symbols SYMBOL1-NUM... (which all have the same
362*cda5da8dSAndroid Build Coastguard Worker# type), enhance the %union definition for each of them, and set
363*cda5da8dSAndroid Build Coastguard Worker# there "type" field to the field tag name, instead of the type name.
364*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_type_define_tag],
365*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_if([$1], [has_type],
366*cda5da8dSAndroid Build Coastguard Worker              [m4_map([b4_symbol_type_register], [$@])])
367*cda5da8dSAndroid Build Coastguard Worker])
368*cda5da8dSAndroid Build Coastguard Worker
369*cda5da8dSAndroid Build Coastguard Worker
370*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_value_union(VAL, SYMBOL-NUM, [TYPE])
371*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------
372*cda5da8dSAndroid Build Coastguard Worker# Same of b4_symbol_value, but when api.value.type=union.
373*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_value_union],
374*cda5da8dSAndroid Build Coastguard Worker[m4_ifval([$3],
375*cda5da8dSAndroid Build Coastguard Worker          [(*($3*)(&$1))],
376*cda5da8dSAndroid Build Coastguard Worker          [m4_ifval([$2],
377*cda5da8dSAndroid Build Coastguard Worker                    [b4_symbol_if([$2], [has_type],
378*cda5da8dSAndroid Build Coastguard Worker                                  [($1.b4_symbol([$2], [type_tag]))],
379*cda5da8dSAndroid Build Coastguard Worker                                  [$1])],
380*cda5da8dSAndroid Build Coastguard Worker                    [$1])])])
381*cda5da8dSAndroid Build Coastguard Worker
382*cda5da8dSAndroid Build Coastguard Worker
383*cda5da8dSAndroid Build Coastguard Worker# b4_value_type_setup_union
384*cda5da8dSAndroid Build Coastguard Worker# -------------------------
385*cda5da8dSAndroid Build Coastguard Worker# Setup support for api.value.type=union.  Symbols are defined with a
386*cda5da8dSAndroid Build Coastguard Worker# type instead of a union member name: build the corresponding union,
387*cda5da8dSAndroid Build Coastguard Worker# and give the symbols their tag.
388*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_value_type_setup_union],
389*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_union_members])
390*cda5da8dSAndroid Build Coastguard Workerb4_type_foreach([b4_type_define_tag])
391*cda5da8dSAndroid Build Coastguard Workerm4_copy_force([b4_symbol_value_union], [b4_symbol_value])
392*cda5da8dSAndroid Build Coastguard Worker])
393*cda5da8dSAndroid Build Coastguard Worker
394*cda5da8dSAndroid Build Coastguard Worker
395*cda5da8dSAndroid Build Coastguard Worker# _b4_value_type_setup_keyword
396*cda5da8dSAndroid Build Coastguard Worker# ----------------------------
397*cda5da8dSAndroid Build Coastguard Worker# api.value.type is defined with a keyword/string syntax.  Check if
398*cda5da8dSAndroid Build Coastguard Worker# that is properly defined, and prepare its use.
399*cda5da8dSAndroid Build Coastguard Workerm4_define([_b4_value_type_setup_keyword],
400*cda5da8dSAndroid Build Coastguard Worker[b4_percent_define_check_values([[[[api.value.type]],
401*cda5da8dSAndroid Build Coastguard Worker                                  [[none]],
402*cda5da8dSAndroid Build Coastguard Worker                                  [[union]],
403*cda5da8dSAndroid Build Coastguard Worker                                  [[union-directive]],
404*cda5da8dSAndroid Build Coastguard Worker                                  [[yystype]]]])dnl
405*cda5da8dSAndroid Build Coastguard Workerm4_case(b4_percent_define_get([[api.value.type]]),
406*cda5da8dSAndroid Build Coastguard Worker        [union],   [b4_value_type_setup_union])])
407*cda5da8dSAndroid Build Coastguard Worker
408*cda5da8dSAndroid Build Coastguard Worker
409*cda5da8dSAndroid Build Coastguard Worker# b4_value_type_setup
410*cda5da8dSAndroid Build Coastguard Worker# -------------------
411*cda5da8dSAndroid Build Coastguard Worker# Check if api.value.type is properly defined, and possibly prepare
412*cda5da8dSAndroid Build Coastguard Worker# its use.
413*cda5da8dSAndroid Build Coastguard Workerb4_define_silent([b4_value_type_setup],
414*cda5da8dSAndroid Build Coastguard Worker[
415*cda5da8dSAndroid Build Coastguard Worker# Define default value.
416*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_ifdef([[api.value.type]], [],
417*cda5da8dSAndroid Build Coastguard Worker[# %union => api.value.type=union-directive
418*cda5da8dSAndroid Build Coastguard Workerm4_ifdef([b4_union_members],
419*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_percent_define_kind(api.value.type)], [keyword])
420*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define(api.value.type)], [union-directive])],
421*cda5da8dSAndroid Build Coastguard Worker[# no tag seen => api.value.type={int}
422*cda5da8dSAndroid Build Coastguard Workerm4_if(b4_tag_seen_flag, 0,
423*cda5da8dSAndroid Build Coastguard Worker[m4_define([b4_percent_define_kind(api.value.type)], [code])
424*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define(api.value.type)], [int])],
425*cda5da8dSAndroid Build Coastguard Worker[# otherwise api.value.type=yystype
426*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define_kind(api.value.type)], [keyword])
427*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_percent_define(api.value.type)], [yystype])])])])
428*cda5da8dSAndroid Build Coastguard Worker
429*cda5da8dSAndroid Build Coastguard Worker# Set up.
430*cda5da8dSAndroid Build Coastguard Workerm4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
431*cda5da8dSAndroid Build Coastguard Worker   [keyword], [_b4_value_type_setup_keyword])
432*cda5da8dSAndroid Build Coastguard Worker])
433*cda5da8dSAndroid Build Coastguard Worker
434*cda5da8dSAndroid Build Coastguard Worker
435*cda5da8dSAndroid Build Coastguard Worker## ----------------- ##
436*cda5da8dSAndroid Build Coastguard Worker## Semantic Values.  ##
437*cda5da8dSAndroid Build Coastguard Worker## ----------------- ##
438*cda5da8dSAndroid Build Coastguard Worker
439*cda5da8dSAndroid Build Coastguard Worker
440*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG])
441*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------------------
442*cda5da8dSAndroid Build Coastguard Worker# See README.  FIXME: factor in c-like?
443*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_value],
444*cda5da8dSAndroid Build Coastguard Worker[m4_ifval([$3],
445*cda5da8dSAndroid Build Coastguard Worker          [($1.$3)],
446*cda5da8dSAndroid Build Coastguard Worker          [m4_ifval([$2],
447*cda5da8dSAndroid Build Coastguard Worker                    [b4_symbol_if([$2], [has_type],
448*cda5da8dSAndroid Build Coastguard Worker                                  [($1.b4_symbol([$2], [type]))],
449*cda5da8dSAndroid Build Coastguard Worker                                  [$1])],
450*cda5da8dSAndroid Build Coastguard Worker                    [$1])])])
451*cda5da8dSAndroid Build Coastguard Worker
452*cda5da8dSAndroid Build Coastguard Worker# b4_lhs_value(SYMBOL-NUM, [TYPE])
453*cda5da8dSAndroid Build Coastguard Worker# --------------------------------
454*cda5da8dSAndroid Build Coastguard Worker# See README.
455*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_lhs_value],
456*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_value([yyval], [$1], [$2])])
457*cda5da8dSAndroid Build Coastguard Worker
458*cda5da8dSAndroid Build Coastguard Worker
459*cda5da8dSAndroid Build Coastguard Worker# b4_rhs_value(RULE-LENGTH, POS, SYMBOL-NUM, [TYPE])
460*cda5da8dSAndroid Build Coastguard Worker# --------------------------------------------------
461*cda5da8dSAndroid Build Coastguard Worker# See README.
462*cda5da8dSAndroid Build Coastguard Worker#
463*cda5da8dSAndroid Build Coastguard Worker# In this simple implementation, %token and %type have class names
464*cda5da8dSAndroid Build Coastguard Worker# between the angle brackets.
465*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_rhs_value],
466*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_value([(yystack.valueAt (b4_subtract([$1], [$2])))], [$3], [$4])])
467*cda5da8dSAndroid Build Coastguard Worker
468*cda5da8dSAndroid Build Coastguard Worker
469*cda5da8dSAndroid Build Coastguard Worker# b4_lhs_location()
470*cda5da8dSAndroid Build Coastguard Worker# -----------------
471*cda5da8dSAndroid Build Coastguard Worker# Expansion of @$.
472*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_lhs_location],
473*cda5da8dSAndroid Build Coastguard Worker[(yyloc)])
474*cda5da8dSAndroid Build Coastguard Worker
475*cda5da8dSAndroid Build Coastguard Worker
476*cda5da8dSAndroid Build Coastguard Worker# b4_rhs_location(RULE-LENGTH, POS)
477*cda5da8dSAndroid Build Coastguard Worker# ---------------------------------
478*cda5da8dSAndroid Build Coastguard Worker# Expansion of @POS, where the current rule has RULE-LENGTH symbols
479*cda5da8dSAndroid Build Coastguard Worker# on RHS.
480*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_rhs_location],
481*cda5da8dSAndroid Build Coastguard Worker[yystack.locationAt (b4_subtract($@))])
482*cda5da8dSAndroid Build Coastguard Worker
483*cda5da8dSAndroid Build Coastguard Worker
484*cda5da8dSAndroid Build Coastguard Worker# b4_lex_param
485*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param
486*cda5da8dSAndroid Build Coastguard Worker# --------------
487*cda5da8dSAndroid Build Coastguard Worker# If defined, b4_lex_param arrives double quoted, but below we prefer
488*cda5da8dSAndroid Build Coastguard Worker# it to be single quoted.  Same for b4_parse_param.
489*cda5da8dSAndroid Build Coastguard Worker
490*cda5da8dSAndroid Build Coastguard Worker# TODO: should be in bison.m4
491*cda5da8dSAndroid Build Coastguard Workerm4_define_default([b4_lex_param], [[]]))
492*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_lex_param], b4_lex_param))
493*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param], b4_parse_param))
494*cda5da8dSAndroid Build Coastguard Worker
495*cda5da8dSAndroid Build Coastguard Worker# b4_lex_param_decl
496*cda5da8dSAndroid Build Coastguard Worker# -------------------
497*cda5da8dSAndroid Build Coastguard Worker# Extra formal arguments of the constructor.
498*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_lex_param_decl],
499*cda5da8dSAndroid Build Coastguard Worker[m4_ifset([b4_lex_param],
500*cda5da8dSAndroid Build Coastguard Worker          [b4_remove_comma([$1],
501*cda5da8dSAndroid Build Coastguard Worker                           b4_param_decls(b4_lex_param))],
502*cda5da8dSAndroid Build Coastguard Worker          [$1])])
503*cda5da8dSAndroid Build Coastguard Worker
504*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_param_decls],
505*cda5da8dSAndroid Build Coastguard Worker          [m4_map([b4_param_decl], [$@])])
506*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_param_decl], [, $1])
507*cda5da8dSAndroid Build Coastguard Worker
508*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_remove_comma], [m4_ifval(m4_quote($1), [$1, ], [])m4_shift2($@)])
509*cda5da8dSAndroid Build Coastguard Worker
510*cda5da8dSAndroid Build Coastguard Worker
511*cda5da8dSAndroid Build Coastguard Worker
512*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param_decl
513*cda5da8dSAndroid Build Coastguard Worker# -------------------
514*cda5da8dSAndroid Build Coastguard Worker# Extra formal arguments of the constructor.
515*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param_decl],
516*cda5da8dSAndroid Build Coastguard Worker[m4_ifset([b4_parse_param],
517*cda5da8dSAndroid Build Coastguard Worker          [b4_remove_comma([$1],
518*cda5da8dSAndroid Build Coastguard Worker                           b4_param_decls(b4_parse_param))],
519*cda5da8dSAndroid Build Coastguard Worker          [$1])])
520*cda5da8dSAndroid Build Coastguard Worker
521*cda5da8dSAndroid Build Coastguard Worker
522*cda5da8dSAndroid Build Coastguard Worker
523*cda5da8dSAndroid Build Coastguard Worker# b4_lex_param_call
524*cda5da8dSAndroid Build Coastguard Worker# -------------------
525*cda5da8dSAndroid Build Coastguard Worker# Delegating the lexer parameters to the lexer constructor.
526*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_lex_param_call],
527*cda5da8dSAndroid Build Coastguard Worker          [m4_ifset([b4_lex_param],
528*cda5da8dSAndroid Build Coastguard Worker                    [b4_remove_comma([$1],
529*cda5da8dSAndroid Build Coastguard Worker                                     b4_param_calls(b4_lex_param))],
530*cda5da8dSAndroid Build Coastguard Worker                    [$1])])
531*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_param_calls],
532*cda5da8dSAndroid Build Coastguard Worker          [m4_map([b4_param_call], [$@])])
533*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_param_call], [, $2])
534*cda5da8dSAndroid Build Coastguard Worker
535*cda5da8dSAndroid Build Coastguard Worker
536*cda5da8dSAndroid Build Coastguard Worker
537*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param_cons
538*cda5da8dSAndroid Build Coastguard Worker# -------------------
539*cda5da8dSAndroid Build Coastguard Worker# Extra initialisations of the constructor.
540*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param_cons],
541*cda5da8dSAndroid Build Coastguard Worker          [m4_ifset([b4_parse_param],
542*cda5da8dSAndroid Build Coastguard Worker                    [b4_constructor_calls(b4_parse_param)])])
543*cda5da8dSAndroid Build Coastguard Worker
544*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_constructor_calls],
545*cda5da8dSAndroid Build Coastguard Worker          [m4_map([b4_constructor_call], [$@])])
546*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_constructor_call],
547*cda5da8dSAndroid Build Coastguard Worker          [this.$2 = $2;
548*cda5da8dSAndroid Build Coastguard Worker          ])
549*cda5da8dSAndroid Build Coastguard Worker
550*cda5da8dSAndroid Build Coastguard Worker
551*cda5da8dSAndroid Build Coastguard Worker
552*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param_vars
553*cda5da8dSAndroid Build Coastguard Worker# -------------------
554*cda5da8dSAndroid Build Coastguard Worker# Extra instance variables.
555*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param_vars],
556*cda5da8dSAndroid Build Coastguard Worker          [m4_ifset([b4_parse_param],
557*cda5da8dSAndroid Build Coastguard Worker                    [
558*cda5da8dSAndroid Build Coastguard Worker    /* User arguments.  */
559*cda5da8dSAndroid Build Coastguard Workerb4_var_decls(b4_parse_param)])])
560*cda5da8dSAndroid Build Coastguard Worker
561*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_var_decls],
562*cda5da8dSAndroid Build Coastguard Worker          [m4_map_sep([b4_var_decl], [
563*cda5da8dSAndroid Build Coastguard Worker], [$@])])
564*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_var_decl],
565*cda5da8dSAndroid Build Coastguard Worker          [    protected $1;])
566*cda5da8dSAndroid Build Coastguard Worker
567*cda5da8dSAndroid Build Coastguard Worker
568*cda5da8dSAndroid Build Coastguard Worker# b4_public_types_declare
569*cda5da8dSAndroid Build Coastguard Worker# -----------------------
570*cda5da8dSAndroid Build Coastguard Worker# Define the public types: token, semantic value, location, and so forth.
571*cda5da8dSAndroid Build Coastguard Worker# Depending on %define token_lex, may be output in the header or source file.
572*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_public_types_declare],
573*cda5da8dSAndroid Build Coastguard Worker[[
574*cda5da8dSAndroid Build Coastguard Workeralias Symbol = ]b4_parser_class[.Symbol;
575*cda5da8dSAndroid Build Coastguard Workeralias Value = ]b4_yystype[;]b4_locations_if([[
576*cda5da8dSAndroid Build Coastguard Workeralias Location = ]b4_location_type[;
577*cda5da8dSAndroid Build Coastguard Workeralias Position = ]b4_position_type[;]b4_push_if([[
578*cda5da8dSAndroid Build Coastguard Workeralias PUSH_MORE = ]b4_parser_class[.YYPUSH_MORE;
579*cda5da8dSAndroid Build Coastguard Workeralias ABORT = ]b4_parser_class[.YYABORT;
580*cda5da8dSAndroid Build Coastguard Workeralias ACCEPT = ]b4_parser_class[.YYACCEPT;]])[]])[
581*cda5da8dSAndroid Build Coastguard Worker]])
582*cda5da8dSAndroid Build Coastguard Worker
583*cda5da8dSAndroid Build Coastguard Worker
584*cda5da8dSAndroid Build Coastguard Worker# b4_basic_symbol_constructor_define
585*cda5da8dSAndroid Build Coastguard Worker# ----------------------------------
586*cda5da8dSAndroid Build Coastguard Worker# Create Symbol struct constructors for all the visible types.
587*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_basic_symbol_constructor_define],
588*cda5da8dSAndroid Build Coastguard Worker[b4_token_visible_if([$1],
589*cda5da8dSAndroid Build Coastguard Worker[[    this(TokenKind token]b4_symbol_if([$1], [has_type],
590*cda5da8dSAndroid Build Coastguard Worker[[, ]b4_union_if([], [[typeof(YYSemanticType.]])b4_symbol([$1], [type])dnl
591*cda5da8dSAndroid Build Coastguard Worker[]b4_union_if([], [[) ]])[ val]])[]b4_locations_if([[, Location loc]])[)
592*cda5da8dSAndroid Build Coastguard Worker    {
593*cda5da8dSAndroid Build Coastguard Worker      kind = yytranslate_(token);]b4_union_if([b4_symbol_if([$1], [has_type], [[
594*cda5da8dSAndroid Build Coastguard Worker      static foreach (member; __traits(allMembers, YYSemanticType))
595*cda5da8dSAndroid Build Coastguard Worker      {
596*cda5da8dSAndroid Build Coastguard Worker        static if (is(typeof(mixin("value_." ~ member)) == ]b4_symbol([$1], [type])[))
597*cda5da8dSAndroid Build Coastguard Worker        {
598*cda5da8dSAndroid Build Coastguard Worker          mixin("value_." ~ member ~ " = val;");
599*cda5da8dSAndroid Build Coastguard Worker        }
600*cda5da8dSAndroid Build Coastguard Worker      }]])], [b4_symbol_if([$1], [has_type], [[
601*cda5da8dSAndroid Build Coastguard Worker      value_.]b4_symbol([$1], [type])[ = val;]])])[]b4_locations_if([
602*cda5da8dSAndroid Build Coastguard Worker      location_ = loc;])[
603*cda5da8dSAndroid Build Coastguard Worker    }
604*cda5da8dSAndroid Build Coastguard Worker]])])
605*cda5da8dSAndroid Build Coastguard Worker
606*cda5da8dSAndroid Build Coastguard Worker
607*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_type_define
608*cda5da8dSAndroid Build Coastguard Worker# ---------------------
609*cda5da8dSAndroid Build Coastguard Worker# Define symbol_type, the external type for symbols used for symbol
610*cda5da8dSAndroid Build Coastguard Worker# constructors.
611*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_type_define],
612*cda5da8dSAndroid Build Coastguard Worker[[
613*cda5da8dSAndroid Build Coastguard Worker  /**
614*cda5da8dSAndroid Build Coastguard Worker    * A complete symbol
615*cda5da8dSAndroid Build Coastguard Worker    */
616*cda5da8dSAndroid Build Coastguard Worker  struct Symbol
617*cda5da8dSAndroid Build Coastguard Worker  {
618*cda5da8dSAndroid Build Coastguard Worker    private SymbolKind kind;
619*cda5da8dSAndroid Build Coastguard Worker    private Value value_;]b4_locations_if([[
620*cda5da8dSAndroid Build Coastguard Worker    private Location location_;]])[
621*cda5da8dSAndroid Build Coastguard Worker
622*cda5da8dSAndroid Build Coastguard Worker]b4_type_foreach([b4_basic_symbol_constructor_define])[
623*cda5da8dSAndroid Build Coastguard Worker    SymbolKind token() { return kind; }
624*cda5da8dSAndroid Build Coastguard Worker    Value value() { return value_; }]b4_locations_if([[
625*cda5da8dSAndroid Build Coastguard Worker    Location location() { return location_; }]])[
626*cda5da8dSAndroid Build Coastguard Worker]b4_token_ctor_if([b4_token_constructor_define])[
627*cda5da8dSAndroid Build Coastguard Worker  }
628*cda5da8dSAndroid Build Coastguard Worker]])
629