c.m4 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095
  1. -*- Autoconf -*-
  2. # C M4 Macros for Bison.
  3. # Copyright (C) 2002, 2004-2015, 2018-2021 Free Software Foundation,
  4. # Inc.
  5. # This program is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation, either version 3 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. m4_include(b4_skeletonsdir/[c-like.m4])
  18. # b4_tocpp(STRING)
  19. # ----------------
  20. # Convert STRING into a valid C macro name.
  21. m4_define([b4_tocpp],
  22. [m4_toupper(m4_bpatsubst(m4_quote($1), [[^a-zA-Z0-9]+], [_]))])
  23. # b4_cpp_guard(FILE)
  24. # ------------------
  25. # A valid C macro name to use as a CPP header guard for FILE.
  26. m4_define([b4_cpp_guard],
  27. [[YY_]b4_tocpp(m4_defn([b4_prefix])/[$1])[_INCLUDED]])
  28. # b4_cpp_guard_open(FILE)
  29. # b4_cpp_guard_close(FILE)
  30. # ------------------------
  31. # If FILE does not expand to nothing, open/close CPP inclusion guards for FILE.
  32. m4_define([b4_cpp_guard_open],
  33. [m4_ifval(m4_quote($1),
  34. [#ifndef b4_cpp_guard([$1])
  35. # define b4_cpp_guard([$1])])])
  36. m4_define([b4_cpp_guard_close],
  37. [m4_ifval(m4_quote($1),
  38. [#endif b4_comment([!b4_cpp_guard([$1])])])])
  39. ## ---------------- ##
  40. ## Identification. ##
  41. ## ---------------- ##
  42. # b4_identification
  43. # -----------------
  44. # Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or
  45. # b4_pull_flag if they use the values of the %define variables api.pure or
  46. # api.push-pull.
  47. m4_define([b4_identification],
  48. [[/* Identify Bison output, and Bison version. */
  49. #define YYBISON ]b4_version[
  50. /* Bison version string. */
  51. #define YYBISON_VERSION "]b4_version_string["
  52. /* Skeleton name. */
  53. #define YYSKELETON_NAME ]b4_skeleton[]m4_ifdef([b4_pure_flag], [[
  54. /* Pure parsers. */
  55. #define YYPURE ]b4_pure_flag])[]m4_ifdef([b4_push_flag], [[
  56. /* Push parsers. */
  57. #define YYPUSH ]b4_push_flag])[]m4_ifdef([b4_pull_flag], [[
  58. /* Pull parsers. */
  59. #define YYPULL ]b4_pull_flag])[
  60. ]])
  61. ## ---------------- ##
  62. ## Default values. ##
  63. ## ---------------- ##
  64. # b4_api_prefix, b4_api_PREFIX
  65. # ----------------------------
  66. # Corresponds to %define api.prefix
  67. b4_percent_define_default([[api.prefix]], [[yy]])
  68. m4_define([b4_api_prefix],
  69. [b4_percent_define_get([[api.prefix]])])
  70. m4_define([b4_api_PREFIX],
  71. [m4_toupper(b4_api_prefix)])
  72. # b4_prefix
  73. # ---------
  74. # If the %name-prefix is not given, it is api.prefix.
  75. m4_define_default([b4_prefix], [b4_api_prefix])
  76. # If the %union is not named, its name is YYSTYPE.
  77. b4_percent_define_default([[api.value.union.name]],
  78. [b4_api_PREFIX[][STYPE]])
  79. b4_percent_define_default([[api.symbol.prefix]], [[YYSYMBOL_]])
  80. ## ------------------------ ##
  81. ## Pure/impure interfaces. ##
  82. ## ------------------------ ##
  83. # b4_lex_formals
  84. # --------------
  85. # All the yylex formal arguments.
  86. # b4_lex_param arrives quoted twice, but we want to keep only one level.
  87. m4_define([b4_lex_formals],
  88. [b4_pure_if([[[[YYSTYPE *yylvalp]], [[&yylval]]][]dnl
  89. b4_locations_if([, [[YYLTYPE *yyllocp], [&yylloc]]])])dnl
  90. m4_ifdef([b4_lex_param], [, ]b4_lex_param)])
  91. # b4_lex
  92. # ------
  93. # Call yylex.
  94. m4_define([b4_lex],
  95. [b4_function_call([yylex], [int], b4_lex_formals)])
  96. # b4_user_args
  97. # ------------
  98. m4_define([b4_user_args],
  99. [m4_ifset([b4_parse_param], [, b4_args(b4_parse_param)])])
  100. # b4_user_formals
  101. # ---------------
  102. # The possible parse-params formal arguments preceded by a comma.
  103. m4_define([b4_user_formals],
  104. [m4_ifset([b4_parse_param], [, b4_formals(b4_parse_param)])])
  105. # b4_parse_param
  106. # --------------
  107. # If defined, b4_parse_param arrives double quoted, but below we prefer
  108. # it to be single quoted.
  109. m4_define([b4_parse_param],
  110. b4_parse_param)
  111. # b4_parse_param_for(DECL, FORMAL, BODY)
  112. # ---------------------------------------
  113. # Iterate over the user parameters, binding the declaration to DECL,
  114. # the formal name to FORMAL, and evaluating the BODY.
  115. m4_define([b4_parse_param_for],
  116. [m4_foreach([$1_$2], m4_defn([b4_parse_param]),
  117. [m4_pushdef([$1], m4_unquote(m4_car($1_$2)))dnl
  118. m4_pushdef([$2], m4_shift($1_$2))dnl
  119. $3[]dnl
  120. m4_popdef([$2])dnl
  121. m4_popdef([$1])dnl
  122. ])])
  123. # b4_parse_param_use([VAL], [LOC])
  124. # --------------------------------
  125. # 'YY_USE' VAL, LOC if locations are enabled, and all the parse-params.
  126. m4_define([b4_parse_param_use],
  127. [m4_ifvaln([$1], [ YY_USE ([$1]);])dnl
  128. b4_locations_if([m4_ifvaln([$2], [ YY_USE ([$2]);])])dnl
  129. b4_parse_param_for([Decl], [Formal], [ YY_USE (Formal);
  130. ])dnl
  131. ])
  132. ## ------------ ##
  133. ## Data Types. ##
  134. ## ------------ ##
  135. # b4_int_type(MIN, MAX)
  136. # ---------------------
  137. # Return a narrow int type able to handle integers ranging from MIN
  138. # to MAX (included) in portable C code. Assume MIN and MAX fall in
  139. # 'int' range.
  140. m4_define([b4_int_type],
  141. [m4_if(b4_ints_in($@, [-127], [127]), [1], [signed char],
  142. b4_ints_in($@, [0], [255]), [1], [unsigned char],
  143. b4_ints_in($@, [-32767], [32767]), [1], [short],
  144. b4_ints_in($@, [0], [65535]), [1], [unsigned short],
  145. [int])])
  146. # b4_c99_int_type(MIN, MAX)
  147. # -------------------------
  148. # Like b4_int_type, but for C99.
  149. # b4_c99_int_type_define replaces b4_int_type with this.
  150. m4_define([b4_c99_int_type],
  151. [m4_if(b4_ints_in($@, [-127], [127]), [1], [yytype_int8],
  152. b4_ints_in($@, [0], [255]), [1], [yytype_uint8],
  153. b4_ints_in($@, [-32767], [32767]), [1], [yytype_int16],
  154. b4_ints_in($@, [0], [65535]), [1], [yytype_uint16],
  155. [int])])
  156. # b4_c99_int_type_define
  157. # ----------------------
  158. # Define private types suitable for holding small integers in C99 or later.
  159. m4_define([b4_c99_int_type_define],
  160. [m4_copy_force([b4_c99_int_type], [b4_int_type])dnl
  161. [#ifdef short
  162. # undef short
  163. #endif
  164. /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
  165. <limits.h> and (if available) <stdint.h> are included
  166. so that the code can choose integer types of a good width. */
  167. #ifndef __PTRDIFF_MAX__
  168. # include <limits.h> /* INFRINGES ON USER NAME SPACE */
  169. # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
  170. # include <stdint.h> /* INFRINGES ON USER NAME SPACE */
  171. # define YY_STDINT_H
  172. # endif
  173. #endif
  174. /* Narrow types that promote to a signed type and that can represent a
  175. signed or unsigned integer of at least N bits. In tables they can
  176. save space and decrease cache pressure. Promoting to a signed type
  177. helps avoid bugs in integer arithmetic. */
  178. #ifdef __INT_LEAST8_MAX__
  179. typedef __INT_LEAST8_TYPE__ yytype_int8;
  180. #elif defined YY_STDINT_H
  181. typedef int_least8_t yytype_int8;
  182. #else
  183. typedef signed char yytype_int8;
  184. #endif
  185. #ifdef __INT_LEAST16_MAX__
  186. typedef __INT_LEAST16_TYPE__ yytype_int16;
  187. #elif defined YY_STDINT_H
  188. typedef int_least16_t yytype_int16;
  189. #else
  190. typedef short yytype_int16;
  191. #endif
  192. /* Work around bug in HP-UX 11.23, which defines these macros
  193. incorrectly for preprocessor constants. This workaround can likely
  194. be removed in 2023, as HPE has promised support for HP-UX 11.23
  195. (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
  196. <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
  197. #ifdef __hpux
  198. # undef UINT_LEAST8_MAX
  199. # undef UINT_LEAST16_MAX
  200. # define UINT_LEAST8_MAX 255
  201. # define UINT_LEAST16_MAX 65535
  202. #endif
  203. #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
  204. typedef __UINT_LEAST8_TYPE__ yytype_uint8;
  205. #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
  206. && UINT_LEAST8_MAX <= INT_MAX)
  207. typedef uint_least8_t yytype_uint8;
  208. #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
  209. typedef unsigned char yytype_uint8;
  210. #else
  211. typedef short yytype_uint8;
  212. #endif
  213. #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
  214. typedef __UINT_LEAST16_TYPE__ yytype_uint16;
  215. #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
  216. && UINT_LEAST16_MAX <= INT_MAX)
  217. typedef uint_least16_t yytype_uint16;
  218. #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
  219. typedef unsigned short yytype_uint16;
  220. #else
  221. typedef int yytype_uint16;
  222. #endif]])
  223. # b4_sizes_types_define
  224. # ---------------------
  225. # Define YYPTRDIFF_T/YYPTRDIFF_MAXIMUM, YYSIZE_T/YYSIZE_MAXIMUM,
  226. # and YYSIZEOF.
  227. m4_define([b4_sizes_types_define],
  228. [[#ifndef YYPTRDIFF_T
  229. # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
  230. # define YYPTRDIFF_T __PTRDIFF_TYPE__
  231. # define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
  232. # elif defined PTRDIFF_MAX
  233. # ifndef ptrdiff_t
  234. # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
  235. # endif
  236. # define YYPTRDIFF_T ptrdiff_t
  237. # define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
  238. # else
  239. # define YYPTRDIFF_T long
  240. # define YYPTRDIFF_MAXIMUM LONG_MAX
  241. # endif
  242. #endif
  243. #ifndef YYSIZE_T
  244. # ifdef __SIZE_TYPE__
  245. # define YYSIZE_T __SIZE_TYPE__
  246. # elif defined size_t
  247. # define YYSIZE_T size_t
  248. # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
  249. # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
  250. # define YYSIZE_T size_t
  251. # else
  252. # define YYSIZE_T unsigned
  253. # endif
  254. #endif
  255. #define YYSIZE_MAXIMUM \
  256. YY_CAST (YYPTRDIFF_T, \
  257. (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
  258. ? YYPTRDIFF_MAXIMUM \
  259. : YY_CAST (YYSIZE_T, -1)))
  260. #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
  261. ]])
  262. # b4_int_type_for(NAME)
  263. # ---------------------
  264. # Return a narrow int type able to handle numbers ranging from
  265. # 'NAME_min' to 'NAME_max' (included).
  266. m4_define([b4_int_type_for],
  267. [b4_int_type($1_min, $1_max)])
  268. # b4_table_value_equals(TABLE, VALUE, LITERAL, SYMBOL)
  269. # ----------------------------------------------------
  270. # Without inducing a comparison warning from the compiler, check if the
  271. # literal value LITERAL equals VALUE from table TABLE, which must have
  272. # TABLE_min and TABLE_max defined. SYMBOL denotes
  273. m4_define([b4_table_value_equals],
  274. [m4_if(m4_eval($3 < m4_indir([b4_]$1[_min])
  275. || m4_indir([b4_]$1[_max]) < $3), [1],
  276. [[0]],
  277. [(($2) == $4)])])
  278. ## ----------------- ##
  279. ## Compiler issues. ##
  280. ## ----------------- ##
  281. # b4_attribute_define([noreturn])
  282. # -------------------------------
  283. # Provide portable compiler "attributes". If "noreturn" is passed, define
  284. # _Noreturn.
  285. m4_define([b4_attribute_define],
  286. [[#ifndef YY_ATTRIBUTE_PURE
  287. # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
  288. # define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
  289. # else
  290. # define YY_ATTRIBUTE_PURE
  291. # endif
  292. #endif
  293. #ifndef YY_ATTRIBUTE_UNUSED
  294. # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
  295. # define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
  296. # else
  297. # define YY_ATTRIBUTE_UNUSED
  298. # endif
  299. #endif
  300. ]m4_bmatch([$1], [\bnoreturn\b], [[/* The _Noreturn keyword of C11. */
  301. ]dnl This is close to lib/_Noreturn.h, except that we do enable
  302. dnl the use of [[noreturn]], because _Noreturn is used in places
  303. dnl where [[noreturn]] works in C++. We need this in particular
  304. dnl because of glr.cc which compiles code from glr.c in C++.
  305. dnl And the C++ compiler chokes on _Noreturn. Also, we do not
  306. dnl use C' _Noreturn in C++, to avoid -Wc11-extensions warnings.
  307. [#ifndef _Noreturn
  308. # if (defined __cplusplus \
  309. && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
  310. || (defined _MSC_VER && 1900 <= _MSC_VER)))
  311. # define _Noreturn [[noreturn]]
  312. # elif ((!defined __cplusplus || defined __clang__) \
  313. && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
  314. || (!defined __STRICT_ANSI__ \
  315. && (__4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
  316. || (defined __apple_build_version__ \
  317. ? 6000000 <= __apple_build_version__ \
  318. : 3 < __clang_major__ + (5 <= __clang_minor__))))))
  319. /* _Noreturn works as-is. */
  320. # elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
  321. || 0x5110 <= __SUNPRO_C)
  322. # define _Noreturn __attribute__ ((__noreturn__))
  323. # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
  324. # define _Noreturn __declspec (noreturn)
  325. # else
  326. # define _Noreturn
  327. # endif
  328. #endif
  329. ]])[/* Suppress unused-variable warnings by "using" E. */
  330. #if ! defined lint || defined __GNUC__
  331. # define YY_USE(E) ((void) (E))
  332. #else
  333. # define YY_USE(E) /* empty */
  334. #endif
  335. #if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
  336. /* Suppress an incorrect diagnostic about yylval being uninitialized. */
  337. # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
  338. _Pragma ("GCC diagnostic push") \
  339. _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
  340. _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
  341. # define YY_IGNORE_MAYBE_UNINITIALIZED_END \
  342. _Pragma ("GCC diagnostic pop")
  343. #else
  344. # define YY_INITIAL_VALUE(Value) Value
  345. #endif
  346. #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
  347. # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
  348. # define YY_IGNORE_MAYBE_UNINITIALIZED_END
  349. #endif
  350. #ifndef YY_INITIAL_VALUE
  351. # define YY_INITIAL_VALUE(Value) /* Nothing. */
  352. #endif
  353. #if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
  354. # define YY_IGNORE_USELESS_CAST_BEGIN \
  355. _Pragma ("GCC diagnostic push") \
  356. _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
  357. # define YY_IGNORE_USELESS_CAST_END \
  358. _Pragma ("GCC diagnostic pop")
  359. #endif
  360. #ifndef YY_IGNORE_USELESS_CAST_BEGIN
  361. # define YY_IGNORE_USELESS_CAST_BEGIN
  362. # define YY_IGNORE_USELESS_CAST_END
  363. #endif
  364. ]])
  365. # b4_cast_define
  366. # --------------
  367. m4_define([b4_cast_define],
  368. [# ifndef YY_CAST
  369. # ifdef __cplusplus
  370. # define YY_CAST(Type, Val) static_cast<Type> (Val)
  371. # define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
  372. # else
  373. # define YY_CAST(Type, Val) ((Type) (Val))
  374. # define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
  375. # endif
  376. # endif[]dnl
  377. ])
  378. # b4_null_define
  379. # --------------
  380. # Portability issues: define a YY_NULLPTR appropriate for the current
  381. # language (C, C++98, or C++11).
  382. #
  383. # In C++ pre C++11 it is standard practice to use 0 (not NULL) for the
  384. # null pointer. In C, prefer ((void*)0) to avoid having to include stdlib.h.
  385. m4_define([b4_null_define],
  386. [# ifndef YY_NULLPTR
  387. # if defined __cplusplus
  388. # if 201103L <= __cplusplus
  389. # define YY_NULLPTR nullptr
  390. # else
  391. # define YY_NULLPTR 0
  392. # endif
  393. # else
  394. # define YY_NULLPTR ((void*)0)
  395. # endif
  396. # endif[]dnl
  397. ])
  398. # b4_null
  399. # -------
  400. # Return a null pointer constant.
  401. m4_define([b4_null], [YY_NULLPTR])
  402. ## ---------##
  403. ## Values. ##
  404. ## ---------##
  405. # b4_integral_parser_table_define(TABLE-NAME, CONTENT, COMMENT)
  406. # -------------------------------------------------------------
  407. # Define "yy<TABLE-NAME>" whose contents is CONTENT.
  408. m4_define([b4_integral_parser_table_define],
  409. [m4_ifvaln([$3], [b4_comment([$3], [ ])])dnl
  410. static const b4_int_type_for([$2]) yy$1[[]] =
  411. {
  412. $2
  413. };dnl
  414. ])
  415. ## ------------- ##
  416. ## Token kinds. ##
  417. ## ------------- ##
  418. # Because C enums are not scoped, because tokens are exposed in the
  419. # header, and because these tokens are common to all the parsers, we
  420. # need to make sure their names don't collide: use the api.prefix.
  421. # YYEOF is special, since the user may give it a different name.
  422. m4_define([b4_symbol(-2, id)], [b4_api_PREFIX[][EMPTY]])
  423. m4_define([b4_symbol(-2, tag)], [[No symbol.]])
  424. m4_if(b4_symbol(0, id), [YYEOF],
  425. [m4_define([b4_symbol(0, id)], [b4_api_PREFIX[][EOF]])])
  426. m4_define([b4_symbol(1, id)], [b4_api_PREFIX[][error]])
  427. m4_define([b4_symbol(2, id)], [b4_api_PREFIX[][UNDEF]])
  428. # b4_token_define(TOKEN-NUM)
  429. # --------------------------
  430. # Output the definition of this token as #define.
  431. m4_define([b4_token_define],
  432. [b4_token_format([#define %s %s], [$1])])
  433. # b4_token_defines
  434. # ----------------
  435. # Output the definition of the tokens.
  436. m4_define([b4_token_defines],
  437. [[/* Token kinds. */
  438. #define ]b4_symbol([-2], [id])[ -2
  439. ]m4_join([
  440. ], b4_symbol_map([b4_token_define]))
  441. ])
  442. # b4_token_enum(TOKEN-NUM)
  443. # ------------------------
  444. # Output the definition of this token as an enum.
  445. m4_define([b4_token_enum],
  446. [b4_token_visible_if([$1],
  447. [m4_format([ %-30s %s],
  448. m4_format([[%s = %s%s%s]],
  449. b4_symbol([$1], [id]),
  450. b4_symbol([$1], b4_api_token_raw_if([[number]], [[code]])),
  451. m4_if([$1], b4_last_enum_token, [], [[,]])),
  452. [b4_symbol_tag_comment([$1])])])])
  453. # b4_token_enums
  454. # --------------
  455. # The definition of the token kinds.
  456. m4_define([b4_token_enums],
  457. [b4_any_token_visible_if([[/* Token kinds. */
  458. #ifndef ]b4_api_PREFIX[TOKENTYPE
  459. # define ]b4_api_PREFIX[TOKENTYPE
  460. enum ]b4_api_prefix[tokentype
  461. {
  462. ]b4_symbol([-2], [id])[ = -2,
  463. ]b4_symbol_foreach([b4_token_enum])dnl
  464. [ };
  465. typedef enum ]b4_api_prefix[tokentype ]b4_api_prefix[token_kind_t;
  466. #endif
  467. ]])])
  468. # b4_token_enums_defines
  469. # ----------------------
  470. # The definition of the tokens (if there are any) as enums and,
  471. # if POSIX Yacc is enabled, as #defines.
  472. m4_define([b4_token_enums_defines],
  473. [b4_token_enums[]b4_yacc_if([b4_token_defines])])
  474. # b4_symbol_translate(STRING)
  475. # ---------------------------
  476. # Used by "bison" in the array of symbol names to mark those that
  477. # require translation.
  478. m4_define([b4_symbol_translate],
  479. [[N_($1)]])
  480. ## -------------- ##
  481. ## Symbol kinds. ##
  482. ## -------------- ##
  483. # b4_symbol_enum(SYMBOL-NUM)
  484. # --------------------------
  485. # Output the definition of this symbol as an enum.
  486. m4_define([b4_symbol_enum],
  487. [m4_format([ %-40s %s],
  488. m4_format([[%s = %s%s%s]],
  489. b4_symbol([$1], [kind_base]),
  490. [$1],
  491. m4_if([$1], b4_last_symbol, [], [[,]])),
  492. [b4_symbol_tag_comment([$1])])])
  493. # b4_declare_symbol_enum
  494. # ----------------------
  495. # The definition of the symbol internal numbers as an enum.
  496. # Defining YYEMPTY here is important: it forces the compiler
  497. # to use a signed type, which matters for yytoken.
  498. m4_define([b4_declare_symbol_enum],
  499. [[/* Symbol kind. */
  500. enum yysymbol_kind_t
  501. {
  502. ]b4_symbol([-2], kind_base)[ = -2,
  503. ]b4_symbol_foreach([b4_symbol_enum])dnl
  504. [};
  505. typedef enum yysymbol_kind_t yysymbol_kind_t;
  506. ]])])
  507. ## ----------------- ##
  508. ## Semantic Values. ##
  509. ## ----------------- ##
  510. # b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG])
  511. # ----------------------------------------------
  512. # See README.
  513. m4_define([b4_symbol_value],
  514. [m4_ifval([$3],
  515. [($1.$3)],
  516. [m4_ifval([$2],
  517. [b4_symbol_if([$2], [has_type],
  518. [($1.b4_symbol([$2], [type]))],
  519. [$1])],
  520. [$1])])])
  521. ## ---------------------- ##
  522. ## Defining C functions. ##
  523. ## ---------------------- ##
  524. # b4_formals([DECL1, NAME1], ...)
  525. # -------------------------------
  526. # The formal arguments of a C function definition.
  527. m4_define([b4_formals],
  528. [m4_if([$#], [0], [void],
  529. [$#$1], [1], [void],
  530. [m4_map_sep([b4_formal], [, ], [$@])])])
  531. m4_define([b4_formal],
  532. [$1])
  533. ## --------------------- ##
  534. ## Calling C functions. ##
  535. ## --------------------- ##
  536. # b4_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
  537. # -----------------------------------------------------------
  538. # Call the function NAME with arguments NAME1, NAME2 etc.
  539. m4_define([b4_function_call],
  540. [$1 (b4_args(m4_shift2($@)))[]dnl
  541. ])
  542. # b4_args([DECL1, NAME1], ...)
  543. # ----------------------------
  544. # Output the arguments NAME1, NAME2...
  545. m4_define([b4_args],
  546. [m4_map_sep([b4_arg], [, ], [$@])])
  547. m4_define([b4_arg],
  548. [$2])
  549. ## ----------- ##
  550. ## Synclines. ##
  551. ## ----------- ##
  552. # b4_sync_start(LINE, FILE)
  553. # -------------------------
  554. m4_define([b4_sync_start], [[#]line $1 $2])
  555. ## -------------- ##
  556. ## User actions. ##
  557. ## -------------- ##
  558. # b4_case(LABEL, STATEMENTS, [COMMENTS])
  559. # --------------------------------------
  560. m4_define([b4_case],
  561. [ case $1:m4_ifval([$3], [ b4_comment([$3])])
  562. $2
  563. b4_syncline([@oline@], [@ofile@])dnl
  564. break;])
  565. # b4_predicate_case(LABEL, CONDITIONS)
  566. # ------------------------------------
  567. m4_define([b4_predicate_case],
  568. [ case $1:
  569. if (! (
  570. $2)) YYERROR;
  571. b4_syncline([@oline@], [@ofile@])dnl
  572. break;])
  573. # b4_yydestruct_define
  574. # --------------------
  575. # Define the "yydestruct" function.
  576. m4_define_default([b4_yydestruct_define],
  577. [[/*-----------------------------------------------.
  578. | Release the memory associated to this symbol. |
  579. `-----------------------------------------------*/
  580. static void
  581. yydestruct (const char *yymsg,
  582. yysymbol_kind_t yykind, YYSTYPE *yyvaluep]b4_locations_if(dnl
  583. [[, YYLTYPE *yylocationp]])[]b4_user_formals[)
  584. {
  585. ]b4_parse_param_use([yyvaluep], [yylocationp])dnl
  586. [ if (!yymsg)
  587. yymsg = "Deleting";
  588. YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
  589. YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
  590. ]b4_symbol_actions([destructor])[
  591. YY_IGNORE_MAYBE_UNINITIALIZED_END
  592. }]dnl
  593. ])
  594. # b4_yy_symbol_print_define
  595. # -------------------------
  596. # Define the "yy_symbol_print" function.
  597. m4_define_default([b4_yy_symbol_print_define],
  598. [[
  599. /*-----------------------------------.
  600. | Print this symbol's value on YYO. |
  601. `-----------------------------------*/
  602. static void
  603. yy_symbol_value_print (FILE *yyo,
  604. yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep]b4_locations_if(dnl
  605. [[, YYLTYPE const * const yylocationp]])[]b4_user_formals[)
  606. {
  607. FILE *yyoutput = yyo;
  608. ]b4_parse_param_use([yyoutput], [yylocationp])dnl
  609. [ if (!yyvaluep)
  610. return;]
  611. dnl glr.c does not feature yytoknum.
  612. m4_if(b4_skeleton, ["yacc.c"],
  613. [[# ifdef YYPRINT
  614. if (yykind < YYNTOKENS)
  615. YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
  616. # endif
  617. ]])dnl
  618. b4_percent_code_get([[pre-printer]])dnl
  619. YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
  620. b4_symbol_actions([printer])
  621. YY_IGNORE_MAYBE_UNINITIALIZED_END
  622. b4_percent_code_get([[post-printer]])dnl
  623. [}
  624. /*---------------------------.
  625. | Print this symbol on YYO. |
  626. `---------------------------*/
  627. static void
  628. yy_symbol_print (FILE *yyo,
  629. yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep]b4_locations_if(dnl
  630. [[, YYLTYPE const * const yylocationp]])[]b4_user_formals[)
  631. {
  632. YYFPRINTF (yyo, "%s %s (",
  633. yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
  634. ]b4_locations_if([ YY_LOCATION_PRINT (yyo, *yylocationp);
  635. YYFPRINTF (yyo, ": ");
  636. ])dnl
  637. [ yy_symbol_value_print (yyo, yykind, yyvaluep]dnl
  638. b4_locations_if([, yylocationp])[]b4_user_args[);
  639. YYFPRINTF (yyo, ")");
  640. }]dnl
  641. ])
  642. ## ---------------- ##
  643. ## api.value.type. ##
  644. ## ---------------- ##
  645. # ---------------------- #
  646. # api.value.type=union. #
  647. # ---------------------- #
  648. # b4_symbol_type_register(SYMBOL-NUM)
  649. # -----------------------------------
  650. # Symbol SYMBOL-NUM has a type (for variant) instead of a type-tag.
  651. # Extend the definition of %union's body (b4_union_members) with a
  652. # field of that type, and extend the symbol's "type" field to point to
  653. # the field name, instead of the type name.
  654. m4_define([b4_symbol_type_register],
  655. [m4_define([b4_symbol($1, type_tag)],
  656. [b4_symbol_if([$1], [has_id],
  657. [b4_symbol([$1], [id])],
  658. [yykind_[]b4_symbol([$1], [number])])])dnl
  659. m4_append([b4_union_members],
  660. m4_expand([m4_format([ %-40s %s],
  661. m4_expand([b4_symbol([$1], [type]) b4_symbol([$1], [type_tag]);]),
  662. [b4_symbol_tag_comment([$1])])]))
  663. ])
  664. # b4_type_define_tag(SYMBOL1-NUM, ...)
  665. # ------------------------------------
  666. # For the batch of symbols SYMBOL1-NUM... (which all have the same
  667. # type), enhance the %union definition for each of them, and set
  668. # there "type" field to the field tag name, instead of the type name.
  669. m4_define([b4_type_define_tag],
  670. [b4_symbol_if([$1], [has_type],
  671. [m4_map([b4_symbol_type_register], [$@])])
  672. ])
  673. # b4_symbol_value_union(VAL, SYMBOL-NUM, [TYPE])
  674. # ----------------------------------------------
  675. # Same of b4_symbol_value, but when api.value.type=union.
  676. m4_define([b4_symbol_value_union],
  677. [m4_ifval([$3],
  678. [(*($3*)(&$1))],
  679. [m4_ifval([$2],
  680. [b4_symbol_if([$2], [has_type],
  681. [($1.b4_symbol([$2], [type_tag]))],
  682. [$1])],
  683. [$1])])])
  684. # b4_value_type_setup_union
  685. # -------------------------
  686. # Setup support for api.value.type=union. Symbols are defined with a
  687. # type instead of a union member name: build the corresponding union,
  688. # and give the symbols their tag.
  689. m4_define([b4_value_type_setup_union],
  690. [m4_define([b4_union_members])
  691. b4_type_foreach([b4_type_define_tag])
  692. m4_copy_force([b4_symbol_value_union], [b4_symbol_value])
  693. ])
  694. # -------------------------- #
  695. # api.value.type = variant. #
  696. # -------------------------- #
  697. # b4_value_type_setup_variant
  698. # ---------------------------
  699. # Setup support for api.value.type=variant. By default, fail, specialized
  700. # by other skeletons.
  701. m4_define([b4_value_type_setup_variant],
  702. [b4_complain_at(b4_percent_define_get_loc([[api.value.type]]),
  703. [['%s' does not support '%s']],
  704. [b4_skeleton],
  705. [%define api.value.type variant])])
  706. # _b4_value_type_setup_keyword
  707. # ----------------------------
  708. # api.value.type is defined with a keyword/string syntax. Check if
  709. # that is properly defined, and prepare its use.
  710. m4_define([_b4_value_type_setup_keyword],
  711. [b4_percent_define_check_values([[[[api.value.type]],
  712. [[none]],
  713. [[union]],
  714. [[union-directive]],
  715. [[variant]],
  716. [[yystype]]]])dnl
  717. m4_case(b4_percent_define_get([[api.value.type]]),
  718. [union], [b4_value_type_setup_union],
  719. [variant], [b4_value_type_setup_variant])])
  720. # b4_value_type_setup
  721. # -------------------
  722. # Check if api.value.type is properly defined, and possibly prepare
  723. # its use.
  724. b4_define_silent([b4_value_type_setup],
  725. [# Define default value.
  726. b4_percent_define_ifdef([[api.value.type]], [],
  727. [# %union => api.value.type=union-directive
  728. m4_ifdef([b4_union_members],
  729. [m4_define([b4_percent_define_kind(api.value.type)], [keyword])
  730. m4_define([b4_percent_define(api.value.type)], [union-directive])],
  731. [# no tag seen => api.value.type={int}
  732. m4_if(b4_tag_seen_flag, 0,
  733. [m4_define([b4_percent_define_kind(api.value.type)], [code])
  734. m4_define([b4_percent_define(api.value.type)], [int])],
  735. [# otherwise api.value.type=yystype
  736. m4_define([b4_percent_define_kind(api.value.type)], [keyword])
  737. m4_define([b4_percent_define(api.value.type)], [yystype])])])])
  738. # Set up.
  739. m4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
  740. [keyword\|string], [_b4_value_type_setup_keyword])
  741. ])
  742. ## -------------- ##
  743. ## Declarations. ##
  744. ## -------------- ##
  745. # b4_value_type_define
  746. # --------------------
  747. m4_define([b4_value_type_define],
  748. [b4_value_type_setup[]dnl
  749. /* Value type. */
  750. m4_bmatch(b4_percent_define_get_kind([[api.value.type]]),
  751. [code],
  752. [[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
  753. typedef ]b4_percent_define_get([[api.value.type]])[ ]b4_api_PREFIX[STYPE;
  754. # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1
  755. # define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
  756. #endif
  757. ]],
  758. [m4_bmatch(b4_percent_define_get([[api.value.type]]),
  759. [union\|union-directive],
  760. [[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
  761. ]b4_percent_define_get_syncline([[api.value.union.name]])dnl
  762. [union ]b4_percent_define_get([[api.value.union.name]])[
  763. {
  764. ]b4_user_union_members[
  765. };
  766. ]b4_percent_define_get_syncline([[api.value.union.name]])dnl
  767. [typedef union ]b4_percent_define_get([[api.value.union.name]])[ ]b4_api_PREFIX[STYPE;
  768. # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1
  769. # define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
  770. #endif
  771. ]])])])
  772. # b4_location_type_define
  773. # -----------------------
  774. m4_define([b4_location_type_define],
  775. [[/* Location type. */
  776. ]b4_percent_define_ifdef([[api.location.type]],
  777. [[typedef ]b4_percent_define_get([[api.location.type]])[ ]b4_api_PREFIX[LTYPE;
  778. ]],
  779. [[#if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED
  780. typedef struct ]b4_api_PREFIX[LTYPE ]b4_api_PREFIX[LTYPE;
  781. struct ]b4_api_PREFIX[LTYPE
  782. {
  783. int first_line;
  784. int first_column;
  785. int last_line;
  786. int last_column;
  787. };
  788. # define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1
  789. # define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1
  790. #endif
  791. ]])])
  792. # b4_declare_yylstype
  793. # -------------------
  794. # Declarations that might either go into the header (if --defines) or
  795. # in the parser body. Declare YYSTYPE/YYLTYPE, and yylval/yylloc.
  796. m4_define([b4_declare_yylstype],
  797. [b4_value_type_define[]b4_locations_if([
  798. b4_location_type_define])
  799. b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval;
  800. ]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl
  801. ])
  802. # b4_YYDEBUG_define
  803. # -----------------
  804. m4_define([b4_YYDEBUG_define],
  805. [[/* Debug traces. */
  806. ]m4_if(b4_api_prefix, [yy],
  807. [[#ifndef YYDEBUG
  808. # define YYDEBUG ]b4_parse_trace_if([1], [0])[
  809. #endif]],
  810. [[#ifndef ]b4_api_PREFIX[DEBUG
  811. # if defined YYDEBUG
  812. #if YYDEBUG
  813. # define ]b4_api_PREFIX[DEBUG 1
  814. # else
  815. # define ]b4_api_PREFIX[DEBUG 0
  816. # endif
  817. # else /* ! defined YYDEBUG */
  818. # define ]b4_api_PREFIX[DEBUG ]b4_parse_trace_if([1], [0])[
  819. # endif /* ! defined YYDEBUG */
  820. #endif /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl
  821. ])
  822. # b4_declare_yydebug
  823. # ------------------
  824. m4_define([b4_declare_yydebug],
  825. [b4_YYDEBUG_define[
  826. #if ]b4_api_PREFIX[DEBUG
  827. extern int ]b4_prefix[debug;
  828. #endif][]dnl
  829. ])
  830. # b4_yylloc_default_define
  831. # ------------------------
  832. # Define YYLLOC_DEFAULT.
  833. m4_define([b4_yylloc_default_define],
  834. [[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
  835. If N is 0, then set CURRENT to the empty location which ends
  836. the previous symbol: RHS[0] (always defined). */
  837. #ifndef YYLLOC_DEFAULT
  838. # define YYLLOC_DEFAULT(Current, Rhs, N) \
  839. do \
  840. if (N) \
  841. { \
  842. (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
  843. (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
  844. (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
  845. (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
  846. } \
  847. else \
  848. { \
  849. (Current).first_line = (Current).last_line = \
  850. YYRHSLOC (Rhs, 0).last_line; \
  851. (Current).first_column = (Current).last_column = \
  852. YYRHSLOC (Rhs, 0).last_column; \
  853. } \
  854. while (0)
  855. #endif
  856. ]])
  857. # b4_yy_location_print_define
  858. # ---------------------------
  859. # Define YY_LOCATION_PRINT.
  860. m4_define([b4_yy_location_print_define],
  861. [b4_locations_if([[
  862. /* YY_LOCATION_PRINT -- Print the location on the stream.
  863. This macro was not mandated originally: define only if we know
  864. we won't break user code: when these are the locations we know. */
  865. # ifndef YY_LOCATION_PRINT
  866. # if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
  867. /* Print *YYLOCP on YYO. Private, do not rely on its existence. */
  868. YY_ATTRIBUTE_UNUSED
  869. static int
  870. yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp)
  871. {
  872. int res = 0;
  873. int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
  874. if (0 <= yylocp->first_line)
  875. {
  876. res += YYFPRINTF (yyo, "%d", yylocp->first_line);
  877. if (0 <= yylocp->first_column)
  878. res += YYFPRINTF (yyo, ".%d", yylocp->first_column);
  879. }
  880. if (0 <= yylocp->last_line)
  881. {
  882. if (yylocp->first_line < yylocp->last_line)
  883. {
  884. res += YYFPRINTF (yyo, "-%d", yylocp->last_line);
  885. if (0 <= end_col)
  886. res += YYFPRINTF (yyo, ".%d", end_col);
  887. }
  888. else if (0 <= end_col && yylocp->first_column < end_col)
  889. res += YYFPRINTF (yyo, "-%d", end_col);
  890. }
  891. return res;
  892. }
  893. # define YY_LOCATION_PRINT(File, Loc) \
  894. yy_location_print_ (File, &(Loc))
  895. # else
  896. # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
  897. # endif
  898. # endif /* !defined YY_LOCATION_PRINT */]],
  899. [[/* This macro is provided for backward compatibility. */
  900. # ifndef YY_LOCATION_PRINT
  901. # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
  902. # endif]])
  903. ])
  904. # b4_yyloc_default
  905. # ----------------
  906. # Expand to a possible default value for yylloc.
  907. m4_define([b4_yyloc_default],
  908. [[
  909. # if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL
  910. = { ]m4_join([, ],
  911. m4_defn([b4_location_initial_line]),
  912. m4_defn([b4_location_initial_column]),
  913. m4_defn([b4_location_initial_line]),
  914. m4_defn([b4_location_initial_column]))[ }
  915. # endif
  916. ]])