c: improve the definition of public types

* data/c.m4 (b4_token_enum): Improve comments.
(b4_value_type_define, b4_location_type_define): New, extracted
from...
(b4_declare_yylstype): here.
Separate the typedefs from the union/struct definitions.
This commit is contained in:
Akim Demaille
2012-12-23 17:54:59 +01:00
parent ae8880deec
commit 4d9bdbe384
2 changed files with 33 additions and 17 deletions

View File

@@ -270,11 +270,9 @@ m4_define([b4_token_enum],
# -------------- # --------------
# Output the definition of the tokens (if there are) as enums. # Output the definition of the tokens (if there are) as enums.
m4_define([b4_token_enums], m4_define([b4_token_enums],
[b4_any_token_visible_if([[/* Tokens. */ [b4_any_token_visible_if([[/* Token type. */
#ifndef ]b4_api_PREFIX[TOKENTYPE #ifndef ]b4_api_PREFIX[TOKENTYPE
# define ]b4_api_PREFIX[TOKENTYPE # define ]b4_api_PREFIX[TOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum ]b4_api_prefix[tokentype enum ]b4_api_prefix[tokentype
{ {
]m4_join([, ]m4_join([,
@@ -503,44 +501,62 @@ b4_locations_if([, yylocationp])[]b4_user_args[);
## Declarations. ## ## Declarations. ##
## -------------- ## ## -------------- ##
# b4_declare_yylstype # b4_value_type_define
# ------------------- # --------------------
# Declarations that might either go into the header (if --defines) or m4_define([b4_value_type_define],
# in the parser body. Declare YYSTYPE/YYLTYPE, and yylval/yylloc. [[/* Value type. */
m4_define([b4_declare_yylstype], #if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
[[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED
]m4_ifdef([b4_stype], ]m4_ifdef([b4_stype],
[[typedef union ]b4_union_name[ [[typedef union ]b4_union_name[ ]b4_api_PREFIX[STYPE;
union ]b4_union_name[
{ {
]b4_user_stype[ ]b4_user_stype[
} ]b4_api_PREFIX[STYPE; };
# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]], # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]],
[m4_if(b4_tag_seen_flag, 0, [m4_if(b4_tag_seen_flag, 0,
[[typedef int ]b4_api_PREFIX[STYPE; [[typedef int ]b4_api_PREFIX[STYPE;
# define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[ # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[
# define ]b4_api_PREFIX[STYPE_IS_DECLARED 1 # define ]b4_api_PREFIX[STYPE_IS_DECLARED 1
#endif]b4_locations_if([[ #endif
]])
# b4_location_type_define
# -----------------------
m4_define([b4_location_type_define],
[[/* Location type. */
#if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED #if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED
typedef struct ]b4_api_PREFIX[LTYPE typedef struct ]b4_api_PREFIX[LTYPE ]b4_api_PREFIX[LTYPE;
struct ]b4_api_PREFIX[LTYPE
{ {
int first_line; int first_line;
int first_column; int first_column;
int last_line; int last_line;
int last_column; int last_column;
} ]b4_api_PREFIX[LTYPE; };
# define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1 # define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1
# define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1 # define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1
#endif]]) #endif
]])
# b4_declare_yylstype
# -------------------
# Declarations that might either go into the header (if --defines) or
# in the parser body. Declare YYSTYPE/YYLTYPE, and yylval/yylloc.
m4_define([b4_declare_yylstype],
[b4_value_type_define[]b4_locations_if([
b4_location_type_define])
b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval; b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval;
]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl ]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl
]) ])
# b4_YYDEBUG_define # b4_YYDEBUG_define
# ------------------ # ------------------
m4_define([b4_YYDEBUG_define], m4_define([b4_YYDEBUG_define],
[[/* Enabling traces. */ [[/* Debug traces. */
]m4_if(b4_api_prefix, [yy], ]m4_if(b4_api_prefix, [yy],
[[#ifndef YYDEBUG [[#ifndef YYDEBUG
# define YYDEBUG ]b4_parse_trace_if([1], [0])[ # define YYDEBUG ]b4_parse_trace_if([1], [0])[

View File

@@ -6092,7 +6092,7 @@ parsers. To comply with this tradition, when @code{api.prefix} is used,
@code{YYDEBUG} (not renamed) is used as a default value: @code{YYDEBUG} (not renamed) is used as a default value:
@example @example
/* Enabling traces. */ /* Debug traces. */
#ifndef CDEBUG #ifndef CDEBUG
# if defined YYDEBUG # if defined YYDEBUG
# if YYDEBUG # if YYDEBUG