From: Akim Demaille Date: Tue, 12 Jun 2012 08:55:18 +0000 (+0200) Subject: skeletons: factor yacc.c and glr.c. X-Git-Tag: v2.6~80 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/c0828abf9d81ce665d5dc9b5a2b2062e267d4114?hp=-c skeletons: factor yacc.c and glr.c. yacc.c and glr.c share common declarations. Their YYLTYPE are exactly equal, and their YYSTYPE are sufficiently alike to be fused (its declaration was protected by YYSTYPE_IS_DECLARED in yacc.c, but not in glr.c). Besides, yacc.c duplicated the definitions of YYLTYPE and YYSTYPE (*.h/*.c). * data/c.m4 (b4_declare_yylstype): New. * data/yacc.c, data/glr.c: Use it. --- c0828abf9d81ce665d5dc9b5a2b2062e267d4114 diff --git a/data/c.m4 b/data/c.m4 index b49d6dc9..64f68fec 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -530,3 +530,40 @@ b4_locations_if([, yylocationp])[]b4_user_args[); YYFPRINTF (yyoutput, ")"); }]dnl ]) + +## -------------- ## +## Declarations. ## +## -------------- ## + +# b4_declare_yylstype +# ------------------ +# Declaration that might either go into the header (if --defines) +# or open coded in the parser body. Declare YYSTYPE and YYLTYPE. +m4_define([b4_declare_yylstype], +[[#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +]m4_ifdef([b4_stype], +[[typedef union ]b4_union_name[ +{ +]b4_user_stype[ +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1]], +[m4_if(b4_tag_seen_flag, 0, +[[typedef int YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1]])])[ +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif]b4_locations_if([[ + +#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED +typedef struct YYLTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif]]) +]) diff --git a/data/glr.c b/data/glr.c index 7588bd10..7ebc65c0 100644 --- a/data/glr.c +++ b/data/glr.c @@ -163,34 +163,9 @@ m4_define([b4_rhs_location], # Declaration that might either go into the header (if --defines) # or open coded in the parser body. m4_define([b4_shared_declarations], -[b4_percent_code_get([[requires]])[]dnl - -b4_token_enums(b4_tokens) - -[#ifndef YYSTYPE -]m4_ifdef([b4_stype], -[[typedef union ]b4_union_name[ -{ -]b4_user_stype[ -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1]], -[m4_if(b4_tag_seen_flag, 0, -[[typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1]])])[ -#endif -]b4_locations_if([[ -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -} YYLTYPE; -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif -]])[ +[b4_percent_code_get([[requires]])[ +]b4_token_enums(b4_tokens)[ +]b4_declare_yylstype[ ]b4_percent_code_get([[provides]])[]dnl ]) diff --git a/data/yacc.c b/data/yacc.c index dbaff877..5ba271cb 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -158,9 +158,9 @@ m4_define([b4_rhs_location], [(yylsp@{($2) - ($1)@})]) -## ------------------ ## -## Parser variables. ## -## ------------------ ## +## -------------- ## +## Declarations. ## +## -------------- ## # b4_declare_scanner_communication_variables # ------------------------------------------ @@ -224,10 +224,9 @@ m4_define([b4_declare_parser_state_variables], [b4_pure_if([[ yytype_int16 *yyes; YYSIZE_T yyes_capacity;]])]) - -## --------------------------------------------------------- ## -## Defining symbol actions, e.g., printers and destructors. ## -## --------------------------------------------------------- ## +## -------------- ## +## Output files. ## +## -------------- ## # We do want M4 expansion after # for CPP macros. m4_changecom() @@ -287,37 +286,10 @@ m4_if(b4_prefix, [yy], [], # define YYTOKEN_TABLE ]b4_token_table[ #endif -]b4_percent_code_get([[requires]])[]dnl - -b4_token_enums_defines(b4_tokens)[ - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -]m4_ifdef([b4_stype], -[[typedef union ]b4_union_name[ -{ -]b4_user_stype[ -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1]], -[m4_if(b4_tag_seen_flag, 0, -[[typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1]])])[ -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif]b4_locations_if([[ - -#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -} YYLTYPE; -# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif]])b4_push_if([[ - +]b4_percent_code_get([[requires]])[ +]b4_token_enums_defines(b4_tokens)[ +]b4_declare_yylstype[ +]b4_push_if([[ #ifndef YYPUSH_DECLS # define YYPUSH_DECLS struct yypstate; @@ -2076,40 +2048,10 @@ b4_copyright([Bison interface for Yacc-like parsers in C], b4_percent_code_get([[requires]])[]dnl -b4_token_enums_defines(b4_tokens) - -[#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -]m4_ifdef([b4_stype], -[[typedef union ]b4_union_name[ -{ -]b4_user_stype[ -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1]], -[m4_if(b4_tag_seen_flag, 0, -[[typedef int YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1]])])[ -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - -]b4_pure_if([], [[extern YYSTYPE ]b4_prefix[lval;]]) - -b4_locations_if( -[#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED -typedef struct YYLTYPE -{ - int first_line; - int first_column; - int last_line; - int last_column; -} YYLTYPE; -# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ -# define YYLTYPE_IS_DECLARED 1 -# define YYLTYPE_IS_TRIVIAL 1 -#endif - -]b4_pure_if([], [[extern YYLTYPE ]b4_prefix[lloc;]]) -)dnl b4_locations_if +b4_token_enums_defines(b4_tokens)[ +]b4_declare_yylstype[ +]b4_pure_if([], [[extern YYSTYPE ]b4_prefix[lval; +]b4_locations_if([[extern YYLTYPE ]b4_prefix[lloc;]])])dnl b4_push_if([[ #ifndef YYPUSH_DECLS # define YYPUSH_DECLS