1*cda5da8dSAndroid Build Coastguard Worker -*- Autoconf -*- 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Worker# C++ skeleton for Bison 4*cda5da8dSAndroid Build Coastguard Worker 5*cda5da8dSAndroid Build Coastguard Worker# Copyright (C) 2002-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# Sanity checks, before defaults installed by c.m4. 21*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_ifdef([[api.value.union.name]], 22*cda5da8dSAndroid Build Coastguard Worker [b4_complain_at(b4_percent_define_get_loc([[api.value.union.name]]), 23*cda5da8dSAndroid Build Coastguard Worker [named %union is invalid in C++])]) 24*cda5da8dSAndroid Build Coastguard Worker 25*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.symbol.prefix]], [[S_]]) 26*cda5da8dSAndroid Build Coastguard Worker 27*cda5da8dSAndroid Build Coastguard Workerm4_include(b4_skeletonsdir/[c.m4]) 28*cda5da8dSAndroid Build Coastguard Worker 29*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_check_kind([api.namespace], [code], [deprecated]) 30*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_check_kind([api.parser.class], [code], [deprecated]) 31*cda5da8dSAndroid Build Coastguard Worker 32*cda5da8dSAndroid Build Coastguard Worker 33*cda5da8dSAndroid Build Coastguard Worker## ----- ## 34*cda5da8dSAndroid Build Coastguard Worker## C++. ## 35*cda5da8dSAndroid Build Coastguard Worker## ----- ## 36*cda5da8dSAndroid Build Coastguard Worker 37*cda5da8dSAndroid Build Coastguard Worker# b4_comment(TEXT, [PREFIX]) 38*cda5da8dSAndroid Build Coastguard Worker# -------------------------- 39*cda5da8dSAndroid Build Coastguard Worker# Put TEXT in comment. Prefix all the output lines with PREFIX. 40*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_comment], 41*cda5da8dSAndroid Build Coastguard Worker[_b4_comment([$1], [$2// ], [$2// ])]) 42*cda5da8dSAndroid Build Coastguard Worker 43*cda5da8dSAndroid Build Coastguard Worker 44*cda5da8dSAndroid Build Coastguard Worker# b4_inline(hh|cc) 45*cda5da8dSAndroid Build Coastguard Worker# ---------------- 46*cda5da8dSAndroid Build Coastguard Worker# Expand to `inline\n ` if $1 is hh. 47*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_inline], 48*cda5da8dSAndroid Build Coastguard Worker[m4_case([$1], 49*cda5da8dSAndroid Build Coastguard Worker [cc], [], 50*cda5da8dSAndroid Build Coastguard Worker [hh], [[inline 51*cda5da8dSAndroid Build Coastguard Worker ]], 52*cda5da8dSAndroid Build Coastguard Worker [m4_fatal([$0: invalid argument: $1])])]) 53*cda5da8dSAndroid Build Coastguard Worker 54*cda5da8dSAndroid Build Coastguard Worker 55*cda5da8dSAndroid Build Coastguard Worker# b4_cxx_portability 56*cda5da8dSAndroid Build Coastguard Worker# ------------------ 57*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cxx_portability], 58*cda5da8dSAndroid Build Coastguard Worker[#if defined __cplusplus 59*cda5da8dSAndroid Build Coastguard Worker# define YY_CPLUSPLUS __cplusplus 60*cda5da8dSAndroid Build Coastguard Worker#else 61*cda5da8dSAndroid Build Coastguard Worker# define YY_CPLUSPLUS 199711L 62*cda5da8dSAndroid Build Coastguard Worker#endif 63*cda5da8dSAndroid Build Coastguard Worker 64*cda5da8dSAndroid Build Coastguard Worker// Support move semantics when possible. 65*cda5da8dSAndroid Build Coastguard Worker#if 201103L <= YY_CPLUSPLUS 66*cda5da8dSAndroid Build Coastguard Worker# define YY_MOVE std::move 67*cda5da8dSAndroid Build Coastguard Worker# define YY_MOVE_OR_COPY move 68*cda5da8dSAndroid Build Coastguard Worker# define YY_MOVE_REF(Type) Type&& 69*cda5da8dSAndroid Build Coastguard Worker# define YY_RVREF(Type) Type&& 70*cda5da8dSAndroid Build Coastguard Worker# define YY_COPY(Type) Type 71*cda5da8dSAndroid Build Coastguard Worker#else 72*cda5da8dSAndroid Build Coastguard Worker# define YY_MOVE 73*cda5da8dSAndroid Build Coastguard Worker# define YY_MOVE_OR_COPY copy 74*cda5da8dSAndroid Build Coastguard Worker# define YY_MOVE_REF(Type) Type& 75*cda5da8dSAndroid Build Coastguard Worker# define YY_RVREF(Type) const Type& 76*cda5da8dSAndroid Build Coastguard Worker# define YY_COPY(Type) const Type& 77*cda5da8dSAndroid Build Coastguard Worker#endif 78*cda5da8dSAndroid Build Coastguard Worker 79*cda5da8dSAndroid Build Coastguard Worker// Support noexcept when possible. 80*cda5da8dSAndroid Build Coastguard Worker#if 201103L <= YY_CPLUSPLUS 81*cda5da8dSAndroid Build Coastguard Worker# define YY_NOEXCEPT noexcept 82*cda5da8dSAndroid Build Coastguard Worker# define YY_NOTHROW 83*cda5da8dSAndroid Build Coastguard Worker#else 84*cda5da8dSAndroid Build Coastguard Worker# define YY_NOEXCEPT 85*cda5da8dSAndroid Build Coastguard Worker# define YY_NOTHROW throw () 86*cda5da8dSAndroid Build Coastguard Worker#endif 87*cda5da8dSAndroid Build Coastguard Worker 88*cda5da8dSAndroid Build Coastguard Worker// Support constexpr when possible. 89*cda5da8dSAndroid Build Coastguard Worker#if 201703 <= YY_CPLUSPLUS 90*cda5da8dSAndroid Build Coastguard Worker# define YY_CONSTEXPR constexpr 91*cda5da8dSAndroid Build Coastguard Worker#else 92*cda5da8dSAndroid Build Coastguard Worker# define YY_CONSTEXPR 93*cda5da8dSAndroid Build Coastguard Worker#endif[]dnl 94*cda5da8dSAndroid Build Coastguard Worker]) 95*cda5da8dSAndroid Build Coastguard Worker 96*cda5da8dSAndroid Build Coastguard Worker 97*cda5da8dSAndroid Build Coastguard Worker## ---------------- ## 98*cda5da8dSAndroid Build Coastguard Worker## Default values. ## 99*cda5da8dSAndroid Build Coastguard Worker## ---------------- ## 100*cda5da8dSAndroid Build Coastguard Worker 101*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.parser.class]], [[parser]]) 102*cda5da8dSAndroid Build Coastguard Worker 103*cda5da8dSAndroid Build Coastguard Worker# Don't do that so that we remember whether we're using a user 104*cda5da8dSAndroid Build Coastguard Worker# request, or the default value. 105*cda5da8dSAndroid Build Coastguard Worker# 106*cda5da8dSAndroid Build Coastguard Worker# b4_percent_define_default([[api.location.type]], [[location]]) 107*cda5da8dSAndroid Build Coastguard Worker 108*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.filename.type]], [[const std::string]]) 109*cda5da8dSAndroid Build Coastguard Worker# Make it a warning for those who used betas of Bison 3.0. 110*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[api.namespace]], m4_defn([b4_prefix])) 111*cda5da8dSAndroid Build Coastguard Worker 112*cda5da8dSAndroid Build Coastguard Workerb4_percent_define_default([[define_location_comparison]], 113*cda5da8dSAndroid Build Coastguard Worker [m4_if(b4_percent_define_get([[filename_type]]), 114*cda5da8dSAndroid Build Coastguard Worker [std::string], [[true]], [[false]])]) 115*cda5da8dSAndroid Build Coastguard Worker 116*cda5da8dSAndroid Build Coastguard Worker 117*cda5da8dSAndroid Build Coastguard Worker 118*cda5da8dSAndroid Build Coastguard Worker## ----------- ## 119*cda5da8dSAndroid Build Coastguard Worker## Namespace. ## 120*cda5da8dSAndroid Build Coastguard Worker## ----------- ## 121*cda5da8dSAndroid Build Coastguard Worker 122*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_namespace_ref], [b4_percent_define_get([[api.namespace]])]) 123*cda5da8dSAndroid Build Coastguard Worker 124*cda5da8dSAndroid Build Coastguard Worker 125*cda5da8dSAndroid Build Coastguard Worker# Don't permit an empty b4_namespace_ref. Any '::parser::foo' appended to it 126*cda5da8dSAndroid Build Coastguard Worker# would compile as an absolute reference with 'parser' in the global namespace. 127*cda5da8dSAndroid Build Coastguard Worker# b4_namespace_open would open an anonymous namespace and thus establish 128*cda5da8dSAndroid Build Coastguard Worker# internal linkage. This would compile. However, it's cryptic, and internal 129*cda5da8dSAndroid Build Coastguard Worker# linkage for the parser would be specified in all translation units that 130*cda5da8dSAndroid Build Coastguard Worker# include the header, which is always generated. If we ever need to permit 131*cda5da8dSAndroid Build Coastguard Worker# internal linkage somehow, surely we can find a cleaner approach. 132*cda5da8dSAndroid Build Coastguard Workerm4_if(m4_bregexp(b4_namespace_ref, [^[ ]*$]), [-1], [], 133*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]), 134*cda5da8dSAndroid Build Coastguard Worker [[namespace reference is empty]])]) 135*cda5da8dSAndroid Build Coastguard Worker 136*cda5da8dSAndroid Build Coastguard Worker# Instead of assuming the C++ compiler will do it, Bison should reject any 137*cda5da8dSAndroid Build Coastguard Worker# invalid b4_namespace_ref that would be converted to a valid 138*cda5da8dSAndroid Build Coastguard Worker# b4_namespace_open. The problem is that Bison doesn't always output 139*cda5da8dSAndroid Build Coastguard Worker# b4_namespace_ref to uncommented code but should reserve the ability to do so 140*cda5da8dSAndroid Build Coastguard Worker# in future releases without risking breaking any existing user grammars. 141*cda5da8dSAndroid Build Coastguard Worker# Specifically, don't allow empty names as b4_namespace_open would just convert 142*cda5da8dSAndroid Build Coastguard Worker# those into anonymous namespaces, and that might tempt some users. 143*cda5da8dSAndroid Build Coastguard Workerm4_if(m4_bregexp(b4_namespace_ref, [::[ ]*::]), [-1], [], 144*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]), 145*cda5da8dSAndroid Build Coastguard Worker [[namespace reference has consecutive "::"]])]) 146*cda5da8dSAndroid Build Coastguard Workerm4_if(m4_bregexp(b4_namespace_ref, [::[ ]*$]), [-1], [], 147*cda5da8dSAndroid Build Coastguard Worker[b4_complain_at(b4_percent_define_get_loc([[api.namespace]]), 148*cda5da8dSAndroid Build Coastguard Worker [[namespace reference has a trailing "::"]])]) 149*cda5da8dSAndroid Build Coastguard Worker 150*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_namespace_open], 151*cda5da8dSAndroid Build Coastguard Worker[b4_user_code([b4_percent_define_get_syncline([[api.namespace]])dnl 152*cda5da8dSAndroid Build Coastguard Worker[namespace ]m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref), 153*cda5da8dSAndroid Build Coastguard Worker [^\(.\)[ ]*::], [\1])), 154*cda5da8dSAndroid Build Coastguard Worker [::], [ { namespace ])[ {]])]) 155*cda5da8dSAndroid Build Coastguard Worker 156*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_namespace_close], 157*cda5da8dSAndroid Build Coastguard Worker[b4_user_code([b4_percent_define_get_syncline([[api.namespace]])dnl 158*cda5da8dSAndroid Build Coastguard Workerm4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]), 159*cda5da8dSAndroid Build Coastguard Worker [^\(.\)[ ]*\(::\)?\([^][:]\|:[^:]\)*], 160*cda5da8dSAndroid Build Coastguard Worker [\1])), 161*cda5da8dSAndroid Build Coastguard Worker [::\([^][:]\|:[^:]\)*], [} ])[} // ]b4_namespace_ref])]) 162*cda5da8dSAndroid Build Coastguard Worker 163*cda5da8dSAndroid Build Coastguard Worker 164*cda5da8dSAndroid Build Coastguard Worker## ------------- ## 165*cda5da8dSAndroid Build Coastguard Worker## Token kinds. ## 166*cda5da8dSAndroid Build Coastguard Worker## ------------- ## 167*cda5da8dSAndroid Build Coastguard Worker 168*cda5da8dSAndroid Build Coastguard Worker 169*cda5da8dSAndroid Build Coastguard Worker# b4_token_enums 170*cda5da8dSAndroid Build Coastguard Worker# -------------- 171*cda5da8dSAndroid Build Coastguard Worker# Output the definition of the token kinds. 172*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_enums], 173*cda5da8dSAndroid Build Coastguard Worker[[enum token_kind_type 174*cda5da8dSAndroid Build Coastguard Worker { 175*cda5da8dSAndroid Build Coastguard Worker ]b4_symbol([-2], [id])[ = -2, 176*cda5da8dSAndroid Build Coastguard Worker]b4_symbol_foreach([b4_token_enum])dnl 177*cda5da8dSAndroid Build Coastguard Worker[ };]dnl 178*cda5da8dSAndroid Build Coastguard Worker]) 179*cda5da8dSAndroid Build Coastguard Worker 180*cda5da8dSAndroid Build Coastguard Worker 181*cda5da8dSAndroid Build Coastguard Worker 182*cda5da8dSAndroid Build Coastguard Worker## -------------- ## 183*cda5da8dSAndroid Build Coastguard Worker## Symbol kinds. ## 184*cda5da8dSAndroid Build Coastguard Worker## -------------- ## 185*cda5da8dSAndroid Build Coastguard Worker 186*cda5da8dSAndroid Build Coastguard Worker# b4_declare_symbol_enum 187*cda5da8dSAndroid Build Coastguard Worker# ---------------------- 188*cda5da8dSAndroid Build Coastguard Worker# The definition of the symbol internal numbers as an enum. 189*cda5da8dSAndroid Build Coastguard Worker# Defining YYEMPTY here is important: it forces the compiler 190*cda5da8dSAndroid Build Coastguard Worker# to use a signed type, which matters for yytoken. 191*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_declare_symbol_enum], 192*cda5da8dSAndroid Build Coastguard Worker[[enum symbol_kind_type 193*cda5da8dSAndroid Build Coastguard Worker { 194*cda5da8dSAndroid Build Coastguard Worker YYNTOKENS = ]b4_tokens_number[, ///< Number of tokens. 195*cda5da8dSAndroid Build Coastguard Worker ]b4_symbol(empty, kind_base)[ = -2, 196*cda5da8dSAndroid Build Coastguard Worker]b4_symbol_foreach([ b4_symbol_enum])dnl 197*cda5da8dSAndroid Build Coastguard Worker[ };]]) 198*cda5da8dSAndroid Build Coastguard Worker 199*cda5da8dSAndroid Build Coastguard Worker 200*cda5da8dSAndroid Build Coastguard Worker 201*cda5da8dSAndroid Build Coastguard Worker## ----------------- ## 202*cda5da8dSAndroid Build Coastguard Worker## Semantic Values. ## 203*cda5da8dSAndroid Build Coastguard Worker## ----------------- ## 204*cda5da8dSAndroid Build Coastguard Worker 205*cda5da8dSAndroid Build Coastguard Worker 206*cda5da8dSAndroid Build Coastguard Worker 207*cda5da8dSAndroid Build Coastguard Worker# b4_value_type_declare 208*cda5da8dSAndroid Build Coastguard Worker# --------------------- 209*cda5da8dSAndroid Build Coastguard Worker# Declare value_type. 210*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_value_type_declare], 211*cda5da8dSAndroid Build Coastguard Worker[b4_value_type_setup[]dnl 212*cda5da8dSAndroid Build Coastguard Worker[ /// Symbol semantic values. 213*cda5da8dSAndroid Build Coastguard Worker]m4_bmatch(b4_percent_define_get_kind([[api.value.type]]), 214*cda5da8dSAndroid Build Coastguard Worker[code], 215*cda5da8dSAndroid Build Coastguard Worker[[ typedef ]b4_percent_define_get([[api.value.type]])[ value_type;]], 216*cda5da8dSAndroid Build Coastguard Worker[m4_bmatch(b4_percent_define_get([[api.value.type]]), 217*cda5da8dSAndroid Build Coastguard Worker[union\|union-directive], 218*cda5da8dSAndroid Build Coastguard Worker[[ union value_type 219*cda5da8dSAndroid Build Coastguard Worker { 220*cda5da8dSAndroid Build Coastguard Worker]b4_user_union_members[ 221*cda5da8dSAndroid Build Coastguard Worker };]])])dnl 222*cda5da8dSAndroid Build Coastguard Worker]) 223*cda5da8dSAndroid Build Coastguard Worker 224*cda5da8dSAndroid Build Coastguard Worker 225*cda5da8dSAndroid Build Coastguard Worker# b4_public_types_declare 226*cda5da8dSAndroid Build Coastguard Worker# ----------------------- 227*cda5da8dSAndroid Build Coastguard Worker# Define the public types: token, semantic value, location, and so forth. 228*cda5da8dSAndroid Build Coastguard Worker# Depending on %define token_lex, may be output in the header or source file. 229*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_public_types_declare], 230*cda5da8dSAndroid Build Coastguard Worker[b4_glr2_cc_if( 231*cda5da8dSAndroid Build Coastguard Worker[b4_value_type_declare], 232*cda5da8dSAndroid Build Coastguard Worker[[#ifdef ]b4_api_PREFIX[STYPE 233*cda5da8dSAndroid Build Coastguard Worker# ifdef __GNUC__ 234*cda5da8dSAndroid Build Coastguard Worker# pragma GCC message "bison: do not #define ]b4_api_PREFIX[STYPE in C++, use %define api.value.type" 235*cda5da8dSAndroid Build Coastguard Worker# endif 236*cda5da8dSAndroid Build Coastguard Worker typedef ]b4_api_PREFIX[STYPE value_type; 237*cda5da8dSAndroid Build Coastguard Worker#else 238*cda5da8dSAndroid Build Coastguard Worker]b4_value_type_declare[ 239*cda5da8dSAndroid Build Coastguard Worker#endif 240*cda5da8dSAndroid Build Coastguard Worker /// Backward compatibility (Bison 3.8). 241*cda5da8dSAndroid Build Coastguard Worker typedef value_type semantic_type; 242*cda5da8dSAndroid Build Coastguard Worker]])[]b4_locations_if([ 243*cda5da8dSAndroid Build Coastguard Worker /// Symbol locations. 244*cda5da8dSAndroid Build Coastguard Worker typedef b4_percent_define_get([[api.location.type]], 245*cda5da8dSAndroid Build Coastguard Worker [[location]]) location_type;])[ 246*cda5da8dSAndroid Build Coastguard Worker 247*cda5da8dSAndroid Build Coastguard Worker /// Syntax errors thrown from user actions. 248*cda5da8dSAndroid Build Coastguard Worker struct syntax_error : std::runtime_error 249*cda5da8dSAndroid Build Coastguard Worker { 250*cda5da8dSAndroid Build Coastguard Worker syntax_error (]b4_locations_if([const location_type& l, ])[const std::string& m) 251*cda5da8dSAndroid Build Coastguard Worker : std::runtime_error (m)]b4_locations_if([ 252*cda5da8dSAndroid Build Coastguard Worker , location (l)])[ 253*cda5da8dSAndroid Build Coastguard Worker {} 254*cda5da8dSAndroid Build Coastguard Worker 255*cda5da8dSAndroid Build Coastguard Worker syntax_error (const syntax_error& s) 256*cda5da8dSAndroid Build Coastguard Worker : std::runtime_error (s.what ())]b4_locations_if([ 257*cda5da8dSAndroid Build Coastguard Worker , location (s.location)])[ 258*cda5da8dSAndroid Build Coastguard Worker {} 259*cda5da8dSAndroid Build Coastguard Worker 260*cda5da8dSAndroid Build Coastguard Worker ~syntax_error () YY_NOEXCEPT YY_NOTHROW;]b4_locations_if([ 261*cda5da8dSAndroid Build Coastguard Worker 262*cda5da8dSAndroid Build Coastguard Worker location_type location;])[ 263*cda5da8dSAndroid Build Coastguard Worker }; 264*cda5da8dSAndroid Build Coastguard Worker 265*cda5da8dSAndroid Build Coastguard Worker /// Token kinds. 266*cda5da8dSAndroid Build Coastguard Worker struct token 267*cda5da8dSAndroid Build Coastguard Worker { 268*cda5da8dSAndroid Build Coastguard Worker ]b4_token_enums[]b4_glr2_cc_if([], [[ 269*cda5da8dSAndroid Build Coastguard Worker /// Backward compatibility alias (Bison 3.6). 270*cda5da8dSAndroid Build Coastguard Worker typedef token_kind_type yytokentype;]])[ 271*cda5da8dSAndroid Build Coastguard Worker }; 272*cda5da8dSAndroid Build Coastguard Worker 273*cda5da8dSAndroid Build Coastguard Worker /// Token kind, as returned by yylex. 274*cda5da8dSAndroid Build Coastguard Worker typedef token::token_kind_type token_kind_type;]b4_glr2_cc_if([], [[ 275*cda5da8dSAndroid Build Coastguard Worker 276*cda5da8dSAndroid Build Coastguard Worker /// Backward compatibility alias (Bison 3.6). 277*cda5da8dSAndroid Build Coastguard Worker typedef token_kind_type token_type;]])[ 278*cda5da8dSAndroid Build Coastguard Worker 279*cda5da8dSAndroid Build Coastguard Worker /// Symbol kinds. 280*cda5da8dSAndroid Build Coastguard Worker struct symbol_kind 281*cda5da8dSAndroid Build Coastguard Worker { 282*cda5da8dSAndroid Build Coastguard Worker ]b4_declare_symbol_enum[ 283*cda5da8dSAndroid Build Coastguard Worker }; 284*cda5da8dSAndroid Build Coastguard Worker 285*cda5da8dSAndroid Build Coastguard Worker /// (Internal) symbol kind. 286*cda5da8dSAndroid Build Coastguard Worker typedef symbol_kind::symbol_kind_type symbol_kind_type; 287*cda5da8dSAndroid Build Coastguard Worker 288*cda5da8dSAndroid Build Coastguard Worker /// The number of tokens. 289*cda5da8dSAndroid Build Coastguard Worker static const symbol_kind_type YYNTOKENS = symbol_kind::YYNTOKENS; 290*cda5da8dSAndroid Build Coastguard Worker]]) 291*cda5da8dSAndroid Build Coastguard Worker 292*cda5da8dSAndroid Build Coastguard Worker 293*cda5da8dSAndroid Build Coastguard Worker# b4_symbol_type_define 294*cda5da8dSAndroid Build Coastguard Worker# --------------------- 295*cda5da8dSAndroid Build Coastguard Worker# Define symbol_type, the external type for symbols used for symbol 296*cda5da8dSAndroid Build Coastguard Worker# constructors. 297*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_symbol_type_define], 298*cda5da8dSAndroid Build Coastguard Worker[[ /// A complete symbol. 299*cda5da8dSAndroid Build Coastguard Worker /// 300*cda5da8dSAndroid Build Coastguard Worker /// Expects its Base type to provide access to the symbol kind 301*cda5da8dSAndroid Build Coastguard Worker /// via kind (). 302*cda5da8dSAndroid Build Coastguard Worker /// 303*cda5da8dSAndroid Build Coastguard Worker /// Provide access to semantic value]b4_locations_if([ and location])[. 304*cda5da8dSAndroid Build Coastguard Worker template <typename Base> 305*cda5da8dSAndroid Build Coastguard Worker struct basic_symbol : Base 306*cda5da8dSAndroid Build Coastguard Worker { 307*cda5da8dSAndroid Build Coastguard Worker /// Alias to Base. 308*cda5da8dSAndroid Build Coastguard Worker typedef Base super_type; 309*cda5da8dSAndroid Build Coastguard Worker 310*cda5da8dSAndroid Build Coastguard Worker /// Default constructor. 311*cda5da8dSAndroid Build Coastguard Worker basic_symbol () YY_NOEXCEPT 312*cda5da8dSAndroid Build Coastguard Worker : value ()]b4_locations_if([ 313*cda5da8dSAndroid Build Coastguard Worker , location ()])[ 314*cda5da8dSAndroid Build Coastguard Worker {} 315*cda5da8dSAndroid Build Coastguard Worker 316*cda5da8dSAndroid Build Coastguard Worker#if 201103L <= YY_CPLUSPLUS 317*cda5da8dSAndroid Build Coastguard Worker /// Move constructor. 318*cda5da8dSAndroid Build Coastguard Worker basic_symbol (basic_symbol&& that) 319*cda5da8dSAndroid Build Coastguard Worker : Base (std::move (that)) 320*cda5da8dSAndroid Build Coastguard Worker , value (]b4_variant_if([], [std::move (that.value)]))b4_locations_if([ 321*cda5da8dSAndroid Build Coastguard Worker , location (std::move (that.location))])[ 322*cda5da8dSAndroid Build Coastguard Worker {]b4_variant_if([ 323*cda5da8dSAndroid Build Coastguard Worker b4_symbol_variant([this->kind ()], [value], [move], 324*cda5da8dSAndroid Build Coastguard Worker [std::move (that.value)]) 325*cda5da8dSAndroid Build Coastguard Worker ])[} 326*cda5da8dSAndroid Build Coastguard Worker#endif 327*cda5da8dSAndroid Build Coastguard Worker 328*cda5da8dSAndroid Build Coastguard Worker /// Copy constructor. 329*cda5da8dSAndroid Build Coastguard Worker basic_symbol (const basic_symbol& that);]b4_variant_if([[ 330*cda5da8dSAndroid Build Coastguard Worker 331*cda5da8dSAndroid Build Coastguard Worker /// Constructors for typed symbols. 332*cda5da8dSAndroid Build Coastguard Worker]b4_type_foreach([b4_basic_symbol_constructor_define], [ 333*cda5da8dSAndroid Build Coastguard Worker])], [[ 334*cda5da8dSAndroid Build Coastguard Worker /// Constructor for valueless symbols. 335*cda5da8dSAndroid Build Coastguard Worker basic_symbol (typename Base::kind_type t]b4_locations_if([, 336*cda5da8dSAndroid Build Coastguard Worker YY_MOVE_REF (location_type) l])[); 337*cda5da8dSAndroid Build Coastguard Worker 338*cda5da8dSAndroid Build Coastguard Worker /// Constructor for symbols with semantic value. 339*cda5da8dSAndroid Build Coastguard Worker basic_symbol (typename Base::kind_type t, 340*cda5da8dSAndroid Build Coastguard Worker YY_RVREF (value_type) v]b4_locations_if([, 341*cda5da8dSAndroid Build Coastguard Worker YY_RVREF (location_type) l])[); 342*cda5da8dSAndroid Build Coastguard Worker]])[ 343*cda5da8dSAndroid Build Coastguard Worker /// Destroy the symbol. 344*cda5da8dSAndroid Build Coastguard Worker ~basic_symbol () 345*cda5da8dSAndroid Build Coastguard Worker { 346*cda5da8dSAndroid Build Coastguard Worker clear (); 347*cda5da8dSAndroid Build Coastguard Worker } 348*cda5da8dSAndroid Build Coastguard Worker 349*cda5da8dSAndroid Build Coastguard Worker]b4_glr2_cc_if([[ 350*cda5da8dSAndroid Build Coastguard Worker /// Copy assignment. 351*cda5da8dSAndroid Build Coastguard Worker basic_symbol& operator= (const basic_symbol& that) 352*cda5da8dSAndroid Build Coastguard Worker { 353*cda5da8dSAndroid Build Coastguard Worker Base::operator= (that);]b4_variant_if([[ 354*cda5da8dSAndroid Build Coastguard Worker ]b4_symbol_variant([this->kind ()], [value], [copy], 355*cda5da8dSAndroid Build Coastguard Worker [that.value])], [[ 356*cda5da8dSAndroid Build Coastguard Worker value = that.value]])[;]b4_locations_if([[ 357*cda5da8dSAndroid Build Coastguard Worker location = that.location;]])[ 358*cda5da8dSAndroid Build Coastguard Worker return *this; 359*cda5da8dSAndroid Build Coastguard Worker } 360*cda5da8dSAndroid Build Coastguard Worker 361*cda5da8dSAndroid Build Coastguard Worker /// Move assignment. 362*cda5da8dSAndroid Build Coastguard Worker basic_symbol& operator= (basic_symbol&& that) 363*cda5da8dSAndroid Build Coastguard Worker { 364*cda5da8dSAndroid Build Coastguard Worker Base::operator= (std::move (that));]b4_variant_if([[ 365*cda5da8dSAndroid Build Coastguard Worker ]b4_symbol_variant([this->kind ()], [value], [move], 366*cda5da8dSAndroid Build Coastguard Worker [std::move (that.value)])], [[ 367*cda5da8dSAndroid Build Coastguard Worker value = std::move (that.value)]])[;]b4_locations_if([[ 368*cda5da8dSAndroid Build Coastguard Worker location = std::move (that.location);]])[ 369*cda5da8dSAndroid Build Coastguard Worker return *this; 370*cda5da8dSAndroid Build Coastguard Worker } 371*cda5da8dSAndroid Build Coastguard Worker]])[ 372*cda5da8dSAndroid Build Coastguard Worker 373*cda5da8dSAndroid Build Coastguard Worker /// Destroy contents, and record that is empty. 374*cda5da8dSAndroid Build Coastguard Worker void clear () YY_NOEXCEPT 375*cda5da8dSAndroid Build Coastguard Worker {]b4_variant_if([[ 376*cda5da8dSAndroid Build Coastguard Worker // User destructor. 377*cda5da8dSAndroid Build Coastguard Worker symbol_kind_type yykind = this->kind (); 378*cda5da8dSAndroid Build Coastguard Worker basic_symbol<Base>& yysym = *this; 379*cda5da8dSAndroid Build Coastguard Worker (void) yysym; 380*cda5da8dSAndroid Build Coastguard Worker switch (yykind) 381*cda5da8dSAndroid Build Coastguard Worker { 382*cda5da8dSAndroid Build Coastguard Worker]b4_symbol_foreach([b4_symbol_destructor])dnl 383*cda5da8dSAndroid Build Coastguard Worker[ default: 384*cda5da8dSAndroid Build Coastguard Worker break; 385*cda5da8dSAndroid Build Coastguard Worker } 386*cda5da8dSAndroid Build Coastguard Worker 387*cda5da8dSAndroid Build Coastguard Worker // Value type destructor. 388*cda5da8dSAndroid Build Coastguard Worker]b4_symbol_variant([[yykind]], [[value]], [[template destroy]])])[ 389*cda5da8dSAndroid Build Coastguard Worker Base::clear (); 390*cda5da8dSAndroid Build Coastguard Worker } 391*cda5da8dSAndroid Build Coastguard Worker 392*cda5da8dSAndroid Build Coastguard Worker]b4_parse_error_bmatch( 393*cda5da8dSAndroid Build Coastguard Worker[custom\|detailed], 394*cda5da8dSAndroid Build Coastguard Worker[[ /// The user-facing name of this symbol. 395*cda5da8dSAndroid Build Coastguard Worker const char *name () const YY_NOEXCEPT 396*cda5da8dSAndroid Build Coastguard Worker { 397*cda5da8dSAndroid Build Coastguard Worker return ]b4_parser_class[::symbol_name (this->kind ()); 398*cda5da8dSAndroid Build Coastguard Worker }]], 399*cda5da8dSAndroid Build Coastguard Worker[simple], 400*cda5da8dSAndroid Build Coastguard Worker[[#if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[ 401*cda5da8dSAndroid Build Coastguard Worker /// The user-facing name of this symbol. 402*cda5da8dSAndroid Build Coastguard Worker const char *name () const YY_NOEXCEPT 403*cda5da8dSAndroid Build Coastguard Worker { 404*cda5da8dSAndroid Build Coastguard Worker return ]b4_parser_class[::symbol_name (this->kind ()); 405*cda5da8dSAndroid Build Coastguard Worker } 406*cda5da8dSAndroid Build Coastguard Worker#endif // #if ]b4_api_PREFIX[DEBUG || ]b4_token_table_flag[ 407*cda5da8dSAndroid Build Coastguard Worker]], 408*cda5da8dSAndroid Build Coastguard Worker[verbose], 409*cda5da8dSAndroid Build Coastguard Worker[[ /// The user-facing name of this symbol. 410*cda5da8dSAndroid Build Coastguard Worker std::string name () const YY_NOEXCEPT 411*cda5da8dSAndroid Build Coastguard Worker { 412*cda5da8dSAndroid Build Coastguard Worker return ]b4_parser_class[::symbol_name (this->kind ()); 413*cda5da8dSAndroid Build Coastguard Worker }]])[]b4_glr2_cc_if([], [[ 414*cda5da8dSAndroid Build Coastguard Worker 415*cda5da8dSAndroid Build Coastguard Worker /// Backward compatibility (Bison 3.6). 416*cda5da8dSAndroid Build Coastguard Worker symbol_kind_type type_get () const YY_NOEXCEPT;]])[ 417*cda5da8dSAndroid Build Coastguard Worker 418*cda5da8dSAndroid Build Coastguard Worker /// Whether empty. 419*cda5da8dSAndroid Build Coastguard Worker bool empty () const YY_NOEXCEPT; 420*cda5da8dSAndroid Build Coastguard Worker 421*cda5da8dSAndroid Build Coastguard Worker /// Destructive move, \a s is emptied into this. 422*cda5da8dSAndroid Build Coastguard Worker void move (basic_symbol& s); 423*cda5da8dSAndroid Build Coastguard Worker 424*cda5da8dSAndroid Build Coastguard Worker /// The semantic value. 425*cda5da8dSAndroid Build Coastguard Worker value_type value;]b4_locations_if([ 426*cda5da8dSAndroid Build Coastguard Worker 427*cda5da8dSAndroid Build Coastguard Worker /// The location. 428*cda5da8dSAndroid Build Coastguard Worker location_type location;])[ 429*cda5da8dSAndroid Build Coastguard Worker 430*cda5da8dSAndroid Build Coastguard Worker private: 431*cda5da8dSAndroid Build Coastguard Worker#if YY_CPLUSPLUS < 201103L 432*cda5da8dSAndroid Build Coastguard Worker /// Assignment operator. 433*cda5da8dSAndroid Build Coastguard Worker basic_symbol& operator= (const basic_symbol& that); 434*cda5da8dSAndroid Build Coastguard Worker#endif 435*cda5da8dSAndroid Build Coastguard Worker }; 436*cda5da8dSAndroid Build Coastguard Worker 437*cda5da8dSAndroid Build Coastguard Worker /// Type access provider for token (enum) based symbols. 438*cda5da8dSAndroid Build Coastguard Worker struct by_kind 439*cda5da8dSAndroid Build Coastguard Worker { 440*cda5da8dSAndroid Build Coastguard Worker /// The symbol kind as needed by the constructor. 441*cda5da8dSAndroid Build Coastguard Worker typedef token_kind_type kind_type; 442*cda5da8dSAndroid Build Coastguard Worker 443*cda5da8dSAndroid Build Coastguard Worker /// Default constructor. 444*cda5da8dSAndroid Build Coastguard Worker by_kind () YY_NOEXCEPT; 445*cda5da8dSAndroid Build Coastguard Worker 446*cda5da8dSAndroid Build Coastguard Worker#if 201103L <= YY_CPLUSPLUS 447*cda5da8dSAndroid Build Coastguard Worker /// Move constructor. 448*cda5da8dSAndroid Build Coastguard Worker by_kind (by_kind&& that) YY_NOEXCEPT; 449*cda5da8dSAndroid Build Coastguard Worker#endif 450*cda5da8dSAndroid Build Coastguard Worker 451*cda5da8dSAndroid Build Coastguard Worker /// Copy constructor. 452*cda5da8dSAndroid Build Coastguard Worker by_kind (const by_kind& that) YY_NOEXCEPT; 453*cda5da8dSAndroid Build Coastguard Worker 454*cda5da8dSAndroid Build Coastguard Worker /// Constructor from (external) token numbers. 455*cda5da8dSAndroid Build Coastguard Worker by_kind (kind_type t) YY_NOEXCEPT; 456*cda5da8dSAndroid Build Coastguard Worker 457*cda5da8dSAndroid Build Coastguard Worker]b4_glr2_cc_if([[ 458*cda5da8dSAndroid Build Coastguard Worker /// Copy assignment. 459*cda5da8dSAndroid Build Coastguard Worker by_kind& operator= (const by_kind& that); 460*cda5da8dSAndroid Build Coastguard Worker 461*cda5da8dSAndroid Build Coastguard Worker /// Move assignment. 462*cda5da8dSAndroid Build Coastguard Worker by_kind& operator= (by_kind&& that); 463*cda5da8dSAndroid Build Coastguard Worker]])[ 464*cda5da8dSAndroid Build Coastguard Worker 465*cda5da8dSAndroid Build Coastguard Worker /// Record that this symbol is empty. 466*cda5da8dSAndroid Build Coastguard Worker void clear () YY_NOEXCEPT; 467*cda5da8dSAndroid Build Coastguard Worker 468*cda5da8dSAndroid Build Coastguard Worker /// Steal the symbol kind from \a that. 469*cda5da8dSAndroid Build Coastguard Worker void move (by_kind& that); 470*cda5da8dSAndroid Build Coastguard Worker 471*cda5da8dSAndroid Build Coastguard Worker /// The (internal) type number (corresponding to \a type). 472*cda5da8dSAndroid Build Coastguard Worker /// \a empty when empty. 473*cda5da8dSAndroid Build Coastguard Worker symbol_kind_type kind () const YY_NOEXCEPT;]b4_glr2_cc_if([], [[ 474*cda5da8dSAndroid Build Coastguard Worker 475*cda5da8dSAndroid Build Coastguard Worker /// Backward compatibility (Bison 3.6). 476*cda5da8dSAndroid Build Coastguard Worker symbol_kind_type type_get () const YY_NOEXCEPT;]])[ 477*cda5da8dSAndroid Build Coastguard Worker 478*cda5da8dSAndroid Build Coastguard Worker /// The symbol kind. 479*cda5da8dSAndroid Build Coastguard Worker /// \a ]b4_symbol_prefix[YYEMPTY when empty. 480*cda5da8dSAndroid Build Coastguard Worker symbol_kind_type kind_; 481*cda5da8dSAndroid Build Coastguard Worker };]b4_glr2_cc_if([], [[ 482*cda5da8dSAndroid Build Coastguard Worker 483*cda5da8dSAndroid Build Coastguard Worker /// Backward compatibility for a private implementation detail (Bison 3.6). 484*cda5da8dSAndroid Build Coastguard Worker typedef by_kind by_type;]])[ 485*cda5da8dSAndroid Build Coastguard Worker 486*cda5da8dSAndroid Build Coastguard Worker /// "External" symbols: returned by the scanner. 487*cda5da8dSAndroid Build Coastguard Worker struct symbol_type : basic_symbol<by_kind> 488*cda5da8dSAndroid Build Coastguard Worker {]b4_variant_if([[ 489*cda5da8dSAndroid Build Coastguard Worker /// Superclass. 490*cda5da8dSAndroid Build Coastguard Worker typedef basic_symbol<by_kind> super_type; 491*cda5da8dSAndroid Build Coastguard Worker 492*cda5da8dSAndroid Build Coastguard Worker /// Empty symbol. 493*cda5da8dSAndroid Build Coastguard Worker symbol_type () YY_NOEXCEPT {} 494*cda5da8dSAndroid Build Coastguard Worker 495*cda5da8dSAndroid Build Coastguard Worker /// Constructor for valueless symbols, and symbols from each type. 496*cda5da8dSAndroid Build Coastguard Worker]b4_type_foreach([_b4_symbol_constructor_define])dnl 497*cda5da8dSAndroid Build Coastguard Worker ])[}; 498*cda5da8dSAndroid Build Coastguard Worker]]) 499*cda5da8dSAndroid Build Coastguard Worker 500*cda5da8dSAndroid Build Coastguard Worker 501*cda5da8dSAndroid Build Coastguard Worker# b4_public_types_define(hh|cc) 502*cda5da8dSAndroid Build Coastguard Worker# ----------------------------- 503*cda5da8dSAndroid Build Coastguard Worker# Provide the implementation needed by the public types. 504*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_public_types_define], 505*cda5da8dSAndroid Build Coastguard Worker[[ // basic_symbol. 506*cda5da8dSAndroid Build Coastguard Worker template <typename Base> 507*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::basic_symbol<Base>::basic_symbol (const basic_symbol& that) 508*cda5da8dSAndroid Build Coastguard Worker : Base (that) 509*cda5da8dSAndroid Build Coastguard Worker , value (]b4_variant_if([], [that.value]))b4_locations_if([ 510*cda5da8dSAndroid Build Coastguard Worker , location (that.location)])[ 511*cda5da8dSAndroid Build Coastguard Worker {]b4_variant_if([ 512*cda5da8dSAndroid Build Coastguard Worker b4_symbol_variant([this->kind ()], [value], [copy], 513*cda5da8dSAndroid Build Coastguard Worker [YY_MOVE (that.value)]) 514*cda5da8dSAndroid Build Coastguard Worker ])[} 515*cda5da8dSAndroid Build Coastguard Worker 516*cda5da8dSAndroid Build Coastguard Worker]b4_variant_if([], [[ 517*cda5da8dSAndroid Build Coastguard Worker /// Constructor for valueless symbols. 518*cda5da8dSAndroid Build Coastguard Worker template <typename Base> 519*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::basic_symbol<Base>::basic_symbol (]b4_join( 520*cda5da8dSAndroid Build Coastguard Worker [typename Base::kind_type t], 521*cda5da8dSAndroid Build Coastguard Worker b4_locations_if([YY_MOVE_REF (location_type) l]))[) 522*cda5da8dSAndroid Build Coastguard Worker : Base (t) 523*cda5da8dSAndroid Build Coastguard Worker , value ()]b4_locations_if([ 524*cda5da8dSAndroid Build Coastguard Worker , location (l)])[ 525*cda5da8dSAndroid Build Coastguard Worker {} 526*cda5da8dSAndroid Build Coastguard Worker 527*cda5da8dSAndroid Build Coastguard Worker template <typename Base> 528*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::basic_symbol<Base>::basic_symbol (]b4_join( 529*cda5da8dSAndroid Build Coastguard Worker [typename Base::kind_type t], 530*cda5da8dSAndroid Build Coastguard Worker [YY_RVREF (value_type) v], 531*cda5da8dSAndroid Build Coastguard Worker b4_locations_if([YY_RVREF (location_type) l]))[) 532*cda5da8dSAndroid Build Coastguard Worker : Base (t) 533*cda5da8dSAndroid Build Coastguard Worker , value (]b4_variant_if([], [YY_MOVE (v)])[)]b4_locations_if([ 534*cda5da8dSAndroid Build Coastguard Worker , location (YY_MOVE (l))])[ 535*cda5da8dSAndroid Build Coastguard Worker {]b4_variant_if([[ 536*cda5da8dSAndroid Build Coastguard Worker (void) v; 537*cda5da8dSAndroid Build Coastguard Worker ]b4_symbol_variant([this->kind ()], [value], [YY_MOVE_OR_COPY], [YY_MOVE (v)])])[}]])[ 538*cda5da8dSAndroid Build Coastguard Worker 539*cda5da8dSAndroid Build Coastguard Worker]b4_glr2_cc_if([], [[ 540*cda5da8dSAndroid Build Coastguard Worker template <typename Base> 541*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::symbol_kind_type 542*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::basic_symbol<Base>::type_get () const YY_NOEXCEPT 543*cda5da8dSAndroid Build Coastguard Worker { 544*cda5da8dSAndroid Build Coastguard Worker return this->kind (); 545*cda5da8dSAndroid Build Coastguard Worker } 546*cda5da8dSAndroid Build Coastguard Worker]])[ 547*cda5da8dSAndroid Build Coastguard Worker 548*cda5da8dSAndroid Build Coastguard Worker template <typename Base> 549*cda5da8dSAndroid Build Coastguard Worker bool 550*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::basic_symbol<Base>::empty () const YY_NOEXCEPT 551*cda5da8dSAndroid Build Coastguard Worker { 552*cda5da8dSAndroid Build Coastguard Worker return this->kind () == ]b4_symbol(empty, kind)[; 553*cda5da8dSAndroid Build Coastguard Worker } 554*cda5da8dSAndroid Build Coastguard Worker 555*cda5da8dSAndroid Build Coastguard Worker template <typename Base> 556*cda5da8dSAndroid Build Coastguard Worker void 557*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::basic_symbol<Base>::move (basic_symbol& s) 558*cda5da8dSAndroid Build Coastguard Worker { 559*cda5da8dSAndroid Build Coastguard Worker super_type::move (s); 560*cda5da8dSAndroid Build Coastguard Worker ]b4_variant_if([b4_symbol_variant([this->kind ()], [value], [move], 561*cda5da8dSAndroid Build Coastguard Worker [YY_MOVE (s.value)])], 562*cda5da8dSAndroid Build Coastguard Worker [value = YY_MOVE (s.value);])[]b4_locations_if([ 563*cda5da8dSAndroid Build Coastguard Worker location = YY_MOVE (s.location);])[ 564*cda5da8dSAndroid Build Coastguard Worker } 565*cda5da8dSAndroid Build Coastguard Worker 566*cda5da8dSAndroid Build Coastguard Worker // by_kind. 567*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])b4_parser_class[::by_kind::by_kind () YY_NOEXCEPT 568*cda5da8dSAndroid Build Coastguard Worker : kind_ (]b4_symbol(empty, kind)[) 569*cda5da8dSAndroid Build Coastguard Worker {} 570*cda5da8dSAndroid Build Coastguard Worker 571*cda5da8dSAndroid Build Coastguard Worker#if 201103L <= YY_CPLUSPLUS 572*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])b4_parser_class[::by_kind::by_kind (by_kind&& that) YY_NOEXCEPT 573*cda5da8dSAndroid Build Coastguard Worker : kind_ (that.kind_) 574*cda5da8dSAndroid Build Coastguard Worker { 575*cda5da8dSAndroid Build Coastguard Worker that.clear (); 576*cda5da8dSAndroid Build Coastguard Worker } 577*cda5da8dSAndroid Build Coastguard Worker#endif 578*cda5da8dSAndroid Build Coastguard Worker 579*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])b4_parser_class[::by_kind::by_kind (const by_kind& that) YY_NOEXCEPT 580*cda5da8dSAndroid Build Coastguard Worker : kind_ (that.kind_) 581*cda5da8dSAndroid Build Coastguard Worker {} 582*cda5da8dSAndroid Build Coastguard Worker 583*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])b4_parser_class[::by_kind::by_kind (token_kind_type t) YY_NOEXCEPT 584*cda5da8dSAndroid Build Coastguard Worker : kind_ (yytranslate_ (t)) 585*cda5da8dSAndroid Build Coastguard Worker {} 586*cda5da8dSAndroid Build Coastguard Worker 587*cda5da8dSAndroid Build Coastguard Worker]b4_glr2_cc_if([[ 588*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])]b4_parser_class[::by_kind& 589*cda5da8dSAndroid Build Coastguard Worker b4_parser_class[::by_kind::by_kind::operator= (const by_kind& that) 590*cda5da8dSAndroid Build Coastguard Worker { 591*cda5da8dSAndroid Build Coastguard Worker kind_ = that.kind_; 592*cda5da8dSAndroid Build Coastguard Worker return *this; 593*cda5da8dSAndroid Build Coastguard Worker } 594*cda5da8dSAndroid Build Coastguard Worker 595*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])]b4_parser_class[::by_kind& 596*cda5da8dSAndroid Build Coastguard Worker b4_parser_class[::by_kind::by_kind::operator= (by_kind&& that) 597*cda5da8dSAndroid Build Coastguard Worker { 598*cda5da8dSAndroid Build Coastguard Worker kind_ = that.kind_; 599*cda5da8dSAndroid Build Coastguard Worker that.clear (); 600*cda5da8dSAndroid Build Coastguard Worker return *this; 601*cda5da8dSAndroid Build Coastguard Worker } 602*cda5da8dSAndroid Build Coastguard Worker]])[ 603*cda5da8dSAndroid Build Coastguard Worker 604*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])[void 605*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::by_kind::clear () YY_NOEXCEPT 606*cda5da8dSAndroid Build Coastguard Worker { 607*cda5da8dSAndroid Build Coastguard Worker kind_ = ]b4_symbol(empty, kind)[; 608*cda5da8dSAndroid Build Coastguard Worker } 609*cda5da8dSAndroid Build Coastguard Worker 610*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])[void 611*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::by_kind::move (by_kind& that) 612*cda5da8dSAndroid Build Coastguard Worker { 613*cda5da8dSAndroid Build Coastguard Worker kind_ = that.kind_; 614*cda5da8dSAndroid Build Coastguard Worker that.clear (); 615*cda5da8dSAndroid Build Coastguard Worker } 616*cda5da8dSAndroid Build Coastguard Worker 617*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])[]b4_parser_class[::symbol_kind_type 618*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::by_kind::kind () const YY_NOEXCEPT 619*cda5da8dSAndroid Build Coastguard Worker { 620*cda5da8dSAndroid Build Coastguard Worker return kind_; 621*cda5da8dSAndroid Build Coastguard Worker } 622*cda5da8dSAndroid Build Coastguard Worker 623*cda5da8dSAndroid Build Coastguard Worker]b4_glr2_cc_if([], [[ 624*cda5da8dSAndroid Build Coastguard Worker ]b4_inline([$1])[]b4_parser_class[::symbol_kind_type 625*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::by_kind::type_get () const YY_NOEXCEPT 626*cda5da8dSAndroid Build Coastguard Worker { 627*cda5da8dSAndroid Build Coastguard Worker return this->kind (); 628*cda5da8dSAndroid Build Coastguard Worker } 629*cda5da8dSAndroid Build Coastguard Worker]])[ 630*cda5da8dSAndroid Build Coastguard Worker]]) 631*cda5da8dSAndroid Build Coastguard Worker 632*cda5da8dSAndroid Build Coastguard Worker 633*cda5da8dSAndroid Build Coastguard Worker# b4_token_constructor_define 634*cda5da8dSAndroid Build Coastguard Worker# ---------------------------- 635*cda5da8dSAndroid Build Coastguard Worker# Define make_FOO for all the token kinds. 636*cda5da8dSAndroid Build Coastguard Worker# Use at class-level. Redefined in variant.hh. 637*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_token_constructor_define], []) 638*cda5da8dSAndroid Build Coastguard Worker 639*cda5da8dSAndroid Build Coastguard Worker 640*cda5da8dSAndroid Build Coastguard Worker# b4_yytranslate_define(cc|hh) 641*cda5da8dSAndroid Build Coastguard Worker# ---------------------------- 642*cda5da8dSAndroid Build Coastguard Worker# Define yytranslate_. Sometimes used in the header file ($1=hh), 643*cda5da8dSAndroid Build Coastguard Worker# sometimes in the cc file. 644*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_yytranslate_define], 645*cda5da8dSAndroid Build Coastguard Worker[ b4_inline([$1])b4_parser_class[::symbol_kind_type 646*cda5da8dSAndroid Build Coastguard Worker ]b4_parser_class[::yytranslate_ (int t) YY_NOEXCEPT 647*cda5da8dSAndroid Build Coastguard Worker { 648*cda5da8dSAndroid Build Coastguard Worker]b4_api_token_raw_if( 649*cda5da8dSAndroid Build Coastguard Worker[[ return static_cast<symbol_kind_type> (t);]], 650*cda5da8dSAndroid Build Coastguard Worker[[ // YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to 651*cda5da8dSAndroid Build Coastguard Worker // TOKEN-NUM as returned by yylex. 652*cda5da8dSAndroid Build Coastguard Worker static 653*cda5da8dSAndroid Build Coastguard Worker const ]b4_int_type_for([b4_translate])[ 654*cda5da8dSAndroid Build Coastguard Worker translate_table[] = 655*cda5da8dSAndroid Build Coastguard Worker { 656*cda5da8dSAndroid Build Coastguard Worker ]b4_translate[ 657*cda5da8dSAndroid Build Coastguard Worker }; 658*cda5da8dSAndroid Build Coastguard Worker // Last valid token kind. 659*cda5da8dSAndroid Build Coastguard Worker const int code_max = ]b4_code_max[; 660*cda5da8dSAndroid Build Coastguard Worker 661*cda5da8dSAndroid Build Coastguard Worker if (t <= 0) 662*cda5da8dSAndroid Build Coastguard Worker return symbol_kind::]b4_symbol_prefix[YYEOF; 663*cda5da8dSAndroid Build Coastguard Worker else if (t <= code_max) 664*cda5da8dSAndroid Build Coastguard Worker return static_cast <symbol_kind_type> (translate_table[t]); 665*cda5da8dSAndroid Build Coastguard Worker else 666*cda5da8dSAndroid Build Coastguard Worker return symbol_kind::]b4_symbol_prefix[YYUNDEF;]])[ 667*cda5da8dSAndroid Build Coastguard Worker } 668*cda5da8dSAndroid Build Coastguard Worker]]) 669*cda5da8dSAndroid Build Coastguard Worker 670*cda5da8dSAndroid Build Coastguard Worker 671*cda5da8dSAndroid Build Coastguard Worker# b4_lhs_value([TYPE]) 672*cda5da8dSAndroid Build Coastguard Worker# -------------------- 673*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_lhs_value], 674*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_value([yyval], [$1])]) 675*cda5da8dSAndroid Build Coastguard Worker 676*cda5da8dSAndroid Build Coastguard Worker 677*cda5da8dSAndroid Build Coastguard Worker# b4_rhs_value(RULE-LENGTH, POS, [TYPE]) 678*cda5da8dSAndroid Build Coastguard Worker# -------------------------------------- 679*cda5da8dSAndroid Build Coastguard Worker# FIXME: Dead code. 680*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_rhs_value], 681*cda5da8dSAndroid Build Coastguard Worker[b4_symbol_value([yysemantic_stack_@{($1) - ($2)@}], [$3])]) 682*cda5da8dSAndroid Build Coastguard Worker 683*cda5da8dSAndroid Build Coastguard Worker 684*cda5da8dSAndroid Build Coastguard Worker# b4_lhs_location() 685*cda5da8dSAndroid Build Coastguard Worker# ----------------- 686*cda5da8dSAndroid Build Coastguard Worker# Expansion of @$. 687*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_lhs_location], 688*cda5da8dSAndroid Build Coastguard Worker[(yyloc)]) 689*cda5da8dSAndroid Build Coastguard Worker 690*cda5da8dSAndroid Build Coastguard Worker 691*cda5da8dSAndroid Build Coastguard Worker# b4_rhs_location(RULE-LENGTH, POS) 692*cda5da8dSAndroid Build Coastguard Worker# --------------------------------- 693*cda5da8dSAndroid Build Coastguard Worker# Expansion of @POS, where the current rule has RULE-LENGTH symbols 694*cda5da8dSAndroid Build Coastguard Worker# on RHS. 695*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_rhs_location], 696*cda5da8dSAndroid Build Coastguard Worker[(yylocation_stack_@{($1) - ($2)@})]) 697*cda5da8dSAndroid Build Coastguard Worker 698*cda5da8dSAndroid Build Coastguard Worker 699*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param_decl 700*cda5da8dSAndroid Build Coastguard Worker# ------------------- 701*cda5da8dSAndroid Build Coastguard Worker# Extra formal arguments of the constructor. 702*cda5da8dSAndroid Build Coastguard Worker# Change the parameter names from "foo" into "foo_yyarg", so that 703*cda5da8dSAndroid Build Coastguard Worker# there is no collision bw the user chosen attribute name, and the 704*cda5da8dSAndroid Build Coastguard Worker# argument name in the constructor. 705*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param_decl], 706*cda5da8dSAndroid Build Coastguard Worker[m4_ifset([b4_parse_param], 707*cda5da8dSAndroid Build Coastguard Worker [m4_map_sep([b4_parse_param_decl_1], [, ], [b4_parse_param])])]) 708*cda5da8dSAndroid Build Coastguard Worker 709*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param_decl_1], 710*cda5da8dSAndroid Build Coastguard Worker[$1_yyarg]) 711*cda5da8dSAndroid Build Coastguard Worker 712*cda5da8dSAndroid Build Coastguard Worker 713*cda5da8dSAndroid Build Coastguard Worker 714*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param_cons 715*cda5da8dSAndroid Build Coastguard Worker# ------------------- 716*cda5da8dSAndroid Build Coastguard Worker# Extra initialisations of the constructor. 717*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param_cons], 718*cda5da8dSAndroid Build Coastguard Worker [m4_ifset([b4_parse_param], 719*cda5da8dSAndroid Build Coastguard Worker [ 720*cda5da8dSAndroid Build Coastguard Worker b4_cc_constructor_calls(b4_parse_param)])]) 721*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cc_constructor_calls], 722*cda5da8dSAndroid Build Coastguard Worker [m4_map_sep([b4_cc_constructor_call], [, 723*cda5da8dSAndroid Build Coastguard Worker ], [$@])]) 724*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cc_constructor_call], 725*cda5da8dSAndroid Build Coastguard Worker [$2 ($2_yyarg)]) 726*cda5da8dSAndroid Build Coastguard Worker 727*cda5da8dSAndroid Build Coastguard Worker# b4_parse_param_vars 728*cda5da8dSAndroid Build Coastguard Worker# ------------------- 729*cda5da8dSAndroid Build Coastguard Worker# Extra instance variables. 730*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_parse_param_vars], 731*cda5da8dSAndroid Build Coastguard Worker [m4_ifset([b4_parse_param], 732*cda5da8dSAndroid Build Coastguard Worker [ 733*cda5da8dSAndroid Build Coastguard Worker // User arguments. 734*cda5da8dSAndroid Build Coastguard Workerb4_cc_var_decls(b4_parse_param)])]) 735*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cc_var_decls], 736*cda5da8dSAndroid Build Coastguard Worker [m4_map_sep([b4_cc_var_decl], [ 737*cda5da8dSAndroid Build Coastguard Worker], [$@])]) 738*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_cc_var_decl], 739*cda5da8dSAndroid Build Coastguard Worker [ $1;]) 740*cda5da8dSAndroid Build Coastguard Worker 741*cda5da8dSAndroid Build Coastguard Worker 742*cda5da8dSAndroid Build Coastguard Worker## ---------## 743*cda5da8dSAndroid Build Coastguard Worker## Values. ## 744*cda5da8dSAndroid Build Coastguard Worker## ---------## 745*cda5da8dSAndroid Build Coastguard Worker 746*cda5da8dSAndroid Build Coastguard Worker# b4_yylloc_default_define 747*cda5da8dSAndroid Build Coastguard Worker# ------------------------ 748*cda5da8dSAndroid Build Coastguard Worker# Define YYLLOC_DEFAULT. 749*cda5da8dSAndroid Build Coastguard Workerm4_define([b4_yylloc_default_define], 750*cda5da8dSAndroid Build Coastguard Worker[[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. 751*cda5da8dSAndroid Build Coastguard Worker If N is 0, then set CURRENT to the empty location which ends 752*cda5da8dSAndroid Build Coastguard Worker the previous symbol: RHS[0] (always defined). */ 753*cda5da8dSAndroid Build Coastguard Worker 754*cda5da8dSAndroid Build Coastguard Worker# ifndef YYLLOC_DEFAULT 755*cda5da8dSAndroid Build Coastguard Worker# define YYLLOC_DEFAULT(Current, Rhs, N) \ 756*cda5da8dSAndroid Build Coastguard Worker do \ 757*cda5da8dSAndroid Build Coastguard Worker if (N) \ 758*cda5da8dSAndroid Build Coastguard Worker { \ 759*cda5da8dSAndroid Build Coastguard Worker (Current).begin = YYRHSLOC (Rhs, 1).begin; \ 760*cda5da8dSAndroid Build Coastguard Worker (Current).end = YYRHSLOC (Rhs, N).end; \ 761*cda5da8dSAndroid Build Coastguard Worker } \ 762*cda5da8dSAndroid Build Coastguard Worker else \ 763*cda5da8dSAndroid Build Coastguard Worker { \ 764*cda5da8dSAndroid Build Coastguard Worker (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \ 765*cda5da8dSAndroid Build Coastguard Worker } \ 766*cda5da8dSAndroid Build Coastguard Worker while (false) 767*cda5da8dSAndroid Build Coastguard Worker# endif 768*cda5da8dSAndroid Build Coastguard Worker]]) 769*cda5da8dSAndroid Build Coastguard Worker 770*cda5da8dSAndroid Build Coastguard Worker## -------- ## 771*cda5da8dSAndroid Build Coastguard Worker## Checks. ## 772*cda5da8dSAndroid Build Coastguard Worker## -------- ## 773*cda5da8dSAndroid Build Coastguard Worker 774*cda5da8dSAndroid Build Coastguard Workerb4_token_ctor_if([b4_variant_if([], 775*cda5da8dSAndroid Build Coastguard Worker [b4_fatal_at(b4_percent_define_get_loc(api.token.constructor), 776*cda5da8dSAndroid Build Coastguard Worker [cannot use '%s' without '%s'], 777*cda5da8dSAndroid Build Coastguard Worker [%define api.token.constructor], 778*cda5da8dSAndroid Build Coastguard Worker [%define api.value.type variant]))])]) 779