From 93549bcd43da0b9d0b756876008bd388828e5a08 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 30 Jul 2012 16:37:02 +0200 Subject: [PATCH 1/1] lalr1.cc: location.hh and position.hh are not generated without %defines * data/location.cc (b4_position_define, b4_location_define): New. (location.hh, position.hh): Generate only if %defines. * data/lalr1.cc: therefore, define these classes when locations are needed, but headers are not generated. * tests/output.at: Check that these files are not generated. * NEWS: Document. --- NEWS | 5 +++ TODO | 3 ++ data/lalr1.cc | 19 +++++----- data/location.cc | 91 +++++++++++++++++++++++++++--------------------- tests/output.at | 6 ++++ 5 files changed, 75 insertions(+), 49 deletions(-) diff --git a/NEWS b/NEWS index 1e660a2f..ef01a6a2 100644 --- a/NEWS +++ b/NEWS @@ -84,6 +84,11 @@ GNU Bison NEWS ** C++ skeletons improvements +*** parser header (%defines) is no longer mandatory (lalr1.cc) + + In which case, if needed, the support classes are defined in the generated + parser, instead of additional files such as position.hh and location.hh. + *** locations are no longer mandatory (lalr1.cc, glr.cc) Both lalr1.cc and glr.cc no longer require %location. diff --git a/TODO b/TODO index 4f4674f7..9eb10920 100644 --- a/TODO +++ b/TODO @@ -7,6 +7,9 @@ show_sub_messages should call show_sub_message. b4_shared_declarations is no longer what it is. Make it b4_parser_declaration for instance. +** glr.cc: %defines +it should not be mandatory. + ** Variable names. What should we name `variant' and `lex_symbol'? diff --git a/data/lalr1.cc b/data/lalr1.cc index 57922578..6e299d5d 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -120,10 +120,6 @@ m4_pushdef([b4_copyright_years], m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])]) -# The header is mandatory. -b4_defines_if([], - [b4_fatal([b4_skeleton[: using %%defines is mandatory]])]) - b4_locations_if([b4_percent_define_ifdef([[location_type]], [], [# Backward compatibility. m4_define([b4_location_constructors]) @@ -141,17 +137,20 @@ m4_define([b4_shared_declarations], # include # include # include + +]b4_YYDEBUG_define[ + # include "stack.hh" ]b4_locations_if([b4_percent_define_ifdef([[location_type]], [], - [[# include "location.hh"]])])[ + [b4_defines_if([[# include "location.hh"]])])])[ -]b4_variant_if([b4_namespace_open -b4_variant_define -b4_namespace_close])[ +]b4_namespace_open[ -]b4_YYDEBUG_define[ +]b4_locations_if([b4_percent_define_ifdef([[location_type]], [], + [b4_defines_if([], [b4_position_define +b4_location_define])])])[ -]b4_namespace_open[ +]b4_variant_if([b4_variant_define])[ /// A Bison parser. class ]b4_parser_class_name[ diff --git a/data/location.cc b/data/location.cc index cfbfd76b..218910b1 100644 --- a/data/location.cc +++ b/data/location.cc @@ -18,27 +18,11 @@ m4_pushdef([b4_copyright_years], [2002-2012]) -# We do want M4 expansion after # for CPP macros. -m4_changecom() -m4_divert_push(0)dnl -@output(b4_dir_prefix[]position.hh@)@ -b4_copyright([Positions for Bison parsers in C++])[ - -/** - ** \file ]b4_dir_prefix[position.hh - ** Define the ]b4_namespace_ref[::position class. - */ - -]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[ - -# include // std::max -# include -# include - -]b4_null_define[ - -]b4_namespace_open[ - /// Abstract a position. +# b4_position_define +# ------------------ +# Define class position. +m4_define([b4_position_define], +[[ /// Abstract a position. class position { public: @@ -147,26 +131,13 @@ b4_copyright([Positions for Bison parsers in C++])[ ostr << *pos.filename << ':'; return ostr << pos.line << '.' << pos.column; } +]]) -]b4_namespace_close[ -]b4_cpp_guard_close([b4_dir_prefix[]position.hh]) -@output(b4_dir_prefix[]location.hh@)@ -b4_copyright([Locations for Bison parsers in C++])[ - -/** - ** \file ]b4_dir_prefix[location.hh - ** Define the ]b4_namespace_ref[::location class. - */ - -]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[ - -# include -# include -# include "position.hh" - -]b4_namespace_open[ - /// Abstract a location. +# b4_location_define +# ------------------ +m4_define([b4_location_define], +[[ /// Abstract a location. class location { public: @@ -291,10 +262,52 @@ b4_copyright([Locations for Bison parsers in C++])[ ostr << '-' << last.column; return ostr; } +]]) + +# We do want M4 expansion after # for CPP macros. +m4_changecom() +b4_defines_if([ +m4_divert_push(0)dnl +@output(b4_dir_prefix[]position.hh@)@ +b4_copyright([Positions for Bison parsers in C++])[ + +/** + ** \file ]b4_dir_prefix[position.hh + ** Define the ]b4_namespace_ref[::position class. + */ + +]b4_cpp_guard_open([b4_dir_prefix[]position.hh])[ + +# include // std::max +# include +# include + +]b4_null_define[ + +]b4_namespace_open[ +]b4_position_define[ ]b4_namespace_close[ +]b4_cpp_guard_close([b4_dir_prefix[]position.hh]) +@output(b4_dir_prefix[]location.hh@)@ +b4_copyright([Locations for Bison parsers in C++])[ + +/** + ** \file ]b4_dir_prefix[location.hh + ** Define the ]b4_namespace_ref[::location class. + */ + +]b4_cpp_guard_open([b4_dir_prefix[]location.hh])[ +# include +# include +# include "position.hh" + +]b4_namespace_open[ +]b4_location_define[ +]b4_namespace_close[ ]b4_cpp_guard_close([b4_dir_prefix[]location.hh]) m4_divert_pop(0) +])# b4_defines_if m4_popdef([b4_copyright_years])dnl m4_changecom([#]) diff --git a/tests/output.at b/tests/output.at index 5cb57bba..e8019c2a 100644 --- a/tests/output.at +++ b/tests/output.at @@ -113,9 +113,15 @@ AT_CHECK([grep 'include .subdir/' $1.cc], 1, []) AT_CHECK([grep 'include .subdir/' $1.hh], 1, []) ]) +AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose], [], + [foo.tab.cc foo.output stack.hh]) + AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [], [foo.tab.cc foo.tab.hh foo.output stack.hh]) +AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose %locations], [], + [foo.tab.cc foo.output stack.hh]) + AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations], [], [foo.tab.cc foo.tab.hh foo.output location.hh stack.hh position.hh]) -- 2.45.2