From 12e3584054c16ab255672c07af0ffc7bb220e8bc Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Sat, 21 Oct 2006 10:03:35 +0000 Subject: [PATCH] Split the default %destructor/%printer into two kinds: <*> and . Discussed starting at . * NEWS (2.3a+): Mention. * doc/bison.texinfo (Freeing Discarded Symbols): Document this and the previous change today related to mid-rules. (Bison Symbols): Remove %symbol-default and add <*> and . * src/parser-gram.y (PERCENT_SYMBOL_DEFAULT): Remove. (TYPE_TAG_ANY): Add as <*>. (TYPE_TAG_NONE): Add as . (generic_symlist_item): Remove RHS for %symbol-default and add RHS's for <*> and . * src/scan-gram.l (PERCENT_SYMBOL_DEFAULT): Remove. (TYPE_TAG_ANY, TYPE_TAG_NONE): Add. * src/symlist.c (symbol_list_default_new): Split into tagged and tagless versions. (symbol_list_destructor_set, symbol_list_printer_set): Split SYMLIST_DEFAULT case into SYMLIST_DEFAULT_TAGGED and SYMLIST_DEFAULT_TAGLESS. * src/symlist.h: Update symbol_list_default*_new prototypes. (symbol_list.content_type): Split enum value SYMLIST_DEFAULT into SYMLIST_DEFAULT_TAGGED and SYMLIST_DEFAULT_TAGLESS. * src/symtab.c (default_destructor, default_destructor_location, default_printer, default_printer_location): Split each into tagged and tagless versions. (symbol_destructor_get, symbol_destructor_location_get, symbol_printer_get, symbol_printer_location_get): Implement tagged default and tagless default cases. (default_destructor_set, default_printer_set): Split each into tagged and tagless versions. * src/symtab.h: Update prototypes. * tests/actions.at (Default %printer and %destructor): Rename to... (Default tagless %printer and %destructor): ... this, and extend. (Per-type %printer and %destructor): Rename to... (Default tagged and per-type %printer and %destructor): ... this, and extend. (Default %printer and %destructor for user-defined end token): Extend. (Default %printer and %destructor are not for error or $undefined): Update. (Default %printer and %destructor are not for $accept): Update. (Default %printer and %destructor for mid-rule values): Extend. * tests/input.at (Default %printer and %destructor redeclared): Extend. (Unused values with default %destructor): Extend. --- ChangeLog | 46 ++++ NEWS | 19 ++ doc/bison.texinfo | 89 +++--- src/parse-gram.c | 671 +++++++++++++++++++++++----------------------- src/parse-gram.h | 200 +++++++------- src/parse-gram.y | 7 +- src/scan-gram.l | 3 +- src/symlist.c | 41 ++- src/symlist.h | 15 +- src/symtab.c | 95 +++++-- src/symtab.h | 22 +- tests/actions.at | 175 +++++++----- tests/input.at | 75 ++++-- 13 files changed, 863 insertions(+), 595 deletions(-) diff --git a/ChangeLog b/ChangeLog index 670ae554..18ce38b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,49 @@ +2006-10-21 Joel E. Denny + + Split the default %destructor/%printer into two kinds: <*> and . + Discussed starting at + . + * NEWS (2.3a+): Mention. + * doc/bison.texinfo (Freeing Discarded Symbols): Document this and the + previous change today related to mid-rules. + (Bison Symbols): Remove %symbol-default and add <*> and . + * src/parser-gram.y (PERCENT_SYMBOL_DEFAULT): Remove. + (TYPE_TAG_ANY): Add as <*>. + (TYPE_TAG_NONE): Add as . + (generic_symlist_item): Remove RHS for %symbol-default and add RHS's + for <*> and . + * src/scan-gram.l (PERCENT_SYMBOL_DEFAULT): Remove. + (TYPE_TAG_ANY, TYPE_TAG_NONE): Add. + * src/symlist.c (symbol_list_default_new): Split into tagged and + tagless versions. + (symbol_list_destructor_set, symbol_list_printer_set): Split + SYMLIST_DEFAULT case into SYMLIST_DEFAULT_TAGGED and + SYMLIST_DEFAULT_TAGLESS. + * src/symlist.h: Update symbol_list_default*_new prototypes. + (symbol_list.content_type): Split enum value SYMLIST_DEFAULT into + SYMLIST_DEFAULT_TAGGED and SYMLIST_DEFAULT_TAGLESS. + * src/symtab.c (default_destructor, default_destructor_location, + default_printer, default_printer_location): Split each into tagged and + tagless versions. + (symbol_destructor_get, symbol_destructor_location_get, + symbol_printer_get, symbol_printer_location_get): Implement tagged + default and tagless default cases. + (default_destructor_set, default_printer_set): Split each into tagged + and tagless versions. + * src/symtab.h: Update prototypes. + * tests/actions.at (Default %printer and %destructor): Rename to... + (Default tagless %printer and %destructor): ... this, and extend. + (Per-type %printer and %destructor): Rename to... + (Default tagged and per-type %printer and %destructor): ... this, and + extend. + (Default %printer and %destructor for user-defined end token): Extend. + (Default %printer and %destructor are not for error or $undefined): + Update. + (Default %printer and %destructor are not for $accept): Update. + (Default %printer and %destructor for mid-rule values): Extend. + * tests/input.at (Default %printer and %destructor redeclared): Extend. + (Unused values with default %destructor): Extend. + 2006-10-21 Joel E. Denny Don't apply the default %destructor/%printer to an unreferenced midrule diff --git a/NEWS b/NEWS index 75e0284f..c3fe6d03 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,25 @@ Changes in version 2.3a+ (????-??-??): * The -g and --graph options now output graphs in Graphviz DOT format, not VCG format. +* Bison now recognizes two separate kinds of default %destructor's and + %printer's: + + 1. Place `<*>' in a %destructor/%printer symbol list to define a default + %destructor/%printer for all grammar symbols for which you have formally + declared semantic type tags. + + 2. Place `' in a %destructor/%printer symbol list to define a default + %destructor/%printer for all grammar symbols without declared semantic + type tags. + + Bison no longer supports the `%symbol-default' notation from Bison 2.3a. + `<*>' and `' combined achieve the same effect with one exception: Bison no + longer applies any %destructor to a mid-rule value if that mid-rule value is + not actually ever referenced using either $$ or $n in a semantic action. + + See the section `Freeing Discarded Symbols' in the Bison manual for further + details. + * The Yacc prologue alternatives from Bison 2.3a have been rewritten as the following directives: diff --git a/doc/bison.texinfo b/doc/bison.texinfo index f08cc66e..8c382520 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -4236,8 +4236,8 @@ For instance, if your locations use a file name, you may use @subsection Freeing Discarded Symbols @cindex freeing discarded symbols @findex %destructor -@findex %symbol-default - +@findex <*> +@findex During error recovery (@pxref{Error Recovery}), symbols already pushed on the stack and tokens coming from the rest of the file are discarded until the parser falls on its feet. If the parser runs out of memory, @@ -4265,21 +4265,26 @@ The Parser Function @code{yyparse}}). When a symbol is listed among @var{symbols}, its @code{%destructor} is called a per-symbol @code{%destructor}. You may also define a per-type @code{%destructor} by listing a semantic type -among @var{symbols}. +tag among @var{symbols}. In that case, the parser will invoke this @var{code} whenever it discards any -grammar symbol that has that semantic type unless that symbol has its own +grammar symbol that has that semantic type tag unless that symbol has its own per-symbol @code{%destructor}. -Finally, you may define a default @code{%destructor} by placing -@code{%symbol-default} in the @var{symbols} list of exactly one -@code{%destructor} declaration in your grammar file. -In that case, the parser will invoke the associated @var{code} whenever it -discards any user-defined grammar symbol for which there is no per-type or -per-symbol @code{%destructor}. +Finally, you can define two different kinds of default @code{%destructor}s. +You can place each of @code{<*>} and @code{} in the @var{symbols} list of +exactly one @code{%destructor} declaration in your grammar file. +The parser will invoke the @var{code} associated with one of these whenever it +discards any user-defined grammar symbol that has no per-symbol and no per-type +@code{%destructor}. +The parser uses the @var{code} for @code{<*>} in the case of such a grammar +symbol for which you have formally declared a semantic type tag (@code{%type} +counts as such a declaration, but @code{$$} does not). +The parser uses the @var{code} for @code{} in the case of such a grammar +symbol that has no declared semantic type tag. @end deffn @noindent -For instance: +For example: @smallexample %union @{ char *string; @} @@ -4290,35 +4295,52 @@ For instance: %union @{ char character; @} %token CHR %type chr -%destructor @{ free ($$); @} %symbol-default -%destructor @{ free ($$); printf ("%d", @@$.first_line); @} STRING1 string1 +%token TAGLESS + %destructor @{ @} +%destructor @{ free ($$); @} <*> +%destructor @{ free ($$); printf ("%d", @@$.first_line); @} STRING1 string1 +%destructor @{ printf ("Discarding tagless symbol.\n"); @} @end smallexample @noindent guarantees that, when the parser discards any user-defined symbol that has a semantic type tag other than @code{}, it passes its semantic value -to @code{free}. +to @code{free} by default. However, when the parser discards a @code{STRING1} or a @code{string1}, it also prints its line number to @code{stdout}. It performs only the second @code{%destructor} in this case, so it invokes @code{free} only once. - -Notice that a Bison-generated parser invokes the default @code{%destructor} -only for user-defined as opposed to Bison-defined symbols. -For example, the parser will not invoke it for the special Bison-defined -symbols @code{$accept}, @code{$undefined}, or @code{$end} (@pxref{Table of -Symbols, ,Bison Symbols}), none of which you can reference in your grammar. -It also will not invoke it for the @code{error} token (@pxref{Table of Symbols, -,error}), which is always defined by Bison regardless of whether you reference -it in your grammar. -However, it will invoke it for the end token (token 0) if you redefine it from -@code{$end} to, for example, @code{END}: +Finally, the parser merely prints a message whenever it discards any symbol, +such as @code{TAGLESS}, that has no semantic type tag. + +A Bison-generated parser invokes the default @code{%destructor}s only for +user-defined as opposed to Bison-defined symbols. +For example, the parser will not invoke either kind of default +@code{%destructor} for the special Bison-defined symbols @code{$accept}, +@code{$undefined}, or @code{$end} (@pxref{Table of Symbols, ,Bison Symbols}), +none of which you can reference in your grammar. +It also will not invoke either for the @code{error} token (@pxref{Table of +Symbols, ,error}), which is always defined by Bison regardless of whether you +reference it in your grammar. +However, it may invoke one of them for the end token (token 0) if you +redefine it from @code{$end} to, for example, @code{END}: @smallexample %token END 0 @end smallexample +@cindex actions in mid-rule +@cindex mid-rule actions +Finally, Bison will never invoke a @code{%destructor} for an unreferenced +mid-rule semantic value (@pxref{Mid-Rule Actions,,Actions in Mid-Rule}). +That is, Bison does not consider a mid-rule to have a semantic value if you do +not reference @code{$$} in the mid-rule's action or @code{$@var{n}} (where +@var{n} is the RHS symbol position of the mid-rule) in any later action in that +rule. +However, if you do reference either, the Bison-generated parser will invoke the +@code{} @code{%destructor} whenever it discards the mid-rule symbol. + @ignore @noindent In the future, it may be possible to redefine the @code{error} token as a @@ -8544,6 +8566,18 @@ Separates alternate rules for the same result nonterminal. @xref{Rules, ,Syntax of Grammar Rules}. @end deffn +@deffn {Directive} <*> +Used to define a default tagged @code{%destructor} or default tagged +@code{%printer}. +@xref{Destructor Decl, , Freeing Discarded Symbols}. +@end deffn + +@deffn {Directive} +Used to define a default tagless @code{%destructor} or default tagless +@code{%printer}. +@xref{Destructor Decl, , Freeing Discarded Symbols}. +@end deffn + @deffn {Symbol} $accept The predefined nonterminal whose only rule is @samp{$accept: @var{start} $end}, where @var{start} is the start symbol. @xref{Start Decl, , The @@ -8776,11 +8810,6 @@ Bison declaration to specify the start symbol. @xref{Start Decl, ,The Start-Symbol}. @end deffn -@deffn {Directive} %symbol-default -Used to declare a default @code{%destructor} or default @code{%printer}. -@xref{Destructor Decl, , Freeing Discarded Symbols}. -@end deffn - @deffn {Directive} %token Bison declaration to declare token(s) without specifying precedence. @xref{Token Decl, ,Token Type Names}. diff --git a/src/parse-gram.c b/src/parse-gram.c index 9278fdfb..684a2e6e 100644 --- a/src/parse-gram.c +++ b/src/parse-gram.c @@ -188,55 +188,56 @@ static int current_prec = 0; PERCENT_TYPE = 262, PERCENT_DESTRUCTOR = 263, PERCENT_PRINTER = 264, - PERCENT_SYMBOL_DEFAULT = 265, - PERCENT_LEFT = 266, - PERCENT_RIGHT = 267, - PERCENT_NONASSOC = 268, - PERCENT_PREC = 269, - PERCENT_DPREC = 270, - PERCENT_MERGE = 271, - PERCENT_CODE = 272, - PERCENT_CODE_TOP = 273, - PERCENT_DEBUG = 274, - PERCENT_DEFAULT_PREC = 275, - PERCENT_DEFINE = 276, - PERCENT_DEFINES = 277, - PERCENT_ERROR_VERBOSE = 278, - PERCENT_EXPECT = 279, - PERCENT_EXPECT_RR = 280, - PERCENT_FILE_PREFIX = 281, - PERCENT_GLR_PARSER = 282, - PERCENT_INITIAL_ACTION = 283, - PERCENT_LEX_PARAM = 284, - PERCENT_LOCATIONS = 285, - PERCENT_NAME_PREFIX = 286, - PERCENT_NO_DEFAULT_PREC = 287, - PERCENT_NO_LINES = 288, - PERCENT_NONDETERMINISTIC_PARSER = 289, - PERCENT_OUTPUT = 290, - PERCENT_PARSE_PARAM = 291, - PERCENT_PROVIDES = 292, - PERCENT_PURE_PARSER = 293, - PERCENT_PUSH_PARSER = 294, - PERCENT_REQUIRE = 295, - PERCENT_REQUIRES = 296, - PERCENT_SKELETON = 297, - PERCENT_START = 298, - PERCENT_TOKEN_TABLE = 299, - PERCENT_VERBOSE = 300, - PERCENT_YACC = 301, - BRACED_CODE = 302, - CHAR = 303, - EPILOGUE = 304, - EQUAL = 305, - ID = 306, - ID_COLON = 307, - PERCENT_PERCENT = 308, - PIPE = 309, - PROLOGUE = 310, - SEMICOLON = 311, - TYPE = 312, - PERCENT_UNION = 313 + PERCENT_LEFT = 265, + PERCENT_RIGHT = 266, + PERCENT_NONASSOC = 267, + PERCENT_PREC = 268, + PERCENT_DPREC = 269, + PERCENT_MERGE = 270, + PERCENT_CODE = 271, + PERCENT_CODE_TOP = 272, + PERCENT_DEBUG = 273, + PERCENT_DEFAULT_PREC = 274, + PERCENT_DEFINE = 275, + PERCENT_DEFINES = 276, + PERCENT_ERROR_VERBOSE = 277, + PERCENT_EXPECT = 278, + PERCENT_EXPECT_RR = 279, + PERCENT_FILE_PREFIX = 280, + PERCENT_GLR_PARSER = 281, + PERCENT_INITIAL_ACTION = 282, + PERCENT_LEX_PARAM = 283, + PERCENT_LOCATIONS = 284, + PERCENT_NAME_PREFIX = 285, + PERCENT_NO_DEFAULT_PREC = 286, + PERCENT_NO_LINES = 287, + PERCENT_NONDETERMINISTIC_PARSER = 288, + PERCENT_OUTPUT = 289, + PERCENT_PARSE_PARAM = 290, + PERCENT_PROVIDES = 291, + PERCENT_PURE_PARSER = 292, + PERCENT_PUSH_PARSER = 293, + PERCENT_REQUIRE = 294, + PERCENT_REQUIRES = 295, + PERCENT_SKELETON = 296, + PERCENT_START = 297, + PERCENT_TOKEN_TABLE = 298, + PERCENT_VERBOSE = 299, + PERCENT_YACC = 300, + BRACED_CODE = 301, + CHAR = 302, + EPILOGUE = 303, + EQUAL = 304, + ID = 305, + ID_COLON = 306, + PERCENT_PERCENT = 307, + PIPE = 308, + PROLOGUE = 309, + SEMICOLON = 310, + TYPE = 311, + TYPE_TAG_ANY = 312, + TYPE_TAG_NONE = 313, + PERCENT_UNION = 314 }; #endif /* Tokens. */ @@ -248,55 +249,56 @@ static int current_prec = 0; #define PERCENT_TYPE 262 #define PERCENT_DESTRUCTOR 263 #define PERCENT_PRINTER 264 -#define PERCENT_SYMBOL_DEFAULT 265 -#define PERCENT_LEFT 266 -#define PERCENT_RIGHT 267 -#define PERCENT_NONASSOC 268 -#define PERCENT_PREC 269 -#define PERCENT_DPREC 270 -#define PERCENT_MERGE 271 -#define PERCENT_CODE 272 -#define PERCENT_CODE_TOP 273 -#define PERCENT_DEBUG 274 -#define PERCENT_DEFAULT_PREC 275 -#define PERCENT_DEFINE 276 -#define PERCENT_DEFINES 277 -#define PERCENT_ERROR_VERBOSE 278 -#define PERCENT_EXPECT 279 -#define PERCENT_EXPECT_RR 280 -#define PERCENT_FILE_PREFIX 281 -#define PERCENT_GLR_PARSER 282 -#define PERCENT_INITIAL_ACTION 283 -#define PERCENT_LEX_PARAM 284 -#define PERCENT_LOCATIONS 285 -#define PERCENT_NAME_PREFIX 286 -#define PERCENT_NO_DEFAULT_PREC 287 -#define PERCENT_NO_LINES 288 -#define PERCENT_NONDETERMINISTIC_PARSER 289 -#define PERCENT_OUTPUT 290 -#define PERCENT_PARSE_PARAM 291 -#define PERCENT_PROVIDES 292 -#define PERCENT_PURE_PARSER 293 -#define PERCENT_PUSH_PARSER 294 -#define PERCENT_REQUIRE 295 -#define PERCENT_REQUIRES 296 -#define PERCENT_SKELETON 297 -#define PERCENT_START 298 -#define PERCENT_TOKEN_TABLE 299 -#define PERCENT_VERBOSE 300 -#define PERCENT_YACC 301 -#define BRACED_CODE 302 -#define CHAR 303 -#define EPILOGUE 304 -#define EQUAL 305 -#define ID 306 -#define ID_COLON 307 -#define PERCENT_PERCENT 308 -#define PIPE 309 -#define PROLOGUE 310 -#define SEMICOLON 311 -#define TYPE 312 -#define PERCENT_UNION 313 +#define PERCENT_LEFT 265 +#define PERCENT_RIGHT 266 +#define PERCENT_NONASSOC 267 +#define PERCENT_PREC 268 +#define PERCENT_DPREC 269 +#define PERCENT_MERGE 270 +#define PERCENT_CODE 271 +#define PERCENT_CODE_TOP 272 +#define PERCENT_DEBUG 273 +#define PERCENT_DEFAULT_PREC 274 +#define PERCENT_DEFINE 275 +#define PERCENT_DEFINES 276 +#define PERCENT_ERROR_VERBOSE 277 +#define PERCENT_EXPECT 278 +#define PERCENT_EXPECT_RR 279 +#define PERCENT_FILE_PREFIX 280 +#define PERCENT_GLR_PARSER 281 +#define PERCENT_INITIAL_ACTION 282 +#define PERCENT_LEX_PARAM 283 +#define PERCENT_LOCATIONS 284 +#define PERCENT_NAME_PREFIX 285 +#define PERCENT_NO_DEFAULT_PREC 286 +#define PERCENT_NO_LINES 287 +#define PERCENT_NONDETERMINISTIC_PARSER 288 +#define PERCENT_OUTPUT 289 +#define PERCENT_PARSE_PARAM 290 +#define PERCENT_PROVIDES 291 +#define PERCENT_PURE_PARSER 292 +#define PERCENT_PUSH_PARSER 293 +#define PERCENT_REQUIRE 294 +#define PERCENT_REQUIRES 295 +#define PERCENT_SKELETON 296 +#define PERCENT_START 297 +#define PERCENT_TOKEN_TABLE 298 +#define PERCENT_VERBOSE 299 +#define PERCENT_YACC 300 +#define BRACED_CODE 301 +#define CHAR 302 +#define EPILOGUE 303 +#define EQUAL 304 +#define ID 305 +#define ID_COLON 306 +#define PERCENT_PERCENT 307 +#define PIPE 308 +#define PROLOGUE 309 +#define SEMICOLON 310 +#define TYPE 311 +#define TYPE_TAG_ANY 312 +#define TYPE_TAG_NONE 313 +#define PERCENT_UNION 314 @@ -317,7 +319,7 @@ typedef union YYSTYPE } /* Line 198 of yacc.c */ -#line 321 "parse-gram.c" +#line 323 "parse-gram.c" YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -342,7 +344,7 @@ typedef struct YYLTYPE /* Line 221 of yacc.c */ -#line 346 "parse-gram.c" +#line 348 "parse-gram.c" #ifdef short # undef short @@ -559,20 +561,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 187 +#define YYLAST 205 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 59 +#define YYNTOKENS 60 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 31 /* YYNRULES -- Number of rules. */ -#define YYNRULES 98 +#define YYNRULES 99 /* YYNRULES -- Number of states. */ -#define YYNSTATES 137 +#define YYNSTATES 138 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 313 +#define YYMAXUTOK 314 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -611,7 +613,7 @@ static const yytype_uint8 yytranslate[] = 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58 + 55, 56, 57, 58, 59 }; #if YYDEBUG @@ -625,40 +627,41 @@ static const yytype_uint8 yyprhs[] = 77, 79, 81, 83, 86, 90, 94, 96, 98, 101, 104, 107, 110, 111, 113, 117, 118, 122, 123, 127, 131, 135, 137, 139, 141, 142, 144, 146, 149, 151, - 154, 156, 158, 160, 162, 164, 167, 170, 174, 176, - 179, 181, 184, 186, 189, 192, 193, 197, 199, 203, - 206, 207, 210, 213, 217, 221, 225, 227, 229, 230, - 232, 234, 236, 238, 240, 242, 244, 246, 247 + 154, 156, 158, 160, 162, 164, 166, 169, 172, 176, + 178, 181, 183, 186, 188, 191, 194, 195, 199, 201, + 205, 208, 209, 212, 215, 219, 223, 227, 229, 231, + 232, 234, 236, 238, 240, 242, 244, 246, 248, 249 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { - 60, 0, -1, 61, 53, 76, 89, -1, -1, 61, - 62, -1, 63, -1, 55, -1, 19, -1, 21, 3, - 83, -1, 22, -1, 23, -1, 24, 4, -1, 25, - 4, -1, 26, 50, 3, -1, 27, -1, 28, 47, - -1, 29, 47, -1, 30, -1, 31, 50, 3, -1, - 33, -1, 34, -1, 35, 50, 3, -1, 36, 47, - -1, 38, -1, 39, -1, 40, 3, -1, 42, 3, - -1, 44, -1, 45, -1, 46, -1, 56, -1, 68, - -1, 65, -1, 43, 87, -1, 8, 47, 72, -1, - 9, 47, 72, -1, 20, -1, 32, -1, 17, 84, - -1, 18, 84, -1, 37, 84, -1, 41, 84, -1, - -1, 51, -1, 58, 64, 47, -1, -1, 6, 66, - 75, -1, -1, 5, 67, 75, -1, 7, 57, 71, - -1, 69, 70, 71, -1, 11, -1, 12, -1, 13, - -1, -1, 57, -1, 87, -1, 71, 87, -1, 73, - -1, 72, 73, -1, 87, -1, 57, -1, 10, -1, - 57, -1, 85, -1, 85, 4, -1, 85, 88, -1, - 85, 4, 88, -1, 74, -1, 75, 74, -1, 77, - -1, 76, 77, -1, 78, -1, 63, 56, -1, 1, - 56, -1, -1, 86, 79, 80, -1, 81, -1, 80, - 54, 81, -1, 80, 56, -1, -1, 81, 87, -1, - 81, 47, -1, 81, 14, 87, -1, 81, 15, 4, - -1, 81, 16, 57, -1, 3, -1, 84, -1, -1, - 82, -1, 47, -1, 51, -1, 48, -1, 52, -1, - 85, -1, 88, -1, 3, -1, -1, 53, 49, -1 + 61, 0, -1, 62, 52, 77, 90, -1, -1, 62, + 63, -1, 64, -1, 54, -1, 18, -1, 20, 3, + 84, -1, 21, -1, 22, -1, 23, 4, -1, 24, + 4, -1, 25, 49, 3, -1, 26, -1, 27, 46, + -1, 28, 46, -1, 29, -1, 30, 49, 3, -1, + 32, -1, 33, -1, 34, 49, 3, -1, 35, 46, + -1, 37, -1, 38, -1, 39, 3, -1, 41, 3, + -1, 43, -1, 44, -1, 45, -1, 55, -1, 69, + -1, 66, -1, 42, 88, -1, 8, 46, 73, -1, + 9, 46, 73, -1, 19, -1, 31, -1, 16, 85, + -1, 17, 85, -1, 36, 85, -1, 40, 85, -1, + -1, 50, -1, 59, 65, 46, -1, -1, 6, 67, + 76, -1, -1, 5, 68, 76, -1, 7, 56, 72, + -1, 70, 71, 72, -1, 10, -1, 11, -1, 12, + -1, -1, 56, -1, 88, -1, 72, 88, -1, 74, + -1, 73, 74, -1, 88, -1, 56, -1, 57, -1, + 58, -1, 56, -1, 86, -1, 86, 4, -1, 86, + 89, -1, 86, 4, 89, -1, 75, -1, 76, 75, + -1, 78, -1, 77, 78, -1, 79, -1, 64, 55, + -1, 1, 55, -1, -1, 87, 80, 81, -1, 82, + -1, 81, 53, 82, -1, 81, 55, -1, -1, 82, + 88, -1, 82, 46, -1, 82, 13, 88, -1, 82, + 14, 4, -1, 82, 15, 56, -1, 3, -1, 85, + -1, -1, 83, -1, 46, -1, 50, -1, 47, -1, + 51, -1, 86, -1, 89, -1, 3, -1, -1, 52, + 48, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ @@ -670,10 +673,10 @@ static const yytype_uint16 yyrline[] = 255, 259, 260, 261, 265, 273, 281, 285, 289, 290, 291, 292, 303, 304, 308, 336, 336, 341, 341, 346, 357, 372, 373, 374, 378, 379, 384, 386, 391, 392, - 396, 397, 398, 403, 408, 413, 419, 425, 436, 437, - 446, 447, 453, 454, 455, 462, 462, 466, 467, 468, - 473, 474, 476, 478, 480, 482, 492, 493, 499, 503, - 508, 524, 526, 535, 540, 541, 546, 553, 555 + 396, 397, 398, 399, 404, 409, 414, 420, 426, 437, + 438, 447, 448, 454, 455, 456, 463, 463, 467, 468, + 469, 474, 475, 477, 479, 481, 483, 493, 494, 500, + 504, 509, 525, 527, 536, 541, 542, 547, 554, 556 }; #endif @@ -684,26 +687,25 @@ static const char *const yytname[] = { "\"end of file\"", "error", "$undefined", "\"string\"", "\"integer\"", "\"%token\"", "\"%nterm\"", "\"%type\"", "\"%destructor\"", - "\"%printer\"", "\"%symbol-default\"", "\"%left\"", "\"%right\"", - "\"%nonassoc\"", "\"%prec\"", "\"%dprec\"", "\"%merge\"", "\"%code\"", - "\"%code-top\"", "\"%debug\"", "\"%default-prec\"", "\"%define\"", - "\"%defines\"", "\"%error-verbose\"", "\"%expect\"", "\"%expect-rr\"", - "\"%file-prefix\"", "\"%glr-parser\"", "\"%initial-action\"", - "\"%lex-param\"", "\"%locations\"", "\"%name-prefix\"", - "\"%no-default-prec\"", "\"%no-lines\"", "\"%nondeterministic-parser\"", - "\"%output\"", "\"%parse-param\"", "\"%provides\"", "\"%pure-parser\"", - "\"%push-parser\"", "\"%require\"", "\"%requires\"", "\"%skeleton\"", - "\"%start\"", "\"%token-table\"", "\"%verbose\"", "\"%yacc\"", - "\"{...}\"", "\"char\"", "\"epilogue\"", "\"=\"", "\"identifier\"", - "\"identifier:\"", "\"%%\"", "\"|\"", "\"%{...%}\"", "\";\"", "\"type\"", - "\"%union\"", "$accept", "input", "prologue_declarations", - "prologue_declaration", "grammar_declaration", "union_name", - "symbol_declaration", "@1", "@2", "precedence_declaration", - "precedence_declarator", "type.opt", "symbols.1", "generic_symlist", - "generic_symlist_item", "symbol_def", "symbol_defs.1", "grammar", - "rules_or_grammar_declaration", "rules", "@3", "rhses.1", "rhs", - "content", "content.opt", "braceless", "id", "id_colon", "symbol", - "string_as_id", "epilogue.opt", 0 + "\"%printer\"", "\"%left\"", "\"%right\"", "\"%nonassoc\"", "\"%prec\"", + "\"%dprec\"", "\"%merge\"", "\"%code\"", "\"%code-top\"", "\"%debug\"", + "\"%default-prec\"", "\"%define\"", "\"%defines\"", "\"%error-verbose\"", + "\"%expect\"", "\"%expect-rr\"", "\"%file-prefix\"", "\"%glr-parser\"", + "\"%initial-action\"", "\"%lex-param\"", "\"%locations\"", + "\"%name-prefix\"", "\"%no-default-prec\"", "\"%no-lines\"", + "\"%nondeterministic-parser\"", "\"%output\"", "\"%parse-param\"", + "\"%provides\"", "\"%pure-parser\"", "\"%push-parser\"", "\"%require\"", + "\"%requires\"", "\"%skeleton\"", "\"%start\"", "\"%token-table\"", + "\"%verbose\"", "\"%yacc\"", "\"{...}\"", "\"char\"", "\"epilogue\"", + "\"=\"", "\"identifier\"", "\"identifier:\"", "\"%%\"", "\"|\"", + "\"%{...%}\"", "\";\"", "\"type\"", "\"<*>\"", "\"\"", "\"%union\"", + "$accept", "input", "prologue_declarations", "prologue_declaration", + "grammar_declaration", "union_name", "symbol_declaration", "$@1", "$@2", + "precedence_declaration", "precedence_declarator", "type.opt", + "symbols.1", "generic_symlist", "generic_symlist_item", "symbol_def", + "symbol_defs.1", "grammar", "rules_or_grammar_declaration", "rules", + "$@3", "rhses.1", "rhs", "content", "content.opt", "braceless", "id", + "id_colon", "symbol", "string_as_id", "epilogue.opt", 0 }; #endif @@ -717,23 +719,23 @@ static const yytype_uint16 yytoknum[] = 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313 + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { - 0, 59, 60, 61, 61, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 64, 64, 63, 66, 65, 67, 65, 65, - 68, 69, 69, 69, 70, 70, 71, 71, 72, 72, - 73, 73, 73, 74, 74, 74, 74, 74, 75, 75, - 76, 76, 77, 77, 77, 79, 78, 80, 80, 80, - 81, 81, 81, 81, 81, 81, 82, 82, 83, 83, - 84, 85, 85, 86, 87, 87, 88, 89, 89 + 0, 60, 61, 62, 62, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 65, 65, 64, 67, 66, 68, 66, 66, + 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, + 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, + 76, 77, 77, 78, 78, 78, 80, 79, 81, 81, + 81, 82, 82, 82, 82, 82, 82, 83, 83, 84, + 84, 85, 86, 86, 87, 88, 88, 89, 90, 90 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -745,10 +747,10 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 2, 3, 3, 1, 1, 2, 2, 2, 2, 0, 1, 3, 0, 3, 0, 3, 3, 3, 1, 1, 1, 0, 1, 1, 2, 1, 2, - 1, 1, 1, 1, 1, 2, 2, 3, 1, 2, - 1, 2, 1, 2, 2, 0, 3, 1, 3, 2, - 0, 2, 2, 3, 3, 3, 1, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 2 + 1, 1, 1, 1, 1, 1, 2, 2, 3, 1, + 2, 1, 2, 1, 2, 2, 0, 3, 1, 3, + 2, 0, 2, 2, 3, 3, 3, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 2 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -761,125 +763,129 @@ static const yytype_uint8 yydefact[] = 0, 0, 14, 0, 0, 17, 0, 37, 19, 20, 0, 0, 0, 23, 24, 0, 0, 0, 0, 27, 28, 29, 0, 6, 30, 42, 4, 5, 32, 31, - 54, 0, 0, 0, 0, 0, 90, 38, 39, 88, + 54, 0, 0, 0, 0, 0, 91, 38, 39, 89, 11, 12, 0, 15, 16, 0, 0, 22, 40, 25, - 41, 26, 96, 92, 91, 94, 33, 95, 0, 93, - 0, 0, 70, 72, 75, 43, 0, 55, 0, 63, - 68, 48, 64, 46, 49, 56, 62, 61, 34, 58, - 60, 35, 86, 89, 8, 87, 13, 18, 21, 74, - 73, 0, 71, 2, 80, 44, 50, 69, 65, 66, - 57, 59, 98, 76, 77, 67, 80, 79, 0, 0, - 0, 82, 81, 78, 83, 84, 85 + 41, 26, 97, 93, 92, 95, 33, 96, 0, 94, + 0, 0, 71, 73, 76, 43, 0, 55, 0, 64, + 69, 48, 65, 46, 49, 56, 61, 62, 63, 34, + 58, 60, 35, 87, 90, 8, 88, 13, 18, 21, + 75, 74, 0, 72, 2, 81, 44, 50, 70, 66, + 67, 57, 59, 99, 77, 78, 68, 81, 80, 0, + 0, 0, 83, 82, 79, 84, 85, 86 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 1, 2, 46, 80, 86, 48, 52, 51, 49, - 50, 88, 94, 98, 99, 90, 91, 81, 82, 83, - 114, 123, 124, 103, 104, 57, 75, 84, 100, 77, - 113 + 50, 88, 94, 99, 100, 90, 91, 81, 82, 83, + 115, 124, 125, 104, 105, 57, 75, 84, 101, 77, + 114 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -82 +#define YYPACT_NINF -89 static const yytype_int16 yypact[] = { - -82, 4, 91, -82, -82, -82, -52, -31, -24, -82, - -82, -82, -8, -8, -82, -82, 49, -82, -82, 53, - 54, 12, -82, 16, 26, -82, 30, -82, -82, -82, - 32, 36, -8, -82, -82, 81, -8, 82, 0, -82, - -82, -82, 23, -82, -82, 37, -82, -82, -82, -82, - 34, 19, 19, 0, 17, 17, -82, -82, -82, 14, - -82, -82, 84, -82, -82, 86, 90, -82, -82, -82, - -82, -82, -82, -82, -82, -82, -82, -82, 38, -82, - 45, 1, -82, -82, -82, -82, 58, -82, 0, -82, - -82, 19, 43, 19, 0, -82, -82, -82, 17, -82, - -82, 17, -82, -82, -82, -82, -82, -82, -82, -82, - -82, 57, -82, -82, -82, -82, 0, -82, 104, -82, - -82, -82, -82, 15, 136, -82, -82, -82, 0, 88, - 85, -82, -82, 136, -82, -82, -82 + -89, 14, 112, -89, -89, -89, -33, -16, -11, -89, + -89, -89, -6, -6, -89, -89, 39, -89, -89, 42, + 43, 5, -89, 9, 11, -89, 10, -89, -89, -89, + 12, 24, -6, -89, -89, 48, -6, 68, 30, -89, + -89, -89, 57, -89, -89, 28, -89, -89, -89, -89, + 29, -31, -31, 30, 25, 25, -89, -89, -89, 2, + -89, -89, 86, -89, -89, 87, 89, -89, -89, -89, + -89, -89, -89, -89, -89, -89, -89, -89, 40, -89, + 45, 1, -89, -89, -89, -89, 52, -89, 30, -89, + -89, -31, 35, -31, 30, -89, -89, -89, -89, 25, + -89, -89, 25, -89, -89, -89, -89, -89, -89, -89, + -89, -89, 46, -89, -89, -89, -89, 30, -89, 98, + -89, -89, -89, -89, -26, 155, -89, -89, -89, 30, + 99, 49, -89, -89, 155, -89, -89, -89 }; /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = +static const yytype_int8 yypgoto[] = { - -82, -82, -82, -82, 141, -82, -82, -82, -82, -82, - -82, -82, 50, 93, -76, -14, 101, -82, 64, -82, - -82, -82, 28, -82, -82, 13, 89, -82, -38, -81, - -82 + -89, -89, -89, -89, 100, -89, -89, -89, -89, -89, + -89, -89, 16, 51, -78, -57, 55, -89, 31, -89, + -89, -89, -18, -89, -89, -10, -7, -89, -38, -88, + -89 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -98 +#define YYTABLE_NINF -99 static const yytype_int16 yytable[] = { - 76, -97, 78, 72, 3, 53, 4, 5, 6, 7, - 8, 119, 9, 10, 11, 95, 54, 102, 12, 13, - 72, 15, 121, 55, 78, 121, 58, 96, 4, 5, - 6, 7, 8, 27, 9, 10, 11, 125, 32, 56, - 12, 13, 36, 15, 38, 68, 72, 118, 73, 70, - 95, 74, 59, 79, 111, 27, 120, 60, 61, 45, - 32, 56, 62, 63, 36, 73, 38, 73, 74, 126, - 74, 127, 105, 64, 97, 79, 89, 117, 120, 117, - 65, 45, 66, 67, 69, 71, 132, 106, 85, 107, - 134, 87, 135, 108, 109, 132, 4, 5, 6, 7, - 8, 110, 9, 10, 11, 115, 122, 72, 12, 13, + 76, -98, 78, 58, 120, 103, 4, 5, 6, 7, + 8, 9, 10, 11, 3, 95, 73, 12, 13, 74, + 15, 122, 68, 53, 122, 89, 70, 127, 72, 128, + 54, 126, 27, 72, 118, 55, 118, 32, 72, 119, + 56, 36, 59, 38, 92, 92, 60, 61, 56, 106, + 95, 69, 79, 112, 62, 63, 121, 64, 78, 65, + 45, 66, 4, 5, 6, 7, 8, 9, 10, 11, + 67, 71, 73, 12, 13, 74, 15, 73, 85, 121, + 74, 96, 97, 98, 92, 87, 92, 133, 27, 107, + 108, 135, 109, 32, 123, 110, 133, 36, 116, 38, + 111, 72, 47, 136, 117, 137, 102, 93, 79, 134, + 0, 0, 113, 0, 0, 0, 45, 4, 5, 6, + 7, 8, 9, 10, 11, 0, 0, 0, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 116, 72, - 92, 92, 136, 47, 42, 112, 43, 44, 101, 45, - 128, 129, 130, 93, 133, 0, 0, 0, 0, 0, + 34, 35, 36, 37, 38, 39, 40, 41, 72, 0, + 0, 0, 0, 0, 42, 0, 43, 44, 129, 130, + 131, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 0, 92, 131, 73, 0, 0, 74 + 0, 132, 73, 0, 0, 74 }; static const yytype_int16 yycheck[] = { - 38, 0, 1, 3, 0, 57, 5, 6, 7, 8, - 9, 92, 11, 12, 13, 53, 47, 3, 17, 18, - 3, 20, 98, 47, 1, 101, 13, 10, 5, 6, - 7, 8, 9, 32, 11, 12, 13, 118, 37, 47, - 17, 18, 41, 20, 43, 32, 3, 4, 48, 36, - 88, 51, 3, 52, 53, 32, 94, 4, 4, 58, - 37, 47, 50, 47, 41, 48, 43, 48, 51, 54, - 51, 56, 59, 47, 57, 52, 57, 91, 116, 93, - 50, 58, 50, 47, 3, 3, 124, 3, 51, 3, - 128, 57, 4, 3, 56, 133, 5, 6, 7, 8, - 9, 56, 11, 12, 13, 47, 49, 3, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 88, 3, - 51, 52, 57, 2, 53, 81, 55, 56, 55, 58, - 14, 15, 16, 52, 126, -1, -1, -1, -1, -1, + 38, 0, 1, 13, 92, 3, 5, 6, 7, 8, + 9, 10, 11, 12, 0, 53, 47, 16, 17, 50, + 19, 99, 32, 56, 102, 56, 36, 53, 3, 55, + 46, 119, 31, 3, 91, 46, 93, 36, 3, 4, + 46, 40, 3, 42, 51, 52, 4, 4, 46, 59, + 88, 3, 51, 52, 49, 46, 94, 46, 1, 49, + 59, 49, 5, 6, 7, 8, 9, 10, 11, 12, + 46, 3, 47, 16, 17, 50, 19, 47, 50, 117, + 50, 56, 57, 58, 91, 56, 93, 125, 31, 3, + 3, 129, 3, 36, 48, 55, 134, 40, 46, 42, + 55, 3, 2, 4, 88, 56, 55, 52, 51, 127, + -1, -1, 81, -1, -1, -1, 59, 5, 6, 7, + 8, 9, 10, 11, 12, -1, -1, -1, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 3, -1, + -1, -1, -1, -1, 52, -1, 54, 55, 13, 14, + 15, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 91, -1, 93, 47, 48, -1, -1, 51 + -1, 46, 47, -1, -1, 50 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { - 0, 60, 61, 0, 5, 6, 7, 8, 9, 11, - 12, 13, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 53, 55, 56, 58, 62, 63, 65, 68, - 69, 67, 66, 57, 47, 47, 47, 84, 84, 3, - 4, 4, 50, 47, 47, 50, 50, 47, 84, 3, - 84, 3, 3, 48, 51, 85, 87, 88, 1, 52, - 63, 76, 77, 78, 86, 51, 64, 57, 70, 57, - 74, 75, 85, 75, 71, 87, 10, 57, 72, 73, - 87, 72, 3, 82, 83, 84, 3, 3, 3, 56, - 56, 53, 77, 89, 79, 47, 71, 74, 4, 88, - 87, 73, 49, 80, 81, 88, 54, 56, 14, 15, - 16, 47, 87, 81, 87, 4, 57 + 0, 61, 62, 0, 5, 6, 7, 8, 9, 10, + 11, 12, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 52, 54, 55, 59, 63, 64, 66, 69, + 70, 68, 67, 56, 46, 46, 46, 85, 85, 3, + 4, 4, 49, 46, 46, 49, 49, 46, 85, 3, + 85, 3, 3, 47, 50, 86, 88, 89, 1, 51, + 64, 77, 78, 79, 87, 50, 65, 56, 71, 56, + 75, 76, 86, 76, 72, 88, 56, 57, 58, 73, + 74, 88, 73, 3, 83, 84, 85, 3, 3, 3, + 55, 55, 52, 78, 90, 80, 46, 72, 75, 4, + 89, 88, 74, 48, 81, 82, 89, 53, 55, 13, + 14, 15, 46, 88, 82, 88, 4, 56 }; #define yyerrok (yyerrstatus = 0) @@ -1034,7 +1040,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) { fputs (quotearg_style (c_quoting_style, (yyvaluep->chars)), stderr); }; /* Line 670 of yacc.c */ -#line 1038 "parse-gram.c" +#line 1044 "parse-gram.c" break; case 4: /* "\"integer\"" */ @@ -1043,133 +1049,133 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) { fprintf (stderr, "%d", (yyvaluep->integer)); }; /* Line 670 of yacc.c */ -#line 1047 "parse-gram.c" +#line 1053 "parse-gram.c" break; - case 47: /* "\"{...}\"" */ + case 46: /* "\"{...}\"" */ /* Line 670 of yacc.c */ #line 189 "parse-gram.y" { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); }; /* Line 670 of yacc.c */ -#line 1056 "parse-gram.c" +#line 1062 "parse-gram.c" break; - case 48: /* "\"char\"" */ + case 47: /* "\"char\"" */ /* Line 670 of yacc.c */ #line 182 "parse-gram.y" { fputs (char_name ((yyvaluep->character)), stderr); }; /* Line 670 of yacc.c */ -#line 1065 "parse-gram.c" +#line 1071 "parse-gram.c" break; - case 49: /* "\"epilogue\"" */ + case 48: /* "\"epilogue\"" */ /* Line 670 of yacc.c */ #line 189 "parse-gram.y" { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); }; /* Line 670 of yacc.c */ -#line 1074 "parse-gram.c" +#line 1080 "parse-gram.c" break; - case 51: /* "\"identifier\"" */ + case 50: /* "\"identifier\"" */ /* Line 670 of yacc.c */ #line 194 "parse-gram.y" { fputs ((yyvaluep->uniqstr), stderr); }; /* Line 670 of yacc.c */ -#line 1083 "parse-gram.c" +#line 1089 "parse-gram.c" break; - case 52: /* "\"identifier:\"" */ + case 51: /* "\"identifier:\"" */ /* Line 670 of yacc.c */ #line 195 "parse-gram.y" { fprintf (stderr, "%s:", (yyvaluep->uniqstr)); }; /* Line 670 of yacc.c */ -#line 1092 "parse-gram.c" +#line 1098 "parse-gram.c" break; - case 55: /* "\"%{...%}\"" */ + case 54: /* "\"%{...%}\"" */ /* Line 670 of yacc.c */ #line 189 "parse-gram.y" { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); }; /* Line 670 of yacc.c */ -#line 1101 "parse-gram.c" +#line 1107 "parse-gram.c" break; - case 57: /* "\"type\"" */ + case 56: /* "\"type\"" */ /* Line 670 of yacc.c */ #line 193 "parse-gram.y" { fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); }; /* Line 670 of yacc.c */ -#line 1110 "parse-gram.c" +#line 1116 "parse-gram.c" break; - case 82: /* "content" */ + case 83: /* "content" */ /* Line 670 of yacc.c */ #line 189 "parse-gram.y" { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); }; /* Line 670 of yacc.c */ -#line 1119 "parse-gram.c" +#line 1125 "parse-gram.c" break; - case 83: /* "content.opt" */ + case 84: /* "content.opt" */ /* Line 670 of yacc.c */ #line 189 "parse-gram.y" { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); }; /* Line 670 of yacc.c */ -#line 1128 "parse-gram.c" +#line 1134 "parse-gram.c" break; - case 84: /* "braceless" */ + case 85: /* "braceless" */ /* Line 670 of yacc.c */ #line 189 "parse-gram.y" { fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); }; /* Line 670 of yacc.c */ -#line 1137 "parse-gram.c" +#line 1143 "parse-gram.c" break; - case 85: /* "id" */ + case 86: /* "id" */ /* Line 670 of yacc.c */ #line 201 "parse-gram.y" { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); }; /* Line 670 of yacc.c */ -#line 1146 "parse-gram.c" +#line 1152 "parse-gram.c" break; - case 86: /* "id_colon" */ + case 87: /* "id_colon" */ /* Line 670 of yacc.c */ #line 202 "parse-gram.y" { fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); }; /* Line 670 of yacc.c */ -#line 1155 "parse-gram.c" +#line 1161 "parse-gram.c" break; - case 87: /* "symbol" */ + case 88: /* "symbol" */ /* Line 670 of yacc.c */ #line 201 "parse-gram.y" { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); }; /* Line 670 of yacc.c */ -#line 1164 "parse-gram.c" +#line 1170 "parse-gram.c" break; - case 88: /* "string_as_id" */ + case 89: /* "string_as_id" */ /* Line 670 of yacc.c */ #line 201 "parse-gram.y" { fprintf (stderr, "%s", (yyvaluep->symbol)->tag); }; /* Line 670 of yacc.c */ -#line 1173 "parse-gram.c" +#line 1179 "parse-gram.c" break; default: break; @@ -1693,7 +1699,7 @@ YYLTYPE yylloc; } /* Line 1082 of yacc.c */ -#line 1697 "parse-gram.c" +#line 1703 "parse-gram.c" yylsp[0] = yylloc; goto yysetstate; @@ -2316,33 +2322,40 @@ yyreduce: /* Line 1269 of yacc.c */ #line 398 "parse-gram.y" - { (yyval.list) = symbol_list_default_new ((yylsp[(1) - (1)])); } + { (yyval.list) = symbol_list_default_tagged_new ((yylsp[(1) - (1)])); } break; case 63: /* Line 1269 of yacc.c */ -#line 404 "parse-gram.y" +#line 399 "parse-gram.y" + { (yyval.list) = symbol_list_default_tagless_new ((yylsp[(1) - (1)])); } + break; + + case 64: + +/* Line 1269 of yacc.c */ +#line 405 "parse-gram.y" { current_type = (yyvsp[(1) - (1)].uniqstr); tag_seen = true; } break; - case 64: + case 65: /* Line 1269 of yacc.c */ -#line 409 "parse-gram.y" +#line 410 "parse-gram.y" { symbol_class_set ((yyvsp[(1) - (1)].symbol), current_class, (yylsp[(1) - (1)]), true); symbol_type_set ((yyvsp[(1) - (1)].symbol), current_type, (yylsp[(1) - (1)])); } break; - case 65: + case 66: /* Line 1269 of yacc.c */ -#line 414 "parse-gram.y" +#line 415 "parse-gram.y" { symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]), true); symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)])); @@ -2350,10 +2363,10 @@ yyreduce: } break; - case 66: + case 67: /* Line 1269 of yacc.c */ -#line 420 "parse-gram.y" +#line 421 "parse-gram.y" { symbol_class_set ((yyvsp[(1) - (2)].symbol), current_class, (yylsp[(1) - (2)]), true); symbol_type_set ((yyvsp[(1) - (2)].symbol), current_type, (yylsp[(1) - (2)])); @@ -2361,10 +2374,10 @@ yyreduce: } break; - case 67: + case 68: /* Line 1269 of yacc.c */ -#line 426 "parse-gram.y" +#line 427 "parse-gram.y" { symbol_class_set ((yyvsp[(1) - (3)].symbol), current_class, (yylsp[(1) - (3)]), true); symbol_type_set ((yyvsp[(1) - (3)].symbol), current_type, (yylsp[(1) - (3)])); @@ -2373,109 +2386,109 @@ yyreduce: } break; - case 74: + case 75: /* Line 1269 of yacc.c */ -#line 456 "parse-gram.y" +#line 457 "parse-gram.y" { yyerrok; } break; - case 75: + case 76: /* Line 1269 of yacc.c */ -#line 462 "parse-gram.y" +#line 463 "parse-gram.y" { current_lhs = (yyvsp[(1) - (1)].symbol); current_lhs_location = (yylsp[(1) - (1)]); } break; - case 77: + case 78: /* Line 1269 of yacc.c */ -#line 466 "parse-gram.y" +#line 467 "parse-gram.y" { grammar_current_rule_end ((yylsp[(1) - (1)])); } break; - case 78: + case 79: /* Line 1269 of yacc.c */ -#line 467 "parse-gram.y" +#line 468 "parse-gram.y" { grammar_current_rule_end ((yylsp[(3) - (3)])); } break; - case 80: + case 81: /* Line 1269 of yacc.c */ -#line 473 "parse-gram.y" +#line 474 "parse-gram.y" { grammar_current_rule_begin (current_lhs, current_lhs_location); } break; - case 81: + case 82: /* Line 1269 of yacc.c */ -#line 475 "parse-gram.y" +#line 476 "parse-gram.y" { grammar_current_rule_symbol_append ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); } break; - case 82: + case 83: /* Line 1269 of yacc.c */ -#line 477 "parse-gram.y" +#line 478 "parse-gram.y" { grammar_current_rule_action_append ((yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)])); } break; - case 83: + case 84: /* Line 1269 of yacc.c */ -#line 479 "parse-gram.y" +#line 480 "parse-gram.y" { grammar_current_rule_prec_set ((yyvsp[(3) - (3)].symbol), (yylsp[(3) - (3)])); } break; - case 84: + case 85: /* Line 1269 of yacc.c */ -#line 481 "parse-gram.y" +#line 482 "parse-gram.y" { grammar_current_rule_dprec_set ((yyvsp[(3) - (3)].integer), (yylsp[(3) - (3)])); } break; - case 85: + case 86: /* Line 1269 of yacc.c */ -#line 483 "parse-gram.y" +#line 484 "parse-gram.y" { grammar_current_rule_merge_set ((yyvsp[(3) - (3)].uniqstr), (yylsp[(3) - (3)])); } break; - case 88: + case 89: /* Line 1269 of yacc.c */ -#line 499 "parse-gram.y" +#line 500 "parse-gram.y" { static char one[] = "1"; (yyval.chars) = one; } break; - case 90: + case 91: /* Line 1269 of yacc.c */ -#line 509 "parse-gram.y" +#line 510 "parse-gram.y" { (yyvsp[(1) - (1)].chars)[strlen ((yyvsp[(1) - (1)].chars)) - 1] = '\n'; (yyval.chars) = translate_code ((yyvsp[(1) - (1)].chars) + 1, (yylsp[(1) - (1)])); } break; - case 91: + case 92: /* Line 1269 of yacc.c */ -#line 525 "parse-gram.y" +#line 526 "parse-gram.y" { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); } break; - case 92: + case 93: /* Line 1269 of yacc.c */ -#line 527 "parse-gram.y" +#line 528 "parse-gram.y" { (yyval.symbol) = symbol_get (char_name ((yyvsp[(1) - (1)].character)), (yylsp[(1) - (1)])); symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false); @@ -2483,27 +2496,27 @@ yyreduce: } break; - case 93: + case 94: /* Line 1269 of yacc.c */ -#line 535 "parse-gram.y" +#line 536 "parse-gram.y" { (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); } break; - case 96: + case 97: /* Line 1269 of yacc.c */ -#line 547 "parse-gram.y" +#line 548 "parse-gram.y" { (yyval.symbol) = symbol_get (quotearg_style (c_quoting_style, (yyvsp[(1) - (1)].chars)), (yylsp[(1) - (1)])); symbol_class_set ((yyval.symbol), token_sym, (yylsp[(1) - (1)]), false); } break; - case 98: + case 99: /* Line 1269 of yacc.c */ -#line 556 "parse-gram.y" +#line 557 "parse-gram.y" { muscle_code_grow ("epilogue", translate_code ((yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)])), (yylsp[(2) - (2)])); gram_scanner_last_string_free (); @@ -2513,7 +2526,7 @@ yyreduce: /* Line 1269 of yacc.c */ -#line 2517 "parse-gram.c" +#line 2530 "parse-gram.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -2732,7 +2745,7 @@ yyreturn: /* Line 1486 of yacc.c */ -#line 562 "parse-gram.y" +#line 563 "parse-gram.y" diff --git a/src/parse-gram.h b/src/parse-gram.h index e40c4209..9161ad1c 100644 --- a/src/parse-gram.h +++ b/src/parse-gram.h @@ -48,55 +48,56 @@ PERCENT_TYPE = 262, PERCENT_DESTRUCTOR = 263, PERCENT_PRINTER = 264, - PERCENT_SYMBOL_DEFAULT = 265, - PERCENT_LEFT = 266, - PERCENT_RIGHT = 267, - PERCENT_NONASSOC = 268, - PERCENT_PREC = 269, - PERCENT_DPREC = 270, - PERCENT_MERGE = 271, - PERCENT_CODE = 272, - PERCENT_CODE_TOP = 273, - PERCENT_DEBUG = 274, - PERCENT_DEFAULT_PREC = 275, - PERCENT_DEFINE = 276, - PERCENT_DEFINES = 277, - PERCENT_ERROR_VERBOSE = 278, - PERCENT_EXPECT = 279, - PERCENT_EXPECT_RR = 280, - PERCENT_FILE_PREFIX = 281, - PERCENT_GLR_PARSER = 282, - PERCENT_INITIAL_ACTION = 283, - PERCENT_LEX_PARAM = 284, - PERCENT_LOCATIONS = 285, - PERCENT_NAME_PREFIX = 286, - PERCENT_NO_DEFAULT_PREC = 287, - PERCENT_NO_LINES = 288, - PERCENT_NONDETERMINISTIC_PARSER = 289, - PERCENT_OUTPUT = 290, - PERCENT_PARSE_PARAM = 291, - PERCENT_PROVIDES = 292, - PERCENT_PURE_PARSER = 293, - PERCENT_PUSH_PARSER = 294, - PERCENT_REQUIRE = 295, - PERCENT_REQUIRES = 296, - PERCENT_SKELETON = 297, - PERCENT_START = 298, - PERCENT_TOKEN_TABLE = 299, - PERCENT_VERBOSE = 300, - PERCENT_YACC = 301, - BRACED_CODE = 302, - CHAR = 303, - EPILOGUE = 304, - EQUAL = 305, - ID = 306, - ID_COLON = 307, - PERCENT_PERCENT = 308, - PIPE = 309, - PROLOGUE = 310, - SEMICOLON = 311, - TYPE = 312, - PERCENT_UNION = 313 + PERCENT_LEFT = 265, + PERCENT_RIGHT = 266, + PERCENT_NONASSOC = 267, + PERCENT_PREC = 268, + PERCENT_DPREC = 269, + PERCENT_MERGE = 270, + PERCENT_CODE = 271, + PERCENT_CODE_TOP = 272, + PERCENT_DEBUG = 273, + PERCENT_DEFAULT_PREC = 274, + PERCENT_DEFINE = 275, + PERCENT_DEFINES = 276, + PERCENT_ERROR_VERBOSE = 277, + PERCENT_EXPECT = 278, + PERCENT_EXPECT_RR = 279, + PERCENT_FILE_PREFIX = 280, + PERCENT_GLR_PARSER = 281, + PERCENT_INITIAL_ACTION = 282, + PERCENT_LEX_PARAM = 283, + PERCENT_LOCATIONS = 284, + PERCENT_NAME_PREFIX = 285, + PERCENT_NO_DEFAULT_PREC = 286, + PERCENT_NO_LINES = 287, + PERCENT_NONDETERMINISTIC_PARSER = 288, + PERCENT_OUTPUT = 289, + PERCENT_PARSE_PARAM = 290, + PERCENT_PROVIDES = 291, + PERCENT_PURE_PARSER = 292, + PERCENT_PUSH_PARSER = 293, + PERCENT_REQUIRE = 294, + PERCENT_REQUIRES = 295, + PERCENT_SKELETON = 296, + PERCENT_START = 297, + PERCENT_TOKEN_TABLE = 298, + PERCENT_VERBOSE = 299, + PERCENT_YACC = 300, + BRACED_CODE = 301, + CHAR = 302, + EPILOGUE = 303, + EQUAL = 304, + ID = 305, + ID_COLON = 306, + PERCENT_PERCENT = 307, + PIPE = 308, + PROLOGUE = 309, + SEMICOLON = 310, + TYPE = 311, + TYPE_TAG_ANY = 312, + TYPE_TAG_NONE = 313, + PERCENT_UNION = 314 }; #endif /* Tokens. */ @@ -108,55 +109,56 @@ #define PERCENT_TYPE 262 #define PERCENT_DESTRUCTOR 263 #define PERCENT_PRINTER 264 -#define PERCENT_SYMBOL_DEFAULT 265 -#define PERCENT_LEFT 266 -#define PERCENT_RIGHT 267 -#define PERCENT_NONASSOC 268 -#define PERCENT_PREC 269 -#define PERCENT_DPREC 270 -#define PERCENT_MERGE 271 -#define PERCENT_CODE 272 -#define PERCENT_CODE_TOP 273 -#define PERCENT_DEBUG 274 -#define PERCENT_DEFAULT_PREC 275 -#define PERCENT_DEFINE 276 -#define PERCENT_DEFINES 277 -#define PERCENT_ERROR_VERBOSE 278 -#define PERCENT_EXPECT 279 -#define PERCENT_EXPECT_RR 280 -#define PERCENT_FILE_PREFIX 281 -#define PERCENT_GLR_PARSER 282 -#define PERCENT_INITIAL_ACTION 283 -#define PERCENT_LEX_PARAM 284 -#define PERCENT_LOCATIONS 285 -#define PERCENT_NAME_PREFIX 286 -#define PERCENT_NO_DEFAULT_PREC 287 -#define PERCENT_NO_LINES 288 -#define PERCENT_NONDETERMINISTIC_PARSER 289 -#define PERCENT_OUTPUT 290 -#define PERCENT_PARSE_PARAM 291 -#define PERCENT_PROVIDES 292 -#define PERCENT_PURE_PARSER 293 -#define PERCENT_PUSH_PARSER 294 -#define PERCENT_REQUIRE 295 -#define PERCENT_REQUIRES 296 -#define PERCENT_SKELETON 297 -#define PERCENT_START 298 -#define PERCENT_TOKEN_TABLE 299 -#define PERCENT_VERBOSE 300 -#define PERCENT_YACC 301 -#define BRACED_CODE 302 -#define CHAR 303 -#define EPILOGUE 304 -#define EQUAL 305 -#define ID 306 -#define ID_COLON 307 -#define PERCENT_PERCENT 308 -#define PIPE 309 -#define PROLOGUE 310 -#define SEMICOLON 311 -#define TYPE 312 -#define PERCENT_UNION 313 +#define PERCENT_LEFT 265 +#define PERCENT_RIGHT 266 +#define PERCENT_NONASSOC 267 +#define PERCENT_PREC 268 +#define PERCENT_DPREC 269 +#define PERCENT_MERGE 270 +#define PERCENT_CODE 271 +#define PERCENT_CODE_TOP 272 +#define PERCENT_DEBUG 273 +#define PERCENT_DEFAULT_PREC 274 +#define PERCENT_DEFINE 275 +#define PERCENT_DEFINES 276 +#define PERCENT_ERROR_VERBOSE 277 +#define PERCENT_EXPECT 278 +#define PERCENT_EXPECT_RR 279 +#define PERCENT_FILE_PREFIX 280 +#define PERCENT_GLR_PARSER 281 +#define PERCENT_INITIAL_ACTION 282 +#define PERCENT_LEX_PARAM 283 +#define PERCENT_LOCATIONS 284 +#define PERCENT_NAME_PREFIX 285 +#define PERCENT_NO_DEFAULT_PREC 286 +#define PERCENT_NO_LINES 287 +#define PERCENT_NONDETERMINISTIC_PARSER 288 +#define PERCENT_OUTPUT 289 +#define PERCENT_PARSE_PARAM 290 +#define PERCENT_PROVIDES 291 +#define PERCENT_PURE_PARSER 292 +#define PERCENT_PUSH_PARSER 293 +#define PERCENT_REQUIRE 294 +#define PERCENT_REQUIRES 295 +#define PERCENT_SKELETON 296 +#define PERCENT_START 297 +#define PERCENT_TOKEN_TABLE 298 +#define PERCENT_VERBOSE 299 +#define PERCENT_YACC 300 +#define BRACED_CODE 301 +#define CHAR 302 +#define EPILOGUE 303 +#define EQUAL 304 +#define ID 305 +#define ID_COLON 306 +#define PERCENT_PERCENT 307 +#define PIPE 308 +#define PROLOGUE 309 +#define SEMICOLON 310 +#define TYPE 311 +#define TYPE_TAG_ANY 312 +#define TYPE_TAG_NONE 313 +#define PERCENT_UNION 314 @@ -177,7 +179,7 @@ typedef union YYSTYPE } /* Line 1535 of yacc.c */ -#line 181 "parse-gram.h" +#line 183 "parse-gram.h" YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ diff --git a/src/parse-gram.y b/src/parse-gram.y index 66e5283a..04265596 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -116,8 +116,6 @@ static int current_prec = 0; %token PERCENT_TYPE "%type" %token PERCENT_DESTRUCTOR "%destructor" %token PERCENT_PRINTER "%printer" -%token PERCENT_SYMBOL_DEFAULT - "%symbol-default" %token PERCENT_LEFT "%left" %token PERCENT_RIGHT "%right" @@ -177,6 +175,8 @@ static int current_prec = 0; %token PROLOGUE "%{...%}" %token SEMICOLON ";" %token TYPE "type" +%token TYPE_TAG_ANY "<*>" +%token TYPE_TAG_NONE "" %type CHAR %printer { fputs (char_name ($$), stderr); } CHAR @@ -395,7 +395,8 @@ generic_symlist: generic_symlist_item: symbol { $$ = symbol_list_sym_new ($1, @1); } | TYPE { $$ = symbol_list_type_new ($1, @1); } -| "%symbol-default" { $$ = symbol_list_default_new (@1); } +| "<*>" { $$ = symbol_list_default_tagged_new (@1); } +| "" { $$ = symbol_list_default_tagless_new (@1); } ; /* One token definition. */ diff --git a/src/scan-gram.l b/src/scan-gram.l index a7ea7542..5e595cf6 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -194,7 +194,6 @@ splice (\\[ \f\t\v]*\n)* "%right" return PERCENT_RIGHT; "%skeleton" return PERCENT_SKELETON; "%start" return PERCENT_START; - "%symbol-default" return PERCENT_SYMBOL_DEFAULT; "%term" return PERCENT_TOKEN; "%token" return PERCENT_TOKEN; "%token"[-_]"table" return PERCENT_TOKEN_TABLE; @@ -210,6 +209,8 @@ splice (\\[ \f\t\v]*\n)* "=" return EQUAL; "|" return PIPE; ";" return SEMICOLON; + "<*>" return TYPE_TAG_ANY; + "" return TYPE_TAG_NONE; {id} { val->uniqstr = uniqstr_new (yytext); diff --git a/src/symlist.c b/src/symlist.c index b97c2ecb..245196b2 100644 --- a/src/symlist.c +++ b/src/symlist.c @@ -74,16 +74,33 @@ symbol_list_type_new (uniqstr type_name, location loc) } -/*----------------------------------------------------. -| Create a list containing a %symbol-default at LOC. | -`----------------------------------------------------*/ +/*----------------------------------------. +| Create a list containing a <*> at LOC. | +`----------------------------------------*/ symbol_list * -symbol_list_default_new (location loc) +symbol_list_default_tagged_new (location loc) { symbol_list *res = xmalloc (sizeof *res); - res->content_type = SYMLIST_DEFAULT; + res->content_type = SYMLIST_DEFAULT_TAGGED; + res->location = loc; + res->next = NULL; + + return res; +} + + +/*----------------------------------------. +| Create a list containing a at LOC. | +`----------------------------------------*/ + +symbol_list * +symbol_list_default_tagless_new (location loc) +{ + symbol_list *res = xmalloc (sizeof *res); + + res->content_type = SYMLIST_DEFAULT_TAGLESS; res->location = loc; res->next = NULL; @@ -215,8 +232,11 @@ symbol_list_destructor_set (symbol_list *node, const char *destructor, semantic_type_destructor_set ( semantic_type_get (node->content.type_name), destructor, loc); break; - case SYMLIST_DEFAULT: - default_destructor_set (destructor, loc); + case SYMLIST_DEFAULT_TAGGED: + default_tagged_destructor_set (destructor, loc); + break; + case SYMLIST_DEFAULT_TAGLESS: + default_tagless_destructor_set (destructor, loc); break; } } @@ -233,8 +253,11 @@ symbol_list_printer_set (symbol_list *node, const char *printer, location loc) semantic_type_printer_set ( semantic_type_get (node->content.type_name), printer, loc); break; - case SYMLIST_DEFAULT: - default_printer_set (printer, loc); + case SYMLIST_DEFAULT_TAGGED: + default_tagged_printer_set (printer, loc); + break; + case SYMLIST_DEFAULT_TAGLESS: + default_tagless_printer_set (printer, loc); break; } } diff --git a/src/symlist.h b/src/symlist.h index 6acb982e..9da8afe5 100644 --- a/src/symlist.h +++ b/src/symlist.h @@ -29,10 +29,13 @@ typedef struct symbol_list { /** - * Whether this node contains a symbol, a semantic type, or a - * \c \%symbol-default. + * Whether this node contains a symbol, a semantic type, a \c <*>, or a + * \c . */ - enum { SYMLIST_SYMBOL, SYMLIST_TYPE, SYMLIST_DEFAULT } content_type; + enum { + SYMLIST_SYMBOL, SYMLIST_TYPE, + SYMLIST_DEFAULT_TAGGED, SYMLIST_DEFAULT_TAGLESS + } content_type; union { /** The symbol or \c NULL iff node_type = SYMLIST_SYMBOL. */ symbol *sym; @@ -76,8 +79,10 @@ symbol_list *symbol_list_sym_new (symbol *sym, location loc); /** Create a list containing \c type_name at \c loc. */ symbol_list *symbol_list_type_new (uniqstr type_name, location loc); -/** Create a list containing a \c \%symbol-default at \c loc. */ -symbol_list *symbol_list_default_new (location loc); +/** Create a list containing a \c <*> at \c loc. */ +symbol_list *symbol_list_default_tagged_new (location loc); +/** Create a list containing a \c at \c loc. */ +symbol_list *symbol_list_default_tagless_new (location loc); /** Print this list. diff --git a/src/symtab.c b/src/symtab.c index f4bf8032..b2ffc216 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -41,14 +41,19 @@ symbol *accept = NULL; symbol *startsymbol = NULL; location startsymbol_location; -/*-----------------------------------. -| Default %destructor and %printer. | -`-----------------------------------*/ +/*---------------------------------------. +| Default %destructor's and %printer's. | +`---------------------------------------*/ + +static const char *default_tagged_destructor = NULL; +static location default_tagged_destructor_location; +static const char *default_tagless_destructor = NULL; +static location default_tagless_destructor_location; -static const char *default_destructor = NULL; -static location default_destructor_location; -static const char *default_printer = NULL; -static location default_printer_location; +static const char *default_tagged_printer = NULL; +static location default_tagged_printer_location; +static const char *default_tagless_printer = NULL; +static location default_tagless_printer_location; /*---------------------------------. | Create a new symbol, named TAG. | @@ -220,10 +225,13 @@ symbol_destructor_get (symbol *sym) return type->destructor; } - /* Apply the default %destructor only to user-defined symbols. */ + /* Apply default %destructor's only to user-defined symbols. */ if (sym->tag[0] == '$' || sym == errtoken) return NULL; - return default_destructor; + + if (sym->type_name) + return default_tagged_destructor; + return default_tagless_destructor; } /*---------------------------------------------------------------. @@ -240,8 +248,9 @@ symbol_destructor_location_get (symbol *sym) semantic_type *type = semantic_type_get (sym->type_name); if (type->destructor) return type->destructor_location; + return default_tagged_destructor_location; } - return default_destructor_location; + return default_tagless_destructor_location; } /*---------------------------------------------------------------. @@ -300,7 +309,10 @@ symbol_printer_get (symbol *sym) /* Apply the default %printer only to user-defined symbols. */ if (sym->tag[0] == '$' || sym == errtoken) return NULL; - return default_printer; + + if (sym->type_name) + return default_tagged_printer; + return default_tagless_printer; } /*------------------------------------------------------------. @@ -317,8 +329,9 @@ symbol_printer_location_get (symbol *sym) semantic_type *type = semantic_type_get (sym->type_name); if (type->printer) return type->printer_location; + return default_tagged_printer_location; } - return default_printer_location; + return default_tagless_printer_location; } @@ -924,30 +937,58 @@ symbols_pack (void) } -/*-----------------------------------. -| Set default %destructor/%printer. | -`-----------------------------------*/ +/*--------------------------------------------------. +| Set default tagged/tagless %destructor/%printer. | +`--------------------------------------------------*/ + +void +default_tagged_destructor_set (const char *destructor, location loc) +{ + if (default_tagged_destructor != NULL) + { + complain_at (loc, _("redeclaration for default tagged %%destructor")); + complain_at (default_tagged_destructor_location, + _("previous declaration")); + } + default_tagged_destructor = destructor; + default_tagged_destructor_location = loc; +} + +void +default_tagless_destructor_set (const char *destructor, location loc) +{ + if (default_tagless_destructor != NULL) + { + complain_at (loc, _("redeclaration for default tagless %%destructor")); + complain_at (default_tagless_destructor_location, + _("previous declaration")); + } + default_tagless_destructor = destructor; + default_tagless_destructor_location = loc; +} void -default_destructor_set (const char *destructor, location loc) +default_tagged_printer_set (const char *printer, location loc) { - if (default_destructor != NULL) + if (default_tagged_printer != NULL) { - complain_at (loc, _("redeclaration for default %%destructor")); - complain_at (default_destructor_location, _("previous declaration")); + complain_at (loc, _("redeclaration for default tagged %%printer")); + complain_at (default_tagged_printer_location, + _("previous declaration")); } - default_destructor = destructor; - default_destructor_location = loc; + default_tagged_printer = printer; + default_tagged_printer_location = loc; } void -default_printer_set (const char *printer, location loc) +default_tagless_printer_set (const char *printer, location loc) { - if (default_printer != NULL) + if (default_tagless_printer != NULL) { - complain_at (loc, _("redeclaration for default %%printer")); - complain_at (default_printer_location, _("previous declaration")); + complain_at (loc, _("redeclaration for default tagless %%printer")); + complain_at (default_tagless_printer_location, + _("previous declaration")); } - default_printer = printer; - default_printer_location = loc; + default_tagless_printer = printer; + default_tagless_printer_location = loc; } diff --git a/src/symtab.h b/src/symtab.h index 243d3d0c..c2949233 100644 --- a/src/symtab.h +++ b/src/symtab.h @@ -69,8 +69,8 @@ struct symbol /** Any \c \%destructor declared specifically for this symbol. Access this field only through symbol's interface functions. For - example, if symbol::destructor = NULL, the default - \c \%destructor or a per-type \c \%destructor might be appropriate, and + example, if symbol::destructor = NULL, a default \c \%destructor + or a per-type \c \%destructor might be appropriate, and \c symbol_destructor_get will compute the correct one. */ const char *destructor; @@ -255,14 +255,18 @@ void symbols_check_defined (void); void symbols_pack (void); -/*-----------------------------------. -| Default %destructor and %printer. | -`-----------------------------------*/ +/*---------------------------------------. +| Default %destructor's and %printer's. | +`---------------------------------------*/ -/** Set the default \c \%destructor. */ -void default_destructor_set (const char *destructor, location loc); +/** Set the default \c \%destructor for tagged values. */ +void default_tagged_destructor_set (const char *destructor, location loc); +/** Set the default \c \%destructor for tagless values. */ +void default_tagless_destructor_set (const char *destructor, location loc); -/** Set the default \c \%printer. */ -void default_printer_set (const char *printer, location loc); +/** Set the default \c \%printer for tagged values. */ +void default_tagged_printer_set (const char *printer, location loc); +/** Set the default \c \%printer for tagless values. */ +void default_tagless_printer_set (const char *printer, location loc); #endif /* !SYMTAB_H_ */ diff --git a/tests/actions.at b/tests/actions.at index 57e6bf7e..672a4dbf 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -583,14 +583,14 @@ AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [with union]) -## --------------------------------- ## -## Default %printer and %destructor. ## -## --------------------------------- ## +## ----------------------------------------- ## +## Default tagless %printer and %destructor. ## +## ----------------------------------------- ## # Check that the right %printer and %destructor are called, that they're not # called for $end, and that $$ and @$ work correctly. -AT_SETUP([Default %printer and %destructor]) +AT_SETUP([Default tagless %printer and %destructor]) AT_DATA_GRAMMAR([[input.y]], [[%error-verbose @@ -610,11 +610,15 @@ AT_DATA_GRAMMAR([[input.y]], %} %printer { - fprintf (yyoutput, "Default printer for '%c' @ %d", $$, @$.first_column); -} %symbol-default + fprintf (yyoutput, "<*> printer should not be called.\n"); +} <*> + +%printer { + fprintf (yyoutput, " printer for '%c' @ %d", $$, @$.first_column); +} %destructor { - fprintf (stdout, "Default destructor for '%c' @ %d.\n", $$, @$.first_column); -} %symbol-default + fprintf (stdout, " destructor for '%c' @ %d.\n", $$, @$.first_column); +} %printer { fprintf (yyoutput, "'b'/'c' printer for '%c' @ %d", $$, @$.first_column); @@ -623,6 +627,10 @@ AT_DATA_GRAMMAR([[input.y]], fprintf (stdout, "'b'/'c' destructor for '%c' @ %d.\n", $$, @$.first_column); } 'b' 'c' +%destructor { + fprintf (yyoutput, "<*> destructor should not be called.\n"); +} <*> + %% start: 'a' 'b' 'c' 'd' 'e' { $$ = 'S'; USE(($1, $2, $3, $4, $5)); } ; @@ -659,15 +667,15 @@ main (void) AT_CHECK([bison -o input.c input.y]) AT_COMPILE([input]) AT_PARSER_CHECK([./input], 1, -[[Default destructor for 'd' @ 4. +[[ destructor for 'd' @ 4. 'b'/'c' destructor for 'c' @ 3. 'b'/'c' destructor for 'b' @ 2. -Default destructor for 'a' @ 1. + destructor for 'a' @ 1. ]], [[Starting parse Entering state 0 -Reading a token: Next token is token 'a' (1.1-1.1: Default printer for 'a' @ 1) -Shifting token 'a' (1.1-1.1: Default printer for 'a' @ 1) +Reading a token: Next token is token 'a' (1.1-1.1: printer for 'a' @ 1) +Shifting token 'a' (1.1-1.1: printer for 'a' @ 1) Entering state 1 Reading a token: Next token is token 'b' (1.2-1.2: 'b'/'c' printer for 'b' @ 2) Shifting token 'b' (1.2-1.2: 'b'/'c' printer for 'b' @ 2) @@ -675,18 +683,18 @@ Entering state 3 Reading a token: Next token is token 'c' (1.3-1.3: 'b'/'c' printer for 'c' @ 3) Shifting token 'c' (1.3-1.3: 'b'/'c' printer for 'c' @ 3) Entering state 5 -Reading a token: Next token is token 'd' (1.4-1.4: Default printer for 'd' @ 4) -Shifting token 'd' (1.4-1.4: Default printer for 'd' @ 4) +Reading a token: Next token is token 'd' (1.4-1.4: printer for 'd' @ 4) +Shifting token 'd' (1.4-1.4: printer for 'd' @ 4) Entering state 6 Reading a token: Now at end of input. syntax error, unexpected $end, expecting 'e' -Error: popping token 'd' (1.4-1.4: Default printer for 'd' @ 4) +Error: popping token 'd' (1.4-1.4: printer for 'd' @ 4) Stack now 0 1 3 5 Error: popping token 'c' (1.3-1.3: 'b'/'c' printer for 'c' @ 3) Stack now 0 1 3 Error: popping token 'b' (1.2-1.2: 'b'/'c' printer for 'b' @ 2) Stack now 0 1 -Error: popping token 'a' (1.1-1.1: Default printer for 'a' @ 1) +Error: popping token 'a' (1.1-1.1: printer for 'a' @ 1) Stack now 0 Cleanup: discarding lookahead token $end (1.5-1.5: ) Stack now 0 @@ -696,11 +704,11 @@ AT_CLEANUP -## ----------------------------------- ## -## Per-type %printer and %destructor. ## -## ----------------------------------- ## +## ------------------------------------------------------ ## +## Default tagged and per-type %printer and %destructor. ## +## ------------------------------------------------------ ## -AT_SETUP([Per-type %printer and %destructor]) +AT_SETUP([Default tagged and per-type %printer and %destructor]) AT_DATA_GRAMMAR([[input.y]], [[%error-verbose @@ -714,16 +722,20 @@ AT_DATA_GRAMMAR([[input.y]], # define USE(SYM) %} +%printer { + fprintf (yyoutput, " printer should not be called.\n"); +} + %union { int field0; int field1; int field2; } %type start 'a' 'g' %type 'e' %type 'f' %printer { - fprintf (yyoutput, "%%symbol-default//e printer"); -} %symbol-default 'e' + fprintf (yyoutput, "<*>//e printer"); +} <*> 'e' %destructor { - fprintf (stdout, "%%symbol-default//e destructor.\n"); -} %symbol-default 'e' + fprintf (stdout, "<*>//e destructor.\n"); +} <*> 'e' %type 'b' %printer { fprintf (yyoutput, " printer"); } @@ -737,6 +749,10 @@ AT_DATA_GRAMMAR([[input.y]], %printer { fprintf (yyoutput, "'d' printer"); } 'd' %destructor { fprintf (stdout, "'d' destructor.\n"); } 'd' +%destructor { + fprintf (yyoutput, " destructor should not be called.\n"); +} + %% start: @@ -776,17 +792,17 @@ main (void) AT_CHECK([bison -o input.c input.y]) AT_COMPILE([input]) AT_PARSER_CHECK([./input], 1, -[[%symbol-default//e destructor. -%symbol-default//e destructor. +[[<*>//e destructor. +<*>//e destructor. 'd' destructor. 'c' destructor. destructor. -%symbol-default//e destructor. +<*>//e destructor. ]], [[Starting parse Entering state 0 -Reading a token: Next token is token 'a' (%symbol-default//e printer) -Shifting token 'a' (%symbol-default//e printer) +Reading a token: Next token is token 'a' (<*>//e printer) +Shifting token 'a' (<*>//e printer) Entering state 1 Reading a token: Next token is token 'b' ( printer) Shifting token 'b' ( printer) @@ -797,17 +813,17 @@ Entering state 5 Reading a token: Next token is token 'd' ('d' printer) Shifting token 'd' ('d' printer) Entering state 6 -Reading a token: Next token is token 'e' (%symbol-default//e printer) -Shifting token 'e' (%symbol-default//e printer) +Reading a token: Next token is token 'e' (<*>//e printer) +Shifting token 'e' (<*>//e printer) Entering state 7 -Reading a token: Next token is token 'f' (%symbol-default//e printer) -Shifting token 'f' (%symbol-default//e printer) +Reading a token: Next token is token 'f' (<*>//e printer) +Shifting token 'f' (<*>//e printer) Entering state 8 Reading a token: Now at end of input. syntax error, unexpected $end, expecting 'g' -Error: popping token 'f' (%symbol-default//e printer) +Error: popping token 'f' (<*>//e printer) Stack now 0 1 3 5 6 7 -Error: popping token 'e' (%symbol-default//e printer) +Error: popping token 'e' (<*>//e printer) Stack now 0 1 3 5 6 Error: popping token 'd' ('d' printer) Stack now 0 1 3 5 @@ -815,7 +831,7 @@ Error: popping token 'c' ('c' printer) Stack now 0 1 3 Error: popping token 'b' ( printer) Stack now 0 1 -Error: popping token 'a' (%symbol-default//e printer) +Error: popping token 'a' (<*>//e printer) Stack now 0 Cleanup: discarding lookahead token $end () Stack now 0 @@ -826,12 +842,19 @@ AT_CLEANUP ## ------------------------------------------------------------- ## -## Default %printer and %destructor for user-defined end token. ## +## Default %printer and %destructor for user-defined end token. ## ## ------------------------------------------------------------- ## AT_SETUP([Default %printer and %destructor for user-defined end token]) -AT_DATA_GRAMMAR([[input.y]], +# _AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(TYPED) +# ----------------------------------------------------------------------------- +m4_define([_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN], +[m4_if($1, 0, + [m4_pushdef([kind], [!]) m4_pushdef([not_kind], [*])], + [m4_pushdef([kind], [*]) m4_pushdef([not_kind], [!])]) + +AT_DATA_GRAMMAR([[input]]$1[[.y]], [[%error-verbose %debug %locations @@ -848,13 +871,26 @@ AT_DATA_GRAMMAR([[input.y]], # define USE(SYM) %} +%destructor { + fprintf (yyoutput, "<]]not_kind[[> destructor should not be called.\n"); +} <]]not_kind[[> + %token END 0 %printer { - fprintf (yyoutput, "Default printer for '%c' @ %d", $$, @$.first_column); -} %symbol-default + fprintf (yyoutput, "<]]kind[[> for '%c' @ %d", $$, @$.first_column); +} <]]kind[[> %destructor { - fprintf (stdout, "Default destructor for '%c' @ %d.\n", $$, @$.first_column); -} %symbol-default + fprintf (stdout, "<]]kind[[> for '%c' @ %d.\n", $$, @$.first_column); +} <]]kind[[> + +%printer { + fprintf (yyoutput, "<]]not_kind[[> printer should not be called.\n"); +} <]]not_kind[[> + +]]m4_if($1, 0, [[[ +]]], +[[[%union { char tag; } +%type start END]]])[[ %% @@ -868,7 +904,7 @@ yylex (void) static int called; if (called++) abort (); - yylval = 'E'; + yylval]]m4_if($1, 0,, [[[.tag]]])[[ = 'E'; yylloc.first_line = yylloc.last_line = 1; yylloc.first_column = yylloc.last_column = 1; return 0; @@ -888,26 +924,33 @@ main (void) } ]]) -AT_CHECK([bison -o input.c input.y]) -AT_COMPILE([input]) -AT_PARSER_CHECK([./input], 0, -[[Default destructor for 'E' @ 1. -Default destructor for 'S' @ 1. +AT_CHECK([bison -o input$1.c input$1.y]) +AT_COMPILE([input$1]) +AT_PARSER_CHECK([./input$1], 0, +[[<]]kind[[> for 'E' @ 1. +<]]kind[[> for 'S' @ 1. ]], [[Starting parse Entering state 0 -Reducing stack by rule 1 (line 35): --> $$ = nterm start (1.1-1.1: Default printer for 'S' @ 1) +Reducing stack by rule 1 (line 46): +-> $$ = nterm start (1.1-1.1: <]]kind[[> for 'S' @ 1) Stack now 0 Entering state 1 Reading a token: Now at end of input. -Shifting token END (1.1-1.1: Default printer for 'E' @ 1) +Shifting token END (1.1-1.1: <]]kind[[> for 'E' @ 1) Entering state 2 Stack now 0 1 2 -Cleanup: popping token END (1.1-1.1: Default printer for 'E' @ 1) -Cleanup: popping nterm start (1.1-1.1: Default printer for 'S' @ 1) +Cleanup: popping token END (1.1-1.1: <]]kind[[> for 'E' @ 1) +Cleanup: popping nterm start (1.1-1.1: <]]kind[[> for 'S' @ 1) ]]) +m4_popdef([kind]) +m4_popdef([not_kind]) +]) + +_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(0) +_AT_CHECK_DEFAULT_PRINTER_AND_DESTRUCTOR_FOR_END_TOKEN(1) + AT_CLEANUP @@ -940,10 +983,10 @@ AT_DATA_GRAMMAR([[input.y]], %printer { fprintf (yyoutput, "'%c'", $$); -} %symbol-default +} <*> %destructor { fprintf (stderr, "DESTROY '%c'\n", $$); -} %symbol-default +} <*> %% @@ -1055,11 +1098,11 @@ AT_DATA_GRAMMAR([[input.y]], %printer { char chr = $$; fprintf (yyoutput, "'%c'", chr); -} %symbol-default +} <*> %destructor { char chr = $$; fprintf (stderr, "DESTROY '%c'\n", chr); -} %symbol-default +} <*> %union { char chr; } %type start @@ -1119,8 +1162,10 @@ AT_DATA_GRAMMAR([[input.y]], # define YY_LOCATION_PRINT(File, Loc) %} -%printer { fprintf (yyoutput, "%d", @$); } %symbol-default -%destructor { fprintf (stderr, "DESTROY %d\n", @$); } %symbol-default +%printer { fprintf (yyoutput, "%d", @$); } +%destructor { fprintf (stderr, "DESTROY %d\n", @$); } +%printer { fprintf (yyoutput, "<*> printer should not be called"); } <*> +%destructor { fprintf (yyoutput, "<*> destructor should not be called"); } <*> %% @@ -1159,27 +1204,27 @@ main (void) ]]) AT_CHECK([bison -o input.c input.y], 0,, -[[input.y:31.3-23: warning: unset value: $$ -input.y:28.3-33.37: warning: unused value: $3 +[[input.y:33.3-23: warning: unset value: $$ +input.y:30.3-35.37: warning: unused value: $3 ]]) AT_COMPILE([input]) AT_PARSER_CHECK([./input], 1,, [[Starting parse Entering state 0 -Reducing stack by rule 1 (line 28): +Reducing stack by rule 1 (line 30): -> $$ = nterm $@1 (: ) Stack now 0 Entering state 2 -Reducing stack by rule 2 (line 29): +Reducing stack by rule 2 (line 31): -> $$ = nterm @2 (: 2) Stack now 0 2 Entering state 4 -Reducing stack by rule 3 (line 30): +Reducing stack by rule 3 (line 32): -> $$ = nterm @3 (: 3) Stack now 0 2 4 Entering state 5 -Reducing stack by rule 4 (line 31): +Reducing stack by rule 4 (line 33): -> $$ = nterm @4 (: 4) Stack now 0 2 4 5 Entering state 6 diff --git a/tests/input.at b/tests/input.at index adc38d72..dec1cbe6 100644 --- a/tests/input.at +++ b/tests/input.at @@ -178,33 +178,54 @@ AT_CLEANUP AT_SETUP([Default %printer and %destructor redeclared]) AT_DATA([[input.y]], -[[%destructor { destroy ($$); } %symbol-default %symbol-default -%printer { destroy ($$); } %symbol-default %symbol-default +[[%destructor { destroy ($$); } <*> <*> +%printer { destroy ($$); } <*> <*> -%destructor { destroy ($$); } %symbol-default -%printer { destroy ($$); } %symbol-default +%destructor { destroy ($$); } <*> +%printer { destroy ($$); } <*> + +%destructor { destroy ($$); } +%printer { destroy ($$); } + +%destructor { destroy ($$); } +%printer { destroy ($$); } %% start: ; -%destructor { destroy ($$); } %symbol-default; -%printer { destroy ($$); } %symbol-default; +%destructor { destroy ($$); } <*>; +%printer { destroy ($$); } <*>; + +%destructor { destroy ($$); } ; +%printer { destroy ($$); } ; ]]) AT_CHECK([bison input.y], [1], [], -[[input.y:1.13-29: redeclaration for default %destructor +[[input.y:1.13-29: redeclaration for default tagged %destructor input.y:1.13-29: previous declaration -input.y:2.10-26: redeclaration for default %printer +input.y:2.10-26: redeclaration for default tagged %printer input.y:2.10-26: previous declaration -input.y:4.13-29: redeclaration for default %destructor +input.y:4.13-29: redeclaration for default tagged %destructor input.y:1.13-29: previous declaration -input.y:5.10-26: redeclaration for default %printer +input.y:5.10-26: redeclaration for default tagged %printer input.y:2.10-26: previous declaration -input.y:11.13-29: redeclaration for default %destructor +input.y:7.13-29: redeclaration for default tagless %destructor +input.y:7.13-29: previous declaration +input.y:8.10-26: redeclaration for default tagless %printer +input.y:8.10-26: previous declaration +input.y:10.13-29: redeclaration for default tagless %destructor +input.y:7.13-29: previous declaration +input.y:11.10-26: redeclaration for default tagless %printer +input.y:8.10-26: previous declaration +input.y:17.13-29: redeclaration for default tagged %destructor input.y:4.13-29: previous declaration -input.y:12.10-26: redeclaration for default %printer +input.y:18.10-26: redeclaration for default tagged %printer input.y:5.10-26: previous declaration +input.y:20.13-29: redeclaration for default tagless %destructor +input.y:10.13-29: previous declaration +input.y:21.10-26: redeclaration for default tagless %printer +input.y:11.10-26: previous declaration ]]) AT_CLEANUP @@ -260,18 +281,36 @@ AT_CLEANUP AT_SETUP([Unused values with default %destructor]) AT_DATA([[input.y]], -[[%destructor { destroy ($$); } %symbol-default +[[%destructor { destroy ($$); } +%type tagged %% -start: end end { $1; } ; -end: { } ; +start: end end tagged tagged { $1; $3; } ; +end: { } ; +tagged: { } ; +]]) + +AT_CHECK([bison input.y], [0], [], +[[input.y:6.8-45: warning: unset value: $$ +input.y:6.8-45: warning: unused value: $2 +input.y:7.6-8: warning: unset value: $$ +]]) + +AT_DATA([[input.y]], +[[%destructor { destroy ($$); } <*> +%type tagged + +%% + +start: end end tagged tagged { $1; $3; } ; +end: { } ; +tagged: { } ; ]]) AT_CHECK([bison input.y], [0], [], -[[input.y:5.8-22: warning: unset value: $$ -input.y:5.8-22: warning: unused value: $2 -input.y:6.6-8: warning: unset value: $$ +[[input.y:6.8-45: warning: unused value: $4 +input.y:8.9-11: warning: unset value: $$ ]]) AT_CLEANUP -- 2.47.2