]> git.saurik.com Git - bison.git/blame_incremental - data/c.m4
tests: AT_YYERROR_DEFINE: prepare for list of ints.
[bison.git] / data / c.m4
... / ...
CommitLineData
1 -*- Autoconf -*-
2
3# C M4 Macros for Bison.
4
5# Copyright (C) 2002, 2004-2012 Free Software Foundation, Inc.
6
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19
20
21# b4_tocpp(STRING)
22# ----------------
23# Convert STRING into a valid C macro name.
24m4_define([b4_tocpp],
25[m4_toupper(m4_bpatsubst(m4_quote($1), [[^a-zA-Z0-9]+], [_]))])
26
27
28# b4_cpp_guard(FILE)
29# ------------------
30# A valid C macro name to use as a CPP header guard for FILE.
31m4_define([b4_cpp_guard],
32[b4_tocpp(m4_defn([b4_prefix])/[$1])])
33
34
35# b4_cpp_guard_open(FILE)
36# b4_cpp_guard_close(FILE)
37# ------------------------
38# Open/close CPP inclusion guards for FILE.
39m4_define([b4_cpp_guard_open],
40[#ifndef b4_cpp_guard([$1])
41# define b4_cpp_guard([$1])])
42
43m4_define([b4_cpp_guard_close],
44[#endif b4_comment([!b4_cpp_guard([$1])])])
45
46
47## ---------------- ##
48## Identification. ##
49## ---------------- ##
50
51# b4_comment(TEXT)
52# ----------------
53m4_define([b4_comment], [/* m4_bpatsubst([$1], [
54], [
55 ]) */])
56
57# b4_identification
58# -----------------
59# Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or
60# b4_pull_flag if they use the values of the %define variables api.pure or
61# api.push-pull.
62m4_define([b4_identification],
63[[/* Identify Bison output. */
64#define YYBISON 1
65
66/* Bison version. */
67#define YYBISON_VERSION "]b4_version["
68
69/* Skeleton name. */
70#define YYSKELETON_NAME ]b4_skeleton[]m4_ifdef([b4_pure_flag], [[
71
72/* Pure parsers. */
73#define YYPURE ]b4_pure_flag])[]m4_ifdef([b4_push_flag], [[
74
75/* Push parsers. */
76#define YYPUSH ]b4_push_flag])[]m4_ifdef([b4_pull_flag], [[
77
78/* Pull parsers. */
79#define YYPULL ]b4_pull_flag])[
80]])
81
82
83## ---------------- ##
84## Default values. ##
85## ---------------- ##
86
87# If the %union is not named, its name is YYSTYPE.
88m4_define_default([b4_union_name], [YYSTYPE])
89
90# If the %name-prefix is not given, it is yy.
91m4_define_default([b4_prefix], [yy])
92
93## ------------------------ ##
94## Pure/impure interfaces. ##
95## ------------------------ ##
96
97# b4_user_args
98# ------------
99m4_define([b4_user_args],
100[m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])])
101
102
103# b4_parse_param
104# --------------
105# If defined, b4_parse_param arrives double quoted, but below we prefer
106# it to be single quoted.
107m4_define([b4_parse_param],
108b4_parse_param)
109
110
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.
115m4_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
118m4_pushdef([$2], m4_shift($1_$2))dnl
119$3[]dnl
120m4_popdef([$2])dnl
121m4_popdef([$1])dnl
122])])
123
124# b4_parse_param_use
125# ------------------
126# `YYUSE' all the parse-params.
127m4_define([b4_parse_param_use],
128[b4_parse_param_for([Decl], [Formal], [ YYUSE (Formal);
129])dnl
130])
131
132
133## ------------ ##
134## Data Types. ##
135## ------------ ##
136
137# b4_int_type(MIN, MAX)
138# ---------------------
139# Return the smallest int type able to handle numbers ranging from
140# MIN to MAX (included).
141m4_define([b4_int_type],
142[m4_if(b4_ints_in($@, [0], [255]), [1], [unsigned char],
143 b4_ints_in($@, [-128], [127]), [1], [signed char],
144
145 b4_ints_in($@, [0], [65535]), [1], [unsigned short int],
146 b4_ints_in($@, [-32768], [32767]), [1], [short int],
147
148 m4_eval([0 <= $1]), [1], [unsigned int],
149
150 [int])])
151
152
153# b4_int_type_for(NAME)
154# ---------------------
155# Return the smallest int type able to handle numbers ranging from
156# `NAME_min' to `NAME_max' (included).
157m4_define([b4_int_type_for],
158[b4_int_type($1_min, $1_max)])
159
160
161# b4_table_value_equals(TABLE, VALUE, LITERAL)
162# --------------------------------------------
163# Without inducing a comparison warning from the compiler, check if the
164# literal value LITERAL equals VALUE from table TABLE, which must have
165# TABLE_min and TABLE_max defined. YYID must be defined as an identity
166# function that suppresses warnings about constant conditions.
167m4_define([b4_table_value_equals],
168[m4_if(m4_eval($3 < m4_indir([b4_]$1[_min])
169 || m4_indir([b4_]$1[_max]) < $3), [1],
170 [[YYID (0)]],
171 [[((]$2[) == (]$3[))]])])
172
173
174## ---------##
175## Values. ##
176## ---------##
177
178
179# b4_null_define
180# --------------
181# Portability issues: define a YY_NULL appropriate for the current
182# language (C, C++98, or C++11).
183m4_define([b4_null_define],
184[# ifndef YY_NULL
185# if defined __cplusplus && 201103L <= __cplusplus
186# define YY_NULL nullptr
187# else
188# define YY_NULL 0
189# endif
190# endif[]dnl
191])
192
193
194# b4_null
195# -------
196# Return a null pointer constant.
197m4_define([b4_null], [YY_NULL])
198
199
200
201## ------------------------- ##
202## Assigning token numbers. ##
203## ------------------------- ##
204
205# b4_token_define(TOKEN-NAME, TOKEN-NUMBER)
206# -----------------------------------------
207# Output the definition of this token as #define.
208m4_define([b4_token_define],
209[#define $1 $2
210])
211
212
213# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
214# -------------------------------------------------------
215# Output the definition of the tokens (if there are) as #defines.
216m4_define([b4_token_defines],
217[m4_if([$#$1], [1], [],
218[/* Tokens. */
219m4_map([b4_token_define], [$@])])
220])
221
222
223# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
224# ---------------------------------------
225# Output the definition of this token as an enum.
226m4_define([b4_token_enum],
227[$1 = $2])
228
229
230# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
231# -----------------------------------------------------
232# Output the definition of the tokens (if there are) as enums.
233m4_define([b4_token_enums],
234[m4_if([$#$1], [1], [],
235[/* Tokens. */
236#ifndef YYTOKENTYPE
237# define YYTOKENTYPE
238 /* Put the tokens into the symbol table, so that GDB and other debuggers
239 know about them. */
240 enum yytokentype {
241m4_map_sep([ b4_token_enum], [,
242],
243 [$@])
244 };
245#endif
246])])
247
248
249# b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
250# -------------------------------------------------------------
251# Output the definition of the tokens (if there are any) as enums and, if POSIX
252# Yacc is enabled, as #defines.
253m4_define([b4_token_enums_defines],
254[b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], [])
255])
256
257
258
259## --------------------------------------------- ##
260## Defining C functions in both K&R and ANSI-C. ##
261## --------------------------------------------- ##
262
263
264# b4_modern_c
265# -----------
266# A predicate useful in #if to determine whether C is ancient or modern.
267#
268# If __STDC__ is defined, the compiler is modern. IBM xlc 7.0 when run
269# as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic
270# reasons, but it defines __C99__FUNC__ so check that as well.
271# Microsoft C normally doesn't define these macros, but it defines _MSC_VER.
272# Consider a C++ compiler to be modern if it defines __cplusplus.
273#
274m4_define([b4_c_modern],
275 [[(defined __STDC__ || defined __C99__FUNC__ \
276 || defined __cplusplus || defined _MSC_VER)]])
277
278# b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
279# ----------------------------------------------------------
280# Declare the function NAME.
281m4_define([b4_c_function_def],
282[#if b4_c_modern
283b4_c_ansi_function_def($@)
284#else
285$2
286$1 (b4_c_knr_formal_names(m4_shift2($@)))
287b4_c_knr_formal_decls(m4_shift2($@))
288#endif[]dnl
289])
290
291
292# b4_c_ansi_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
293# ---------------------------------------------------------------
294# Declare the function NAME in ANSI.
295m4_define([b4_c_ansi_function_def],
296[$2
297$1 (b4_c_ansi_formals(m4_shift2($@)))[]dnl
298])
299
300
301# b4_c_ansi_formals([DECL1, NAME1], ...)
302# --------------------------------------
303# Output the arguments ANSI-C definition.
304m4_define([b4_c_ansi_formals],
305[m4_if([$#], [0], [void],
306 [$#$1], [1], [void],
307 [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])])
308
309m4_define([b4_c_ansi_formal],
310[$1])
311
312
313# b4_c_knr_formal_names([DECL1, NAME1], ...)
314# ------------------------------------------
315# Output the argument names.
316m4_define([b4_c_knr_formal_names],
317[m4_map_sep([b4_c_knr_formal_name], [, ], [$@])])
318
319m4_define([b4_c_knr_formal_name],
320[$2])
321
322
323# b4_c_knr_formal_decls([DECL1, NAME1], ...)
324# ------------------------------------------
325# Output the K&R argument declarations.
326m4_define([b4_c_knr_formal_decls],
327[m4_map_sep([b4_c_knr_formal_decl],
328 [
329],
330 [$@])])
331
332m4_define([b4_c_knr_formal_decl],
333[ $1;])
334
335
336
337## ------------------------------------------------------------ ##
338## Declaring (prototyping) C functions in both K&R and ANSI-C. ##
339## ------------------------------------------------------------ ##
340
341
342# b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
343# -----------------------------------------------------------
344# Declare the function NAME.
345m4_define([b4_c_function_decl],
346[#if defined __STDC__ || defined __cplusplus
347b4_c_ansi_function_decl($@)
348#else
349$2 $1 ();
350#endif[]dnl
351])
352
353
354# b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
355# ----------------------------------------------------------------
356# Declare the function NAME.
357m4_define([b4_c_ansi_function_decl],
358[$2 $1 (b4_c_ansi_formals(m4_shift2($@)));[]dnl
359])
360
361
362
363
364## --------------------- ##
365## Calling C functions. ##
366## --------------------- ##
367
368
369# b4_c_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
370# -----------------------------------------------------------
371# Call the function NAME with arguments NAME1, NAME2 etc.
372m4_define([b4_c_function_call],
373[$1 (b4_c_args(m4_shift2($@)))[]dnl
374])
375
376
377# b4_c_args([DECL1, NAME1], ...)
378# ------------------------------
379# Output the arguments NAME1, NAME2...
380m4_define([b4_c_args],
381[m4_map_sep([b4_c_arg], [, ], [$@])])
382
383m4_define([b4_c_arg],
384[$2])
385
386
387## ----------- ##
388## Synclines. ##
389## ----------- ##
390
391# b4_sync_start(LINE, FILE)
392# -----------------------
393m4_define([b4_sync_start], [[#]line $1 $2])
394
395
396## -------------- ##
397## User actions. ##
398## -------------- ##
399
400# b4_case(LABEL, STATEMENTS)
401# --------------------------
402m4_define([b4_case],
403[ case $1:
404$2
405 break;])
406
407# b4_symbol_actions(FILENAME, LINENO,
408# SYMBOL-TAG, SYMBOL-NUM,
409# SYMBOL-ACTION, SYMBOL-TYPENAME)
410# -------------------------------------------------
411m4_define([b4_symbol_actions],
412[m4_pushdef([b4_dollar_dollar],
413 [m4_ifval([$6], [(yyvaluep->$6)], [(*yyvaluep)])])dnl
414m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl
415 case $4: /* $3 */
416b4_syncline([$2], [$1])
417 $5;
418b4_syncline([@oline@], [@ofile@])
419 break;
420m4_popdef([b4_at_dollar])dnl
421m4_popdef([b4_dollar_dollar])dnl
422])
423
424
425# b4_yydestruct_generate(FUNCTION-DECLARATOR)
426# -------------------------------------------
427# Generate the "yydestruct" function, which declaration is issued using
428# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
429# or "b4_c_function_def" for K&R.
430m4_define_default([b4_yydestruct_generate],
431[[/*-----------------------------------------------.
432| Release the memory associated to this symbol. |
433`-----------------------------------------------*/
434
435/*ARGSUSED*/
436]$1([yydestruct],
437 [static void],
438 [[const char *yymsg], [yymsg]],
439 [[int yytype], [yytype]],
440 [[YYSTYPE *yyvaluep], [yyvaluep]][]dnl
441b4_locations_if( [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl
442m4_ifset([b4_parse_param], [, b4_parse_param]))[
443{
444 YYUSE (yyvaluep);
445]b4_locations_if([ YYUSE (yylocationp);
446])dnl
447b4_parse_param_use[]dnl
448[
449 if (!yymsg)
450 yymsg = "Deleting";
451 YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
452
453 switch (yytype)
454 {
455]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
456 default:
457 break;
458 }
459}]dnl
460])
461
462
463# b4_yy_symbol_print_generate(FUNCTION-DECLARATOR)
464# ------------------------------------------------
465# Generate the "yy_symbol_print" function, which declaration is issued using
466# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C
467# or "b4_c_function_def" for K&R.
468m4_define_default([b4_yy_symbol_print_generate],
469[[
470/*--------------------------------.
471| Print this symbol on YYOUTPUT. |
472`--------------------------------*/
473
474/*ARGSUSED*/
475]$1([yy_symbol_value_print],
476 [static void],
477 [[FILE *yyoutput], [yyoutput]],
478 [[int yytype], [yytype]],
479 [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl
480b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
481m4_ifset([b4_parse_param], [, b4_parse_param]))[
482{
483 FILE *yyo = yyoutput;
484 YYUSE (yyo);
485 if (!yyvaluep)
486 return;
487]b4_locations_if([ YYUSE (yylocationp);
488])dnl
489b4_parse_param_use[]dnl
490[# ifdef YYPRINT
491 if (yytype < YYNTOKENS)
492 YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
493# else
494 YYUSE (yyoutput);
495# endif
496 switch (yytype)
497 {
498]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
499[ default:
500 break;
501 }
502}
503
504
505/*--------------------------------.
506| Print this symbol on YYOUTPUT. |
507`--------------------------------*/
508
509]$1([yy_symbol_print],
510 [static void],
511 [[FILE *yyoutput], [yyoutput]],
512 [[int yytype], [yytype]],
513 [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl
514b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
515m4_ifset([b4_parse_param], [, b4_parse_param]))[
516{
517 if (yytype < YYNTOKENS)
518 YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
519 else
520 YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
521
522]b4_locations_if([ YY_LOCATION_PRINT (yyoutput, *yylocationp);
523 YYFPRINTF (yyoutput, ": ");
524])dnl
525[ yy_symbol_value_print (yyoutput, yytype, yyvaluep]dnl
526b4_locations_if([, yylocationp])[]b4_user_args[);
527 YYFPRINTF (yyoutput, ")");
528}]dnl
529])
530
531## -------------- ##
532## Declarations. ##
533## -------------- ##
534
535# b4_declare_yylstype
536# ------------------
537# Declarations that might either go into the header (if --defines) or
538# in the parser body. Declare YYSTYPE/YYLTYPE, and yylval/yylloc.
539m4_define([b4_declare_yylstype],
540[[#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
541]m4_ifdef([b4_stype],
542[[typedef union ]b4_union_name[
543{
544]b4_user_stype[
545} YYSTYPE;
546# define YYSTYPE_IS_TRIVIAL 1]],
547[m4_if(b4_tag_seen_flag, 0,
548[[typedef int YYSTYPE;
549# define YYSTYPE_IS_TRIVIAL 1]])])[
550# define yystype YYSTYPE /* obsolescent; will be withdrawn */
551# define YYSTYPE_IS_DECLARED 1
552#endif]b4_locations_if([[
553
554#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
555typedef struct YYLTYPE
556{
557 int first_line;
558 int first_column;
559 int last_line;
560 int last_column;
561} YYLTYPE;
562# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
563# define YYLTYPE_IS_DECLARED 1
564# define YYLTYPE_IS_TRIVIAL 1
565#endif]])
566
567b4_pure_if([], [[extern YYSTYPE ]b4_prefix[lval;
568]b4_locations_if([[extern YYLTYPE ]b4_prefix[lloc;]])])[]dnl
569])
570
571# b4_declare_yydebug
572# ------------------
573m4_define([b4_declare_yydebug],
574[[/* Enabling traces. */
575#ifndef YYDEBUG
576# define YYDEBUG ]b4_debug_flag[
577#endif
578#if YYDEBUG
579extern int ]b4_prefix[debug;
580#endif][]dnl
581])