lalr1.cc: don't generate location.hh when location_type is defined

* data/bison.m4 (b4_percent_define_use): New.
	(b4_percent_define_get): Use it.
	Accept a default value.
	* data/c++.m4: Do not provide a default value for the %define
	variable location_type, rather, use b4_percent_define_get with a
	default argument where its value is needed.
	* data/lalr1.cc: Do not load location.cc (which outputs both
	location.hh and position.hh) if the user defined location_type.
	Do not include location.hh either.
	* data/glr.cc: Likewise.

(cherry picked from commit 7789b6e3e7)

Conflicts:

	ChangeLog
	data/bison.m4
	data/c++.m4
	data/lalr1.cc
This commit is contained in:
Akim Demaille
2010-05-09 14:29:35 +02:00
parent 38f9fd6439
commit 95a2de5695
5 changed files with 56 additions and 13 deletions

View File

@@ -361,10 +361,26 @@ m4_popdef([b4_start])dnl
m4_popdef([b4_end])dnl
])])
# b4_percent_define_get(VARIABLE)
## --------------------- ##
## b4_percent_define_*. ##
## --------------------- ##
# b4_percent_define_use(VARIABLE)
# -------------------------------
# Mimic muscle_percent_define_get in ../src/muscle-tab.h exactly. That is, if
# the %define variable VARIABLE is defined, emit its value. Also, record
# Declare that VARIABLE was used.
m4_define([b4_percent_define_use],
[m4_define([b4_percent_define_bison_variables(]$1[)])dnl
])
# b4_percent_define_get(VARIABLE, [DEFAULT])
# ------------------------------------------
# Mimic muscle_percent_define_get in ../src/muscle-tab.h. That is, if
# the %define variable VARIABLE is defined, emit its value. Contrary
# to its C counterpart, return DEFAULT otherwise. Also, record
# Bison's usage of VARIABLE by defining
# b4_percent_define_bison_variables(VARIABLE).
#
@@ -372,8 +388,11 @@ m4_popdef([b4_end])dnl
#
# b4_percent_define_get([[foo]])
m4_define([b4_percent_define_get],
[m4_define([b4_percent_define_bison_variables(]$1[)])dnl
m4_ifdef([b4_percent_define(]$1[)], [m4_indir([b4_percent_define(]$1[)])])])
[b4_percent_define_use([$1])dnl
m4_ifdef([b4_percent_define(]$1[)],
[m4_indir([b4_percent_define(]$1[)])],
[$2])])
# b4_percent_define_get_loc(VARIABLE)
# -----------------------------------

View File

@@ -25,7 +25,12 @@ m4_include(b4_pkgdatadir/[c.m4])
# Default parser class name.
b4_percent_define_default([[parser_class_name]], [[parser]])
b4_percent_define_default([[location_type]], [[location]])
# Don't do that so that we remember whether we're using a user
# request, or the default value.
#
# b4_percent_define_default([[location_type]], [[location]])
b4_percent_define_default([[filename_type]], [[std::string]])
b4_percent_define_default([[namespace]], m4_defn([b4_prefix]))
b4_percent_define_default([[global_tokens_and_yystype]], [[false]])

View File

@@ -229,7 +229,8 @@ b4_copyright([Skeleton interface for Bison GLR parsers in C++],
#include <string>
#include <iostream>
#include "location.hh"
]b4_percent_define_ifdef([[location_type]], [],
[[#include "location.hh"]])[
/* Using locations. */
#define YYLSP_NEEDED ]b4_locations_flag[
@@ -277,7 +278,8 @@ b4_user_stype
typedef YYSTYPE semantic_type;
#endif
/// Symbol locations.
typedef ]b4_percent_define_get([[location_type]])[ location_type;
typedef ]b4_percent_define_get([[location_type]],
[[location]])[ location_type;
/// Tokens.
struct token
{

View File

@@ -24,9 +24,10 @@ m4_define([b4_parser_class_name],
b4_defines_if([],
[b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
# Backward compatibility.
m4_define([b4_location_constructors])
m4_include(b4_pkgdatadir/[location.cc])
b4_percent_define_ifdef([[location_type]], [],
[# Backward compatibility.
m4_define([b4_location_constructors])
m4_include(b4_pkgdatadir/[location.cc])])
# We do want M4 expansion after # for CPP macros.
m4_changecom()
@@ -46,8 +47,9 @@ dnl FIXME: This is wrong, we want computed header guards.
#include <string>
#include <iostream>
#include "location.hh"
#include "stack.hh"
]b4_percent_define_ifdef([[location_type]], [],
[[#include "location.hh"]])[
/* Enabling traces. */
#ifndef YYDEBUG
@@ -106,7 +108,8 @@ b4_user_stype
typedef YYSTYPE semantic_type;
#endif
/// Symbol locations.
typedef ]b4_percent_define_get([[location_type]])[ location_type;
typedef ]b4_percent_define_get([[location_type]],
[[location]])[ location_type;
/// Tokens.
struct token
{