From cf147260d296ffc3544ddf68565bbdd22dfebab1 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Fri, 16 Sep 2005 19:26:40 +0000 Subject: [PATCH] * data/c.m4 (b4_token_enums): New. (b4_token_defines): Rename as... (b4_token_enums_defines): this. (b4_token_defines): New, output only the #defines. * data/yacc.c, data/glr.c: Adjust. * data/lalr1.cc: Use b4_token_enums instead of b4_token_enums_defines. * data/c.m4 (b4_yydestruct_generate, b4_yysymprint_generate): Define as default values. --- ChangeLog | 11 +++++ data/Makefile.am | 6 ++- data/c++.m4 | 121 +++++++++++++++++++++++++++++++++++++++++++++++ data/c.m4 | 32 +++++++++---- data/glr.c | 4 +- data/lalr1.cc | 90 +---------------------------------- data/yacc.c | 4 +- src/output.c | 8 +++- 8 files changed, 171 insertions(+), 105 deletions(-) create mode 100644 data/c++.m4 diff --git a/ChangeLog b/ChangeLog index c619d4d3..5864bb7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2005-09-16 Akim + + * data/c.m4 (b4_token_enums): New. + (b4_token_defines): Rename as... + (b4_token_enums_defines): this. + (b4_token_defines): New, output only the #defines. + * data/yacc.c, data/glr.c: Adjust. + * data/lalr1.cc: Use b4_token_enums instead of b4_token_enums_defines. + * data/c.m4 (b4_yydestruct_generate, b4_yysymprint_generate): Define + as default values. + 2005-09-16 Akim Demaille * data/lalr1.cc (yylex_): Remove, inline its code. diff --git a/data/Makefile.am b/data/Makefile.am index a9b59955..26e0a001 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,4 +1,4 @@ -## Copyright (C) 2002 Free Software Foundation, Inc. +## Copyright (C) 2002, 2005 Free Software Foundation, Inc. ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -15,7 +15,9 @@ ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ## 02110-1301 USA -dist_pkgdata_DATA = README c.m4 yacc.c lalr1.cc glr.c +dist_pkgdata_DATA = README \ + c.m4 yacc.c glr.c \ + c++.m4 lalr1.cc m4sugardir = $(pkgdatadir)/m4sugar dist_m4sugar_DATA = m4sugar/m4sugar.m4 diff --git a/data/c++.m4 b/data/c++.m4 new file mode 100644 index 00000000..0f127b93 --- /dev/null +++ b/data/c++.m4 @@ -0,0 +1,121 @@ +m4_divert(-1) + +# C++ skeleton for Bison + +# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# Default parser class name. +m4_define_default([b4_parser_class_name], [parser]) +m4_define_default([b4_location_type], [location]) +m4_define_default([b4_filename_type], [std::string]) + + + +# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ----------------------------------------------------- +# Output the definition of the tokens (if there are) as enums. +m4_define([b4_token_enums], +[m4_if([$@], [[]], [], +[/* Tokens. */ + enum yytokentype { +m4_map_sep([ b4_token_enum], [, +], + [$@]) + }; +])]) + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[(yyval[]m4_ifval([$1], [.$1]))]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +m4_define([b4_rhs_value], +[(yysemantic_stack_@{m4_eval([$1 - $2])@}m4_ifval([$3], [.$3]))]) + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[(yyloc)]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[(yylocation_stack_@{m4_eval([$1 - $2])@})]) + + +# b4_parse_param_decl +# ------------------- +# Extra formal arguments of the constructor. +# Change the parameter names from "foo" into "foo_yyarg", so that +# there is no collision bw the user chosen attribute name, and the +# argument name in the constructor. +m4_define([b4_parse_param_decl], +[m4_ifset([b4_parse_param], + [m4_map_sep([b4_parse_param_decl_1], [, ], [b4_parse_param])])]) + +m4_define([b4_parse_param_decl_1], +[$1_yyarg]) + + + +# b4_parse_param_cons +# ------------------- +# Extra initialisations of the constructor. +m4_define([b4_parse_param_cons], + [m4_ifset([b4_parse_param], + [, + b4_cc_constructor_calls(b4_parse_param)])]) +m4_define([b4_cc_constructor_calls], + [m4_map_sep([b4_cc_constructor_call], [, + ], [$@])]) +m4_define([b4_cc_constructor_call], + [$2 ($2_yyarg)]) + +# b4_parse_param_vars +# ------------------- +# Extra instance variables. +m4_define([b4_parse_param_vars], + [m4_ifset([b4_parse_param], + [ + /* User arguments. */ +b4_cc_var_decls(b4_parse_param)])]) +m4_define([b4_cc_var_decls], + [m4_map_sep([b4_cc_var_decl], [ +], [$@])]) +m4_define([b4_cc_var_decl], + [ $1;]) diff --git a/data/c.m4 b/data/c.m4 index 2a3218bf..d8dc6bc4 100644 --- a/data/c.m4 +++ b/data/c.m4 @@ -169,6 +169,16 @@ m4_define([b4_token_define], ]) +# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ------------------------------------------------------- +# Output the definition of the tokens (if there are) as #defines. +m4_define([b4_token_defines], +[m4_if([$@], [[]], [], +[/* Tokens. */ +m4_map([b4_token_define], [$@])]) +]) + + # b4_token_enum(TOKEN-NAME, TOKEN-NUMBER) # --------------------------------------- # Output the definition of this token as an enum. @@ -176,10 +186,10 @@ m4_define([b4_token_enum], [$1 = $2]) -# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) -# ------------------------------------------------------- -# Output the definition of the tokens (if there are) as enums and #define. -m4_define([b4_token_defines], +# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ----------------------------------------------------- +# Output the definition of the tokens (if there are) as enums. +m4_define([b4_token_enums], [m4_if([$@], [[]], [], [/* Tokens. */ #ifndef YYTOKENTYPE @@ -192,8 +202,14 @@ m4_map_sep([ b4_token_enum], [, [$@]) }; #endif -m4_map([b4_token_define], [$@]) -]) +])]) + + +# b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ------------------------------------------------------------- +# Output the definition of the tokens (if there are) as enums and #defines. +m4_define([b4_token_enums_defines], +[b4_token_enums($@)b4_token_defines($@) ]) @@ -348,7 +364,7 @@ m4_popdef([b4_dollar_dollar])dnl # Generate the "yydestruct" function, which declaration is issued using # FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C # or "b4_c_function_def" for K&R. -m4_define([b4_yydestruct_generate], +m4_define_default([b4_yydestruct_generate], [[/*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ @@ -383,7 +399,7 @@ m4_define([b4_yydestruct_generate], # Generate the "yysymprint" function, which declaration is issued using # FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C # or "b4_c_function_def" for K&R. -m4_define([b4_yysymprint_generate], +m4_define_default([b4_yysymprint_generate], [[/*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ diff --git a/data/glr.c b/data/glr.c index c6e84538..244c4308 100644 --- a/data/glr.c +++ b/data/glr.c @@ -154,7 +154,7 @@ m4_if(b4_prefix[], [yy], [], #define yynerrs b4_prefix[]nerrs #define yylloc b4_prefix[]lloc]) -b4_token_defines(b4_tokens) +b4_token_enums_defines(b4_tokens) /* Copy the first part of user declarations. */ b4_pre_prologue[ @@ -2321,7 +2321,7 @@ m4_if(b4_defines_flag, 0, [], b4_copyright([Skeleton parser for GLR parsing with Bison], [2002, 2003, 2004, 2005]) -b4_token_defines(b4_tokens) +b4_token_enums_defines(b4_tokens) #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) m4_ifdef([b4_stype], diff --git a/data/lalr1.cc b/data/lalr1.cc index c8c702a6..043b082a 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -19,95 +19,7 @@ m4_divert(-1) # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA -## ---------------- ## -## Default values. ## -## ---------------- ## - -# Default parser class name. -m4_define_default([b4_parser_class_name], [parser]) - - - -## ----------------- ## -## Semantic Values. ## -## ----------------- ## - - -# b4_lhs_value([TYPE]) -# -------------------- -# Expansion of $$. -m4_define([b4_lhs_value], -[(yyval[]m4_ifval([$1], [.$1]))]) - - -# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) -# -------------------------------------- -# Expansion of $NUM, where the current rule has RULE-LENGTH -# symbols on RHS. -m4_define([b4_rhs_value], -[(yysemantic_stack_@{m4_eval([$1 - $2])@}m4_ifval([$3], [.$3]))]) - -m4_define_default([b4_location_type], [location]) -m4_define_default([b4_filename_type], [std::string]) - -# b4_lhs_location() -# ----------------- -# Expansion of @$. -m4_define([b4_lhs_location], -[(yyloc)]) - - -# b4_rhs_location(RULE-LENGTH, NUM) -# --------------------------------- -# Expansion of @NUM, where the current rule has RULE-LENGTH symbols -# on RHS. -m4_define([b4_rhs_location], -[(yylocation_stack_@{m4_eval([$1 - $2])@})]) - - -# b4_parse_param_decl -# ------------------- -# Extra formal arguments of the constructor. -# Change the parameter names from "foo" into "foo_yyarg", so that -# there is no collision bw the user chosen attribute name, and the -# argument name in the constructor. -m4_define([b4_parse_param_decl], -[m4_ifset([b4_parse_param], - [m4_map_sep([b4_parse_param_decl_1], [, ], [b4_parse_param])])]) - -m4_define([b4_parse_param_decl_1], -[$1_yyarg]) - - - -# b4_parse_param_cons -# ------------------- -# Extra initialisations of the constructor. -m4_define([b4_parse_param_cons], - [m4_ifset([b4_parse_param], - [, - b4_cc_constructor_calls(b4_parse_param)])]) -m4_define([b4_cc_constructor_calls], - [m4_map_sep([b4_cc_constructor_call], [, - ], [$@])]) -m4_define([b4_cc_constructor_call], - [$2 ($2_yyarg)]) - -# b4_parse_param_vars -# ------------------- -# Extra instance variables. -m4_define([b4_parse_param_vars], - [m4_ifset([b4_parse_param], - [ - /* User arguments. */ -b4_cc_var_decls(b4_parse_param)])]) -m4_define([b4_cc_var_decls], - [m4_map_sep([b4_cc_var_decl], [ -], [$@])]) -m4_define([b4_cc_var_decl], - [ $1;]) - - +m4_include(b4_pkgdatadir/[c++.m4]) # We do want M4 expansion after # for CPP macros. m4_changecom() diff --git a/data/yacc.c b/data/yacc.c index 4f9e7a37..7e7c44ac 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -164,7 +164,7 @@ m4_if(b4_prefix[], [yy], [], #define yynerrs b4_prefix[]nerrs b4_location_if([#define yylloc b4_prefix[]lloc])])[ -]b4_token_defines(b4_tokens)[ +]b4_token_enums_defines(b4_tokens)[ /* Copy the first part of user declarations. */ ]b4_pre_prologue[ @@ -1410,7 +1410,7 @@ b4_copyright([Skeleton parser for Yacc-like parsing with Bison], This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ -b4_token_defines(b4_tokens) +b4_token_enums_defines(b4_tokens) #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) m4_ifdef([b4_stype], diff --git a/src/output.c b/src/output.c index 9bc806f1..3839412e 100644 --- a/src/output.c +++ b/src/output.c @@ -616,8 +616,12 @@ prepare (void) skeleton = "yacc.c"; } - /* Parse the skeleton file and output the needed parsers. */ - MUSCLE_INSERT_C_STRING ("skeleton", skeleton); + /* About the skeletons. */ + { + char const* p = getenv ("BISON_PKGDATADIR"); + MUSCLE_INSERT_STRING ("pkgdatadir", p ? p : PKGDATADIR); + MUSCLE_INSERT_C_STRING ("skeleton", skeleton); + } } -- 2.47.2