diff options
-rw-r--r-- | NEWS | 7 | ||||
-rw-r--r-- | data/skeletons/lalr1.java | 2 | ||||
-rw-r--r-- | doc/bison.texi | 74 | ||||
-rwxr-xr-x | etc/bench.pl.in | 2 | ||||
-rw-r--r-- | src/parse-gram.y | 35 | ||||
-rw-r--r-- | src/scan-gram.l | 5 | ||||
-rw-r--r-- | tests/actions.at | 12 | ||||
-rw-r--r-- | tests/c++.at | 10 | ||||
-rw-r--r-- | tests/calc.at | 75 | ||||
-rw-r--r-- | tests/conflicts.at | 4 | ||||
-rw-r--r-- | tests/input.at | 4 | ||||
-rw-r--r-- | tests/java.at | 17 | ||||
-rw-r--r-- | tests/local.at | 6 | ||||
-rw-r--r-- | tests/output.at | 54 | ||||
-rw-r--r-- | tests/regression.at | 2 | ||||
-rw-r--r-- | tests/synclines.at | 4 | ||||
-rw-r--r-- | tests/types.at | 6 |
17 files changed, 184 insertions, 135 deletions
@@ -6,10 +6,11 @@ GNU Bison NEWS ** New features -*** Option -H, --header +*** Option -H, --header and directive %header - The option -H/--header replaces the option --defines (maintained for - backward compatibility). + The option -H/--header supersedes the option --defines, and the directive + %header supersedes %defines. Both --defines and %defines are, of course, + maintained for backward compatibility. *** A C++ native GLR parser diff --git a/data/skeletons/lalr1.java b/data/skeletons/lalr1.java index d749226f..72bef4c5 100644 --- a/data/skeletons/lalr1.java +++ b/data/skeletons/lalr1.java @@ -17,7 +17,7 @@ m4_include(b4_skeletonsdir/[java.m4]) -b4_header_if([b4_complain([%defines does not make sense in Java])]) +b4_header_if([b4_complain([%header/%defines does not make sense in Java])]) m4_define([b4_symbol_no_destructor_assert], [b4_symbol_if([$1], [has_destructor], diff --git a/doc/bison.texi b/doc/bison.texi index c73a28d2..7e4b9aa7 100644 --- a/doc/bison.texi +++ b/doc/bison.texi @@ -5794,6 +5794,22 @@ Define a variable to adjust Bison's behavior. @xref{%define Summary}. @end deffn @deffn {Directive} %defines +@deffnx {Directive} %defines @var{defines-file} +Historical name for @code{%header}. @xref{%header,,@code{%header}}. +@end deffn + +@deffn {Directive} %destructor +Specify how the parser should reclaim the memory associated to +discarded symbols. @xref{Destructor Decl}. +@end deffn + +@deffn {Directive} %file-prefix "@var{prefix}" +Specify a prefix to use for all Bison output file names. The names +are chosen as if the grammar file were named @file{@var{prefix}.y}. +@end deffn + +@anchor{%header} +@deffn {Directive} %header Write a parser header file containing definitions for the token kind names defined in the grammar as well as a few other declarations. If the parser implementation file is named @file{@var{name}.c} then the parser header file @@ -5835,7 +5851,7 @@ preprocessor guard: @samp{YY_@var{PREFIX}_@var{FILE}_INCLUDED}, where generated file name turned uppercase, with each series of non alphanumerical characters converted to a single underscore. -For instance with @samp{%define api.prefix @{calc@}} and @samp{%defines +For instance with @samp{%define api.prefix @{calc@}} and @samp{%header "lib/parse.h"}, the header will be guarded as follows. @example #ifndef YY_CALC_LIB_PARSE_H_INCLUDED @@ -5843,20 +5859,12 @@ For instance with @samp{%define api.prefix @{calc@}} and @samp{%defines ... #endif /* ! YY_CALC_LIB_PARSE_H_INCLUDED */ @end example -@end deffn - -@deffn {Directive} %defines @var{defines-file} -Same as above, but save in the file @file{@var{defines-file}}. -@end deffn -@deffn {Directive} %destructor -Specify how the parser should reclaim the memory associated to -discarded symbols. @xref{Destructor Decl}. +Introduced in Bison 3.8. @end deffn -@deffn {Directive} %file-prefix "@var{prefix}" -Specify a prefix to use for all Bison output file names. The names -are chosen as if the grammar file were named @file{@var{prefix}.y}. +@deffn {Directive} %header @var{header-file} +Same as above, but save in the file @file{@var{header-file}}. @end deffn @deffn {Directive} %language "@var{language}" @@ -6153,7 +6161,7 @@ types are generated. @xref{Exposing the Location Classes}. @table @asis @item @code{none} If locations are enabled, generate the definition of the @code{position} and -@code{location} classes in the header file if @code{%defines}, otherwise in +@code{location} classes in the header file if @code{%header}, otherwise in the parser implementation. @item "@var{file}" @@ -7256,8 +7264,8 @@ You call the function @code{yypstate_new} to create a new parser instance. This function is available if either the @samp{%define api.push-pull push} or @samp{%define api.push-pull both} declaration is used. @xref{Push Decl}. -@deftypefun {yypstate*} yypstate_new (@code{void}) @anchor{yypstate_new} +@deftypefun {yypstate*} yypstate_new (@code{void}) Return a valid parser instance if there is memory available, 0 otherwise. In impure mode, it will also return 0 if a parser instance is currently allocated. @@ -7269,8 +7277,8 @@ function is available if either the @samp{%define api.push-pull push} or @samp{%define api.push-pull both} declaration is used. @xref{Push Decl}. -@deftypefun void yypstate_delete (@code{yypstate *}@var{yyps}) @anchor{yypstate_delete} +@deftypefun void yypstate_delete (@code{yypstate *}@var{yyps}) Reclaim the memory associated with a parser instance. After this call, you should no longer attempt to use the parser instance. @end deftypefun @@ -7280,8 +7288,8 @@ You call the function @code{yypush_parse} to parse a single token. This function is available if either the @samp{%define api.push-pull push} or @samp{%define api.push-pull both} declaration is used. @xref{Push Decl}. -@deftypefun int yypush_parse (@code{yypstate *}@var{yyps}) @anchor{yypush_parse} +@deftypefun int yypush_parse (@code{yypstate *}@var{yyps}) The value returned by @code{yypush_parse} is the same as for @code{yyparse} with the following exception: it returns @code{YYPUSH_MORE} if more input is required to finish parsing the grammar. @@ -7303,8 +7311,8 @@ You call the function @code{yypull_parse} to parse the rest of the input stream. This function is available if the @samp{%define api.push-pull both} declaration is used. @xref{Push Decl}. -@deftypefun int yypull_parse (@code{yypstate *}@var{yyps}) @anchor{yypull_parse} +@deftypefun int yypull_parse (@code{yypstate *}@var{yyps}) The value returned by @code{yypull_parse} is the same as for @code{yyparse}. The parser instance @code{yyps} may be reused for new parses. @@ -11800,12 +11808,12 @@ Options controlling the output. @table @option @item -H [@var{file}] @itemx --header=[@var{file}] -Pretend that @code{%defines} was specified, i.e., write an extra output file +Pretend that @code{%header} was specified, i.e., write an extra output file containing definitions for the token kind names defined in the grammar, as well as a few other declarations. @xref{Decl Summary}. @item --defines[=@var{file}] -Historical name for option @option{--header}. +Historical name for option @option{--header} before Bison 3.8. @item -d This is the same as @option{--header} except @option{-d} does not accept a @@ -12211,7 +12219,7 @@ these two files (@file{@var{file}.hh} and @file{@var{file}.cc}) follow the same rules as with regular C parsers (@pxref{Invocation}). @item location.hh -Generated when both @code{%defines} and @code{%locations} are enabled, this +Generated when both @code{%header} and @code{%locations} are enabled, this file contains the definition of the classes @code{position} and @code{location}, used for location tracking. It is not generated if @samp{%define api.location.file none} is specified, or if user defined @@ -12608,7 +12616,7 @@ Report @var{p} on @var{o}, taking care of special cases such as: no @node Exposing the Location Classes @subsubsection Exposing the Location Classes -When both @code{%defines} and @code{%locations} are enabled, Bison generates +When both @code{%header} and @code{%locations} are enabled, Bison generates an additional file: @file{location.hh}. If you don't use locations outside of the parser, you may avoid its creation with @samp{%define api.location.file none}. @@ -12697,7 +12705,7 @@ definitions for @code{position} and @code{location}. For instance, one parser @file{master/parser.yy} might use: @example -%defines +%header %locations %define api.namespace @{master::@} @end example @@ -13273,7 +13281,7 @@ designed the grammar for. @example %skeleton "lalr1.cc" // -*- C++ -*- %require "@value{VERSION}" -%defines +%header @end example @noindent @@ -13798,7 +13806,7 @@ GLR parsers are currently unsupported in Java. Do not use the @code{glr-parser} directive. No header file can be generated for Java parsers. Do not use the -@code{%defines} directive or the @option{-d}/@option{-H}/@option{--header} +@code{%header} directive or the @option{-d}/@option{-H}/@option{--header} options. @c FIXME: Possible code change. @@ -15221,12 +15229,8 @@ Define a variable to adjust Bison's behavior. @xref{%define Summary}. @end deffn @deffn {Directive} %defines -Bison declaration to create a parser header file, which is usually -meant for the scanner. @xref{Decl Summary}. -@end deffn - -@deffn {Directive} %defines @var{defines-file} -Same as above, but save in the file @var{defines-file}. +@deffnx {Directive} %defines @var{defines-file} +Historical name for @code{%header}. @xref{Decl Summary}. @end deffn @@ -15275,6 +15279,16 @@ Bison declaration to produce a GLR parser. @xref{GLR Parsers}. @end deffn +@deffn {Directive} %header +Bison declaration to create a parser header file, which is usually +meant for the scanner. @xref{Decl Summary}. +@end deffn + +@deffn {Directive} %header @var{header-file} +Same as above, but save in the file @var{header-file}. +@xref{Decl Summary}. +@end deffn + @deffn {Directive} %initial-action Run user code before parsing. @xref{Initial Action Decl}. @end deffn diff --git a/etc/bench.pl.in b/etc/bench.pl.in index 96a92fb6..503ab7b9 100755 --- a/etc/bench.pl.in +++ b/etc/bench.pl.in @@ -581,7 +581,7 @@ sub generate_grammar_list ($$@) or die; print $out <<EOF; %language "C++" -%defines +%header %locations $directives diff --git a/src/parse-gram.y b/src/parse-gram.y index 8c71fffe..73a2ccea 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -96,8 +96,8 @@ string from the scanner (should be CODE). */ static char const *translate_code_braceless (char *code, location loc); - /* Handle a %defines directive. */ - static void handle_defines (char const *value); + /* Handle a %header directive. */ + static void handle_header (char const *value); /* Handle a %error-verbose directive. */ static void handle_error_verbose (location const *loc, char const *directive); @@ -153,7 +153,7 @@ %define parse.error custom %define parse.lac full %define parse.trace -%defines +%header %expect 0 %verbose @@ -188,20 +188,19 @@ PERCENT_CODE "%code" PERCENT_DEFAULT_PREC "%default-prec" PERCENT_DEFINE "%define" - PERCENT_DEFINES "%defines" PERCENT_ERROR_VERBOSE "%error-verbose" PERCENT_EXPECT "%expect" PERCENT_EXPECT_RR "%expect-rr" - PERCENT_FLAG "%<flag>" PERCENT_FILE_PREFIX "%file-prefix" + PERCENT_FLAG "%<flag>" PERCENT_GLR_PARSER "%glr-parser" + PERCENT_HEADER "%header" PERCENT_INITIAL_ACTION "%initial-action" PERCENT_LANGUAGE "%language" PERCENT_NAME_PREFIX "%name-prefix" PERCENT_NO_DEFAULT_PREC "%no-default-prec" PERCENT_NO_LINES "%no-lines" - PERCENT_NONDETERMINISTIC_PARSER - "%nondeterministic-parser" + PERCENT_NONDETERMINISTIC_PARSER "%nondeterministic-parser" PERCENT_OUTPUT "%output" PERCENT_PURE_PARSER "%pure-parser" PERCENT_REQUIRE "%require" @@ -339,8 +338,7 @@ prologue_declaration: muscle_percent_define_insert ($2, @$, $3.kind, $3.chars, MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE); } -| "%defines" { header_flag = true; } -| "%defines" STRING { handle_defines ($2); } +| "%header" string.opt { handle_header ($2); } | "%error-verbose" { handle_error_verbose (&@$, $1); } | "%expect" INT_LITERAL { expected_sr_conflicts = $2; } | "%expect-rr" INT_LITERAL { expected_rr_conflicts = $2; } @@ -485,6 +483,12 @@ precedence_declarator: | "%precedence" { $$ = precedence_assoc; } ; +%type <char*> string.opt; +string.opt: + %empty { $$ = NULL; } +| STRING { $$ = $1; } +; + tag.opt: %empty { $$ = NULL; } | TAG { $$ = $1; } @@ -947,13 +951,16 @@ add_param (param_type type, char *decl, location loc) static void -handle_defines (char const *value) +handle_header (char const *value) { header_flag = true; - char *file = unquote (value); - spec_header_file = xstrdup (file); - gram_scanner_last_string_free (); - unquote_free (file); + if (value) + { + char *file = unquote (value); + spec_header_file = xstrdup (file); + gram_scanner_last_string_free (); + unquote_free (file); + } } diff --git a/src/scan-gram.l b/src/scan-gram.l index e10d68e2..aabdc5f5 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -245,15 +245,16 @@ eqopt ({sp}=)? "%debug" RETURN_PERCENT_FLAG ("parse.trace"); "%default-prec" return BISON_DIRECTIVE (DEFAULT_PREC); "%define" return BISON_DIRECTIVE (DEFINE); - "%defines" return BISON_DIRECTIVE (DEFINES); + "%defines" return BISON_DIRECTIVE (HEADER); // Deprecated in 3.8. "%destructor" return BISON_DIRECTIVE (DESTRUCTOR); "%dprec" return BISON_DIRECTIVE (DPREC); "%empty" return BISON_DIRECTIVE (EMPTY); "%expect" return BISON_DIRECTIVE (EXPECT); "%expect-rr" return BISON_DIRECTIVE (EXPECT_RR); "%file-prefix" RETURN_VALUE (PERCENT_FILE_PREFIX, uniqstr_new (yytext)); - "%initial-action" return BISON_DIRECTIVE (INITIAL_ACTION); "%glr-parser" return BISON_DIRECTIVE (GLR_PARSER); + "%header" return BISON_DIRECTIVE (HEADER); + "%initial-action" return BISON_DIRECTIVE (INITIAL_ACTION); "%language" return BISON_DIRECTIVE (LANGUAGE); "%left" return PERCENT_LEFT; "%lex-param" RETURN_PERCENT_PARAM (lex); diff --git a/tests/actions.at b/tests/actions.at index 9392da63..3978ae8f 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -1050,14 +1050,14 @@ AT_CHECK_PRINTER_AND_DESTRUCTOR([], [ with union]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [ with union]) -AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"]) -AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [ with union]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "lalr1.cc"]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "lalr1.cc"], [ with union]) -AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "glr.cc"]) -AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "glr.cc"], [ with union]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "glr.cc"]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "glr.cc"], [ with union]) -AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "glr2.cc"]) -AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "glr2.cc"], [ with union]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "glr2.cc"]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%header %skeleton "glr2.cc"], [ with union]) diff --git a/tests/c++.at b/tests/c++.at index a5fc7d93..2a3a8ca2 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -593,7 +593,7 @@ AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc"]) AT_DATA_GRAMMAR([[input.y]], [[%skeleton "lalr1.cc" -%defines +%header %debug %define parse.assert @@ -727,7 +727,7 @@ AT_DATA([input.yy], [[%require "3.2" %skeleton "lalr1.cc" %locations -%defines +%header %debug %% exp: %empty; @@ -964,7 +964,7 @@ AT_BISON_OPTION_PUSHDEFS([$1 %debug]) AT_DATA_GRAMMAR([[input.yy]], [[$1 -%defines +%header %code { @@ -1453,7 +1453,7 @@ AT_BISON_OPTION_POPDEFS mkdir -p include/ast AT_TEST([x1], - [%defines + [%header %locations %define api.location.file "include/ast/loc.hh" %define api.location.include {<ast/loc.hh>}]) @@ -1468,7 +1468,7 @@ AT_CHECK([sed -ne '/INCLUDED/p;/\\file/{p;n;p;}' include/ast/loc.hh], [], ]]) AT_TEST([x2], - [%defines + [%header %locations %code requires {#include <ast/loc.hh>} %define api.location.type {x1::location}]) diff --git a/tests/calc.at b/tests/calc.at index b95b4845..c3557aa6 100644 --- a/tests/calc.at +++ b/tests/calc.at @@ -422,14 +422,14 @@ m4_define([AT_CALC_YYLEX(java)], # _AT_DATA_CALC_Y($1, $2, $3, [BISON-DIRECTIVES]) # ----------------------------------------------- -# Produce 'calc.y' and, if %defines was specified, 'calc-lex.c' or +# Produce 'calc.y' and, if %header was specified, 'calc-lex.c' or # 'calc-lex.cc'. # # Don't call this macro directly, because it contains some occurrences # of '$1' etc. which will be interpreted by m4. So you should call it # with $1, $2, and $3 as arguments, which is what AT_DATA_CALC_Y does. # -# When %defines is not passed, generate a single self-contained file. +# When %header is not passed, generate a single self-contained file. # Otherwise, generate three: calc.y with the parser, calc-lex.c with # the scanner, and calc-main.c with "main()". This is in order to # stress the use of the generated parser header. To avoid code @@ -647,11 +647,11 @@ location_print (FILE *o, Span s) } ]])])[ ]AT_YYERROR_DEFINE[ -]AT_DEFINES_IF([], +]AT_HEADER_IF([], [AT_CALC_YYLEX AT_CALC_MAIN])]) -AT_DEFINES_IF([AT_DATA_SOURCE([[calc-lex.]AT_LANG_EXT], +AT_HEADER_IF([AT_DATA_SOURCE([[calc-lex.]AT_LANG_EXT], [[#include "calc.]AT_LANG_HDR[" ]AT_CALC_YYLEX]) @@ -752,7 +752,7 @@ exp: # AT_DATA_CALC_Y([BISON-OPTIONS]) # ------------------------------- -# Produce 'calc.y' and, if %defines was specified, 'calc-lex.c' or +# Produce 'calc.y' and, if %header was specified, 'calc-lex.c' or # 'calc-lex.cc'. m4_define([AT_DATA_CALC_Y], [_AT_DATA_CALC_Y($[1], $[2], $[3], [$1]) @@ -914,7 +914,7 @@ AT_SETUP([Calculator $1 $2]) AT_BISON_OPTION_PUSHDEFS([$1]) AT_DATA_CALC_Y([$1]) -AT_FULL_COMPILE(AT_JAVA_IF([[Calc]], [[calc]]), AT_DEFINES_IF([[lex], [main]], [[], []]), [$2], [-Wno-deprecated]) +AT_FULL_COMPILE(AT_JAVA_IF([[Calc]], [[calc]]), AT_HEADER_IF([[lex], [main]], [[], []]), [$2], [-Wno-deprecated]) AT_YACC_IF( [# No direct calls to malloc/free. @@ -926,7 +926,7 @@ AT_PUSH_IF([AT_JAVA_IF( AT_CHECK_JAVA_GREP([[Calc.java]], [[.*public void push_parse_initialize ().*]])])]) -AT_CHECK_SPACES([AT_JAVA_IF([Calc], [calc]).AT_LANG_EXT AT_DEFINES_IF([AT_JAVA_IF([Calc], [calc]).AT_LANG_HDR])]) +AT_CHECK_SPACES([AT_JAVA_IF([Calc], [calc]).AT_LANG_EXT AT_HEADER_IF([AT_JAVA_IF([Calc], [calc]).AT_LANG_HDR])]) # Test the precedences. # The Java traces do not show the clean up sequence at the end, @@ -1081,7 +1081,7 @@ m4_define([AT_CHECK_CALC_LALR], AT_CHECK_CALC_LALR([%define parse.trace]) -AT_CHECK_CALC_LALR([%defines]) +AT_CHECK_CALC_LALR([%header]) AT_CHECK_CALC_LALR([%debug %locations]) AT_CHECK_CALC_LALR([%locations %define api.location.type {Span}]) @@ -1095,19 +1095,20 @@ AT_CHECK_CALC_LALR([%define api.pure full %locations]) AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure full %locations]) AT_CHECK_CALC_LALR([%define parse.error detailed %locations]) -AT_CHECK_CALC_LALR([%define parse.error detailed %locations %defines %define api.prefix {calc} %verbose %yacc]) -AT_CHECK_CALC_LALR([%define parse.error detailed %locations %defines %name-prefix "calc" %define api.token.prefix {TOK_} %verbose %yacc]) +AT_CHECK_CALC_LALR([%define parse.error detailed %locations %header %define api.prefix {calc} %verbose %yacc]) +AT_CHECK_CALC_LALR([%define parse.error detailed %locations %header %name-prefix "calc" %define api.token.prefix {TOK_} %verbose %yacc]) AT_CHECK_CALC_LALR([%debug]) -AT_CHECK_CALC_LALR([%define parse.error detailed %debug %locations %defines %name-prefix "calc" %verbose %yacc]) -AT_CHECK_CALC_LALR([%define parse.error detailed %debug %locations %defines %define api.prefix {calc} %verbose %yacc]) +AT_CHECK_CALC_LALR([%define parse.error detailed %debug %locations %header %name-prefix "calc" %verbose %yacc]) +AT_CHECK_CALC_LALR([%define parse.error detailed %debug %locations %header %define api.prefix {calc} %verbose %yacc]) -AT_CHECK_CALC_LALR([%define api.pure full %define parse.error detailed %debug %locations %defines %name-prefix "calc" %verbose %yacc]) -AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure full %define parse.error detailed %debug %locations %defines %define api.prefix {calc} %verbose %yacc]) +AT_CHECK_CALC_LALR([%define api.pure full %define parse.error detailed %debug %locations %header %name-prefix "calc" %verbose %yacc]) +AT_CHECK_CALC_LALR([%define api.push-pull both %define api.pure full %define parse.error detailed %debug %locations %header %define api.prefix {calc} %verbose %yacc]) -AT_CHECK_CALC_LALR([%define api.pure %define parse.error detailed %debug %locations %defines %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_LALR([%define api.pure %define parse.error detailed %debug %locations %header %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}]) -AT_CHECK_CALC_LALR([%no-lines %define api.pure %define parse.error detailed %debug %locations %defines %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_LALR([%no-lines %define api.pure %define parse.error detailed %debug %locations %header %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_LALR([%no-lines %define api.pure %define parse.error verbose %debug %locations %header %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}]) AT_CHECK_CALC_LALR([%no-lines %define api.pure %define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %yacc %parse-param {semantic_value *result}{int *count}{int *nerrs}]) @@ -1128,7 +1129,7 @@ m4_define([AT_CHECK_CALC_GLR], AT_CHECK_CALC_GLR() -AT_CHECK_CALC_GLR([%defines]) +AT_CHECK_CALC_GLR([%header]) AT_CHECK_CALC_GLR([%locations]) AT_CHECK_CALC_GLR([%locations %define api.location.type {Span}]) AT_CHECK_CALC_GLR([%name-prefix "calc"]) @@ -1139,20 +1140,20 @@ AT_CHECK_CALC_GLR([%define parse.error verbose]) AT_CHECK_CALC_GLR([%define api.pure %locations]) AT_CHECK_CALC_GLR([%define parse.error verbose %locations]) -AT_CHECK_CALC_GLR([%define parse.error custom %locations %defines %name-prefix "calc" %verbose]) -AT_CHECK_CALC_GLR([%define parse.error detailed %locations %defines %name-prefix "calc" %verbose]) -AT_CHECK_CALC_GLR([%define parse.error verbose %locations %defines %name-prefix "calc" %verbose]) +AT_CHECK_CALC_GLR([%define parse.error custom %locations %header %name-prefix "calc" %verbose]) +AT_CHECK_CALC_GLR([%define parse.error detailed %locations %header %name-prefix "calc" %verbose]) +AT_CHECK_CALC_GLR([%define parse.error verbose %locations %header %name-prefix "calc" %verbose]) AT_CHECK_CALC_GLR([%debug]) -AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose]) -AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %defines %define api.prefix {calc} %define api.token.prefix {TOK_} %verbose]) +AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %header %name-prefix "calc" %verbose]) +AT_CHECK_CALC_GLR([%define parse.error verbose %debug %locations %header %define api.prefix {calc} %define api.token.prefix {TOK_} %verbose]) -AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose]) +AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %header %name-prefix "calc" %verbose]) -AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %defines %name-prefix "calc" %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) -AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %header %name-prefix "calc" %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_GLR([%define api.pure %define parse.error verbose %debug %locations %header %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) -AT_CHECK_CALC_GLR([%no-lines %define api.pure %define parse.error verbose %debug %locations %defines %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_GLR([%no-lines %define api.pure %define parse.error verbose %debug %locations %header %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) # ---------------------- # @@ -1162,7 +1163,7 @@ AT_CHECK_CALC_GLR([%no-lines %define api.pure %define parse.error verbose %debug AT_BANNER([[LALR(1) C++ Calculator.]]) # First let's try using %skeleton -AT_CHECK_CALC([%skeleton "lalr1.cc" %defines]) +AT_CHECK_CALC([%skeleton "lalr1.cc" %header]) m4_define([AT_CHECK_CALC_LALR1_CC], [AT_CHECK_CALC([%language "C++" $1], [$2])]) @@ -1171,7 +1172,7 @@ AT_CHECK_CALC_LALR1_CC([]) AT_CHECK_CALC_LALR1_CC([%locations]) AT_CHECK_CALC_LALR1_CC([%locations], [$NO_EXCEPTIONS_CXXFLAGS]) AT_CHECK_CALC_LALR1_CC([%locations %define api.location.type {Span}]) -AT_CHECK_CALC_LALR1_CC([%defines %locations %define parse.error verbose %name-prefix "calc" %verbose]) +AT_CHECK_CALC_LALR1_CC([%header %locations %define parse.error verbose %name-prefix "calc" %verbose]) AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %define api.prefix {calc} %verbose]) AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %name-prefix "calc" %verbose]) @@ -1179,15 +1180,15 @@ AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %name-pref AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %define api.prefix {calc} %verbose]) AT_CHECK_CALC_LALR1_CC([%locations %define parse.error verbose %debug %define api.prefix {calc} %define api.token.prefix {TOK_} %verbose]) -AT_CHECK_CALC_LALR1_CC([%defines %locations %define parse.error verbose %debug %name-prefix "calc" %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_LALR1_CC([%header %locations %define parse.error verbose %debug %name-prefix "calc" %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) AT_CHECK_CALC_LALR1_CC([%define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) -AT_CHECK_CALC_LALR1_CC([%defines %locations %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_LALR1_CC([%header %locations %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) -AT_CHECK_CALC_LALR1_CC([%defines %locations %define api.location.file none]) -AT_CHECK_CALC_LALR1_CC([%defines %locations %define api.location.file "my-location.hh"]) +AT_CHECK_CALC_LALR1_CC([%header %locations %define api.location.file none]) +AT_CHECK_CALC_LALR1_CC([%header %locations %define api.location.file "my-location.hh"]) -AT_CHECK_CALC_LALR1_CC([%no-lines %defines %locations %define api.location.file "my-location.hh"]) +AT_CHECK_CALC_LALR1_CC([%no-lines %header %locations %define api.location.file "my-location.hh"]) AT_CHECK_CALC_LALR1_CC([%locations %define parse.lac full %define parse.error verbose]) AT_CHECK_CALC_LALR1_CC([%locations %define parse.lac full %define parse.error detailed]) @@ -1212,7 +1213,7 @@ m4_define([AT_CHECK_CALC_GLR_CC], AT_CHECK_CALC_GLR_CC([]) AT_CHECK_CALC_GLR_CC([%locations]) AT_CHECK_CALC_GLR_CC([%locations %define api.location.type {Span}]) -AT_CHECK_CALC_GLR_CC([%defines %define parse.error verbose %name-prefix "calc" %verbose]) +AT_CHECK_CALC_GLR_CC([%header %define parse.error verbose %name-prefix "calc" %verbose]) AT_CHECK_CALC_GLR_CC([%define parse.error verbose %define api.prefix {calc} %verbose]) AT_CHECK_CALC_GLR_CC([%debug]) @@ -1220,10 +1221,10 @@ AT_CHECK_CALC_GLR_CC([%debug]) AT_CHECK_CALC_GLR_CC([%define parse.error verbose %debug %name-prefix "calc" %verbose]) AT_CHECK_CALC_GLR_CC([%define parse.error verbose %debug %name-prefix "calc" %define api.token.prefix {TOK_} %verbose]) -AT_CHECK_CALC_GLR_CC([%locations %defines %define parse.error verbose %debug %name-prefix "calc" %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) -AT_CHECK_CALC_GLR_CC([%locations %defines %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_GLR_CC([%locations %header %define parse.error verbose %debug %name-prefix "calc" %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_GLR_CC([%locations %header %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) -AT_CHECK_CALC_GLR_CC([%no-lines %locations %defines %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) +AT_CHECK_CALC_GLR_CC([%no-lines %locations %header %define parse.error verbose %debug %define api.prefix {calc} %verbose %parse-param {semantic_value *result}{int *count}{int *nerrs}]) # -------------------- # diff --git a/tests/conflicts.at b/tests/conflicts.at index de0a993e..9c1c5814 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -405,7 +405,7 @@ m4_pushdef([AT_CONSISTENT_ERRORS_CHECK], [ AT_SETUP([[parse.error=verbose and consistent errors: ]$1]) -AT_BISON_OPTION_PUSHDEFS([$1 AT_CXX_IF([[%defines]], [[%define api.pure]])]) +AT_BISON_OPTION_PUSHDEFS([$1 AT_CXX_IF([[%header]], [[%define api.pure]])]) AT_DATA_GRAMMAR([input.y], [AT_JAVA_IF([[ @@ -421,7 +421,7 @@ AT_DATA_GRAMMAR([input.y], #define USE(Var) } -]AT_CXX_IF([[%defines]], [[%define api.pure]])])[ +]AT_CXX_IF([[%header]], [[%define api.pure]])])[ ]AT_YACC_IF([[ %code { diff --git a/tests/input.at b/tests/input.at index 9d9f6a28..f5cd9c10 100644 --- a/tests/input.at +++ b/tests/input.at @@ -2361,7 +2361,7 @@ m4_define([AT_CHECK_NAMESPACE_ERROR], [ AT_DATA([[input.y]], [[%language "C++" -%defines +%header %define api.namespace {]$1[} %% start: %empty; @@ -2908,6 +2908,7 @@ AT_DATA_GRAMMAR([[input.y]], %error-verbose %glr-parser %name-prefix "bar" +%defines "header.h" %% exp : '0' ]]) @@ -2991,6 +2992,7 @@ AT_CHECK([sed -e '1,8d' input.y], [], %define api.pure %token-table %glr-parser +%defines "header.h" %% exp : '0' ]]) diff --git a/tests/java.at b/tests/java.at index 57472446..629dc811 100644 --- a/tests/java.at +++ b/tests/java.at @@ -26,6 +26,21 @@ AT_SETUP([Java invalid directives]) AT_DATA([[YYParser.y]], [ %language "Java" +%header +%destructor { /* Nothing. */ } exp +%% +exp: +]) + +AT_BISON_CHECK([[-fcaret YYParser.y]], [1], [], +[[YYParser.y: error: %header/%defines does not make sense in Java +YYParser.y:4.13-30: error: %destructor does not make sense in Java + 4 | %destructor { /* Nothing. */ } exp + | ^~~~~~~~~~~~~~~~~~ +]]) + +AT_DATA([[YYParser.y]], [ +%language "Java" %defines %destructor { /* Nothing. */ } exp %% @@ -33,7 +48,7 @@ exp: ]) AT_BISON_CHECK([[-fcaret YYParser.y]], [1], [], -[[YYParser.y: error: %defines does not make sense in Java +[[YYParser.y: error: %header/%defines does not make sense in Java YYParser.y:4.13-30: error: %destructor does not make sense in Java 4 | %destructor { /* Nothing. */ } exp | ^~~~~~~~~~~~~~~~~~ diff --git a/tests/local.at b/tests/local.at index 83949f24..362b28cc 100644 --- a/tests/local.at +++ b/tests/local.at @@ -210,8 +210,8 @@ m4_if([$1$2], $[1]$[2], [], [m4_fatal([$0: invalid arguments: $@])])dnl m4_pushdef([AT_AUTOMOVE_IF], [m4_bmatch([$3], [%define api\.value\.automove], [$1], [$2])]) -m4_pushdef([AT_DEFINES_IF], -[m4_bmatch([$3], [%defines], [$1], [$2])]) +m4_pushdef([AT_HEADER_IF], +[m4_bmatch([$3], [%defines\|%header], [$1], [$2])]) m4_pushdef([AT_DEBUG_IF], [m4_bmatch([$3], [%debug\|%define parse.trace], [$1], [$2])]) m4_pushdef([AT_ERROR_CUSTOM_IF], @@ -442,7 +442,7 @@ m4_popdef([AT_ERROR_VERBOSE_IF]) m4_popdef([AT_ERROR_DETAILED_IF]) m4_popdef([AT_ERROR_CUSTOM_IF]) m4_popdef([AT_DEBUG_IF]) -m4_popdef([AT_DEFINES_IF]) +m4_popdef([AT_HEADER_IF]) m4_popdef([AT_AUTOMOVE_IF]) AT_LOC_POPDEF])dnl ])# AT_BISON_OPTION_POPDEFS diff --git a/tests/output.at b/tests/output.at index 2ef33354..a13aaf81 100644 --- a/tests/output.at +++ b/tests/output.at @@ -106,30 +106,30 @@ AT_CHECK_OUTPUT([foo.y], [], [-dv -g -o foo.c], [foo.c foo.dot foo.h foo.output]) -AT_CHECK_OUTPUT([foo.y], [%defines %verbose], [], +AT_CHECK_OUTPUT([foo.y], [%header %verbose], [], [foo.output foo.tab.c foo.tab.h]) -AT_CHECK_OUTPUT([foo.y], [%defines %verbose %yacc],[], +AT_CHECK_OUTPUT([foo.y], [%header %verbose %yacc],[], [y.output y.tab.c y.tab.h]) -AT_CHECK_OUTPUT([foo.yy], [%defines %verbose %yacc],[], +AT_CHECK_OUTPUT([foo.yy], [%header %verbose %yacc],[], [y.output y.tab.c y.tab.h]) # Exercise %output and %file-prefix including deprecated '=' -AT_CHECK_OUTPUT([foo.y], [%file-prefix "bar" %defines %verbose], [], +AT_CHECK_OUTPUT([foo.y], [%file-prefix "bar" %header %verbose], [], [bar.output bar.tab.c bar.tab.h]) -AT_CHECK_OUTPUT([foo.y], [%output "bar.c" %defines %verbose %yacc],[], +AT_CHECK_OUTPUT([foo.y], [%output "bar.c" %header %verbose %yacc],[], [bar.c bar.h bar.output]) AT_CHECK_OUTPUT([foo.y], - [%file-prefix "baz" %output "bar.c" %defines %verbose %yacc], + [%file-prefix "baz" %output "bar.c" %header %verbose %yacc], [], [bar.c bar.h bar.output]) # Check priorities of extension control. -AT_CHECK_OUTPUT([foo.yy], [%defines %verbose], [], +AT_CHECK_OUTPUT([foo.yy], [%header %verbose], [], [foo.output foo.tab.cc foo.tab.hh]) -AT_CHECK_OUTPUT([foo.yy], [%defines %verbose ], [-o foo.c], +AT_CHECK_OUTPUT([foo.yy], [%header %verbose ], [-o foo.c], [foo.c foo.h foo.output]) AT_CHECK_OUTPUT([foo.yy], [], @@ -137,10 +137,10 @@ AT_CHECK_OUTPUT([foo.yy], [], [foo.c++ foo.hpp]) AT_CHECK_OUTPUT([foo.yy], [], - [--defines=foo.hpp -o foo.c++], + [--header=foo.hpp -o foo.c++], [foo.c++ foo.hpp]) -AT_CHECK_OUTPUT([foo.yy], [%defines "foo.hpp"], +AT_CHECK_OUTPUT([foo.yy], [%header "foo.hpp"], [-o foo.c++], [foo.c++ foo.hpp]) @@ -162,6 +162,14 @@ AT_CHECK_OUTPUT([foo.y], [%define useless], [foo.dot foo.output foo.xml], [1]) +# %header was spelled %defines before. +AT_CHECK_OUTPUT([foo.yy], [%defines], + [-o foo.c++], + [foo.c++ foo.h++]) +AT_CHECK_OUTPUT([foo.yy], [%defines "foo.hpp"], + [-o foo.c++], + [foo.c++ foo.hpp]) + ## ------------ ## ## C++ output. ## @@ -179,48 +187,48 @@ AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc"], [], AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose], [], [foo.output foo.tab.cc]) -AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [], +AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %header %verbose], [], [foo.output foo.tab.cc foo.tab.hh stack.hh]) AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %verbose %locations], [], [foo.output foo.tab.cc]) -AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations], [], +AT_CHECK_OUTPUT([foo.yy], [%skeleton "lalr1.cc" %header %verbose %locations], [], [foo.output foo.tab.cc foo.tab.hh location.hh position.hh stack.hh]) -AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose], [], +AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %header %verbose], [], [foo.output foo.tab.cc foo.tab.hh stack.hh], [], [AT_CHECK_NO_SUBDIR_PART([foo.tab])]) -AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %defines %verbose %locations], +AT_CHECK_OUTPUT([subdir/foo.yy], [%skeleton "lalr1.cc" %header %verbose %locations], [-o subdir/foo.cc], [subdir/foo.cc subdir/foo.hh subdir/foo.output subdir/location.hh subdir/position.hh subdir/stack.hh], [], [AT_CHECK_NO_SUBDIR_PART([subdir/foo])]) AT_CHECK_OUTPUT([gram_dir/foo.yy], - [%skeleton "lalr1.cc" %defines %verbose %file-prefix "output_dir/foo"], + [%skeleton "lalr1.cc" %header %verbose %file-prefix "output_dir/foo"], [], [output_dir/foo.output output_dir/foo.tab.cc output_dir/foo.tab.hh output_dir/stack.hh]) AT_CHECK_OUTPUT([gram_dir/foo.yy], - [%skeleton "lalr1.cc" %defines %locations %verbose %file-prefix "output_dir/foo"], + [%skeleton "lalr1.cc" %header %locations %verbose %file-prefix "output_dir/foo"], [], [output_dir/foo.output output_dir/foo.tab.cc output_dir/foo.tab.hh output_dir/location.hh output_dir/position.hh output_dir/stack.hh]) # %require "3.2" => no position.hh not stack.hh. AT_CHECK_OUTPUT([foo.yy], - [%skeleton "lalr1.cc" %defines %locations %define api.location.file none %require "3.2"], + [%skeleton "lalr1.cc" %header %locations %define api.location.file none %require "3.2"], [], [foo.tab.cc foo.tab.hh]) AT_CHECK_OUTPUT([foo.yy], - [%skeleton "lalr1.cc" %defines %locations %define api.location.file "foo.loc.hh" %require "3.2"], + [%skeleton "lalr1.cc" %header %locations %define api.location.file "foo.loc.hh" %require "3.2"], [], [foo.loc.hh foo.tab.cc foo.tab.hh]) # Absolute paths. AT_CHECK_OUTPUT([foo.yy], - [%skeleton "lalr1.cc" %defines %locations %define api.location.file "$at_dir/foo.loc.hh" %require "3.2"], + [%skeleton "lalr1.cc" %header %locations %define api.location.file "$at_dir/foo.loc.hh" %require "3.2"], [], [foo.loc.hh foo.tab.cc foo.tab.hh]) @@ -255,12 +263,12 @@ AT_CHECK_CONFLICTING_OUTPUT([foo.y], ]]) AT_CHECK_CONFLICTING_OUTPUT([foo.y], -[%defines "foo.output"], [-v], +[%header "foo.output"], [-v], [[foo.y: warning: conflicting outputs to file 'foo.output' [-Wother] ]]) AT_CHECK_CONFLICTING_OUTPUT([foo.y], -[%skeleton "lalr1.cc" %defines %locations], [--graph="location.hh"], +[%skeleton "lalr1.cc" %header %locations], [--graph="location.hh"], [[foo.y: warning: conflicting outputs to file 'location.hh' [-Wother] ]]) @@ -757,7 +765,7 @@ AT_BISON_OPTION_POPDEFS mkdir -p out/include/ast AT_TEST([x1], - [%defines + [%header %locations %define api.location.file "include/ast/loc.hh" ]) @@ -788,7 +796,7 @@ AT_CHECK([[sed -ne 's/^#line [0-9][0-9]* "/#line "/p;/INCLUDED/p;/\\file/{p;n;p; ]]) AT_TEST([x2], - [%defines + [%header %locations %code requires {#include "include/ast/loc.hh"} %define api.location.type {x1::location}]) diff --git a/tests/regression.at b/tests/regression.at index 9e288b61..293e8536 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -1505,7 +1505,7 @@ m4_pushdef([AT_TEST], AT_BISON_OPTION_PUSHDEFS([%locations %skeleton "$1" %parse-param { int x } %parse-param { int y }]) AT_DATA_GRAMMAR([input.y], -[[%defines +[[%header %locations %skeleton "$1" %union { int ival; } diff --git a/tests/synclines.at b/tests/synclines.at index b2cfac5c..e3401025 100644 --- a/tests/synclines.at +++ b/tests/synclines.at @@ -452,9 +452,9 @@ m4_popdef([AT_TEST]) m4_pushdef([AT_TEST], [AT_SETUP([%no-lines: $1]) -AT_BISON_OPTION_PUSHDEFS([%skeleton "$1" %defines]) +AT_BISON_OPTION_PUSHDEFS([%skeleton "$1" %header]) AT_DATA_GRAMMAR([input.y], -[[%skeleton "$1" %defines +[[%skeleton "$1" %header %{ ]AT_YYERROR_DECLARE_EXTERN[ ]AT_YYLEX_DECLARE_EXTERN[ diff --git a/tests/types.at b/tests/types.at index 00f48a33..e35b0d40 100644 --- a/tests/types.at +++ b/tests/types.at @@ -123,7 +123,7 @@ AT_CLEANUP # $6: RESULT, # $7: REQUIREMENT) # -------------------------------------- -# Check with and without %defines, to avoid regressions. It turns out +# Check with and without %header, to avoid regressions. It turns out # that in that case yacc.c calls the set-up of the %union twice, # because YYSTYPE is defined once in the header, and once in the # implementation file (eventually it'd be better to include the header @@ -131,8 +131,8 @@ AT_CLEANUP # a second time doubled the side-effects and resulted in a double # definition of the union members. m4_pushdef([AT_TEST], -[_AT_TEST([$1], [$2], [$3], [$4], [$5], [$6], [$7]) - _AT_TEST([$1 %defines], [$2], [$3], [$4], [$5], [$6], [$7]) +[_AT_TEST([$1], [$2], [$3], [$4], [$5], [$6], [$7]) + _AT_TEST([$1 %header], [$2], [$3], [$4], [$5], [$6], [$7]) ]) m4_foreach([b4_skel], [[yacc.c], [glr.c], [lalr1.cc], [glr.cc], [glr2.cc]], |