diff --git a/NEWS b/NEWS index 5352e043..f41a5931 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,24 @@ GNU Bison NEWS When given -fsyntax-only, the diagnostics are reported, but no output is generated. +*** Include the generated header (yacc.c) + + Before, when --defines is used, bison generated a header, and pasted an + exact copy of it into the generated parser implementation file. If the + header name is not "y.tab.h", it is now #included instead of being + duplicated. + + To use an '#include' even if the header name is "y.tab.h" (which is what + happens with --yacc, or when using the Autotools' ylwrap), define + api.header.include to the exact argument to pass to #include. For + instance: + + %define api.header.include {"parse.h"} + + or + + %define api.header.include {} + ** Documentation A new example in C shows an simple infix calculator with a hand-written diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c index fb3cf54a..446b5c84 100644 --- a/data/skeletons/yacc.c +++ b/data/skeletons/yacc.c @@ -294,6 +294,25 @@ m4_define([b4_shared_declarations], ]b4_cpp_guard_close([b4_spec_defines_file])[]dnl ]) + +# b4_header_include_if(IF-TRUE, IF-FALSE) +# --------------------------------------- +# Run IF-TRUE if we generate an output file and api.header.include +# is defined. +m4_define([b4_header_include_if], +[m4_ifval(m4_quote(b4_spec_defines_file), + [b4_percent_define_ifdef([[api.header.include]], + [$1], + [$2])], + [$2])]) + +m4_if(b4_spec_defines_file, [[y.tab.h]], + [b4_percent_define_default([[api.header.include]], + [["@basename(]b4_spec_defines_file[@)"]])]) + + + + ## -------------- ## ## Output files. ## ## -------------- ## @@ -354,11 +373,10 @@ m4_if(b4_api_prefix, [yy], [], # define YYERROR_VERBOSE ]b4_error_verbose_if([1], [0])[ #endif -]m4_ifval(m4_quote(b4_spec_defines_file), -[[/* In a future release of Bison, this section will be replaced - by #include "@basename(]b4_spec_defines_file[@)". */ -]])dnl -b4_shared_declarations[ +]b4_header_include_if([[#include ]b4_percent_define_get([[api.header.include]])], + [/* Use api.header.include to #include this header + instead of duplicating it here. */ +b4_shared_declarations])[ ]b4_user_post_prologue[ ]b4_percent_code_get[]dnl diff --git a/examples/c/calc/calc.y b/examples/c/calc/calc.y index f3771f2e..f3a6cb1d 100644 --- a/examples/c/calc/calc.y +++ b/examples/c/calc/calc.y @@ -7,6 +7,7 @@ void yyerror (char const *); } +%define api.header.include {"calc.h"} %define api.value.type union /* Generate YYSTYPE from these types: */ %token NUM "number" %type expr term fact diff --git a/src/parse-gram.y b/src/parse-gram.y index b01c4e83..13598fa0 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -114,6 +114,7 @@ #define YYTYPE_UINT8 uint_fast8_t } +%define api.header.include {"parse-gram.h"} %define api.prefix {gram_} %define api.pure full %define api.value.type union