Accept a token number in a %left, %right, or %nonassoc for POSIX

conformance.  Reported by Tim Josling at
<http://lists.gnu.org/archive/html/bug-bison/2008-01/msg00010.html>.
* NEWS (2.3a+): Mention.
* doc/bison.texinfo (Precedence Decl): Describe how literal strings
and code numbers are treated by precedence declarations.
* src/parse-gram.y (precedence_declaration): Use symbols.prec instead
of symbols.1.
(symbols.prec): New, just like symbols.1 but uses symbol.prec instead
of symbol.
(symbol.prec): New, just like symbol but allows INT.
* src/symtab.c (symbol_user_token_number_set): Remove an aver that no
longer holds.
* tests/regression.at (Token number in precedence declaration): New
test case.
This commit is contained in:
Joel E. Denny
2008-02-17 00:18:36 +00:00
parent 80d2c3adcc
commit ab7f29f8f9
7 changed files with 365 additions and 225 deletions

View File

@@ -1,3 +1,21 @@
2008-02-16 Joel E. Denny <jdenny@ces.clemson.edu>
Accept a token number in a %left, %right, or %nonassoc for POSIX
conformance. Reported by Tim Josling at
<http://lists.gnu.org/archive/html/bug-bison/2008-01/msg00010.html>.
* NEWS (2.3a+): Mention.
* doc/bison.texinfo (Precedence Decl): Describe how literal strings
and code numbers are treated by precedence declarations.
* src/parse-gram.y (precedence_declaration): Use symbols.prec instead
of symbols.1.
(symbols.prec): New, just like symbols.1 but uses symbol.prec instead
of symbol.
(symbol.prec): New, just like symbol but allows INT.
* src/symtab.c (symbol_user_token_number_set): Remove an aver that no
longer holds.
* tests/regression.at (Token number in precedence declaration): New
test case.
2008-02-06 Juan Manuel Guerrero <juan.guerrero@gmx.de>
DJGPP specific issues.

6
NEWS
View File

@@ -154,6 +154,10 @@ Changes in version 2.3a+ (????-??-??):
See the section `Freeing Discarded Symbols' in the Bison manual for further
details.
* %left, %right, and %nonassoc can now declare token numbers. This is required
by POSIX. However, see the end of section `Operator Precedence' in the Bison
manual for a caveat concerning the treatment of literal strings.
Changes in version 2.3a, 2006-09-13:
* Instead of %union, you can define and use your own union type
@@ -978,7 +982,7 @@ End:
-----
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2004, 2005, 2006, 2007 Free Software Foundation, Inc.
2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.

View File

@@ -34,7 +34,8 @@ This manual is for @acronym{GNU} Bison (version @value{VERSION},
@value{UPDATED}), the @acronym{GNU} parser generator.
Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1995, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
Foundation, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
@@ -4088,7 +4089,7 @@ once. These are called @dfn{precedence declarations}.
@xref{Precedence, ,Operator Precedence}, for general information on
operator precedence.
The syntax of a precedence declaration is the same as that of
The syntax of a precedence declaration is nearly the same as that of
@code{%token}: either
@example
@@ -4126,6 +4127,18 @@ When two tokens declared in different precedence declarations associate,
the one declared later has the higher precedence and is grouped first.
@end itemize
For backward compatibility, there is a confusing difference between the
argument lists of @code{%token} and precedence declarations.
Only a @code{%token} can associate a literal string with a token type name.
A precedence declaration always interprets a literal string as a reference to a
separate token.
For example:
@example
%left OR "<=" // Does not declare an alias.
%left OR 134 "<=" 135 // Declares 134 for OR and 135 for "<=".
@end example
@node Union Decl
@subsection The Collection of Value Types
@cindex declaring value types

View File

@@ -73,8 +73,8 @@
#line 1 "parse-gram.y"
/* Bison Grammar Parser -*- C -*-
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation,
Inc.
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
@@ -552,16 +552,16 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 3
/* YYLAST -- Last index in YYTABLE. */
#define YYLAST 155
#define YYLAST 156
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 57
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 31
#define YYNNTS 33
/* YYNRULES -- Number of rules. */
#define YYNRULES 101
#define YYNRULES 105
/* YYNRULES -- Number of states. */
#define YYNSTATES 139
#define YYNSTATES 143
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2
@@ -618,42 +618,43 @@ static const yytype_uint16 yyprhs[] =
81, 84, 86, 88, 90, 92, 94, 96, 99, 103,
107, 109, 111, 114, 118, 119, 121, 125, 126, 130,
131, 135, 139, 143, 145, 147, 149, 150, 152, 154,
157, 159, 162, 164, 166, 168, 170, 172, 174, 177,
180, 184, 186, 189, 191, 194, 196, 199, 202, 203,
207, 209, 213, 216, 217, 220, 223, 227, 231, 235,
237, 239, 240, 242, 244, 246, 248, 250, 252, 254,
256, 257
157, 159, 162, 164, 167, 169, 172, 174, 176, 178,
180, 182, 184, 187, 190, 194, 196, 199, 201, 204,
206, 209, 212, 213, 217, 219, 223, 226, 227, 230,
233, 237, 241, 245, 247, 249, 250, 252, 254, 256,
258, 260, 262, 264, 266, 267
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
static const yytype_int8 yyrhs[] =
{
58, 0, -1, 59, 49, 74, 87, -1, -1, 59,
60, -1, 61, -1, 51, -1, 17, -1, 19, 80,
81, -1, 20, -1, 20, 3, -1, 21, -1, 22,
58, 0, -1, 59, 49, 76, 89, -1, -1, 59,
60, -1, 61, -1, 51, -1, 17, -1, 19, 82,
83, -1, 20, -1, 20, 3, -1, 21, -1, 22,
4, -1, 23, 4, -1, 24, 3, -1, 24, 46,
3, -1, 25, -1, 26, 43, -1, 27, 3, -1,
28, 43, -1, 29, -1, 30, 3, -1, 30, 46,
3, -1, 32, -1, 33, -1, 34, 3, -1, 34,
46, 3, -1, 35, 43, -1, 36, -1, 37, 3,
-1, 38, 3, -1, 40, -1, 41, -1, 42, -1,
52, -1, 66, -1, 63, -1, 39, 85, -1, 8,
43, 70, -1, 9, 43, 70, -1, 18, -1, 31,
-1, 16, 82, -1, 16, 47, 82, -1, -1, 47,
-1, 56, 62, 82, -1, -1, 6, 64, 73, -1,
-1, 5, 65, 73, -1, 7, 53, 69, -1, 67,
52, -1, 66, -1, 63, -1, 39, 87, -1, 8,
43, 72, -1, 9, 43, 72, -1, 18, -1, 31,
-1, 16, 84, -1, 16, 47, 84, -1, -1, 47,
-1, 56, 62, 84, -1, -1, 6, 64, 75, -1,
-1, 5, 65, 75, -1, 7, 53, 71, -1, 67,
68, 69, -1, 10, -1, 11, -1, 12, -1, -1,
53, -1, 85, -1, 69, 85, -1, 71, -1, 70,
71, -1, 85, -1, 53, -1, 54, -1, 55, -1,
53, -1, 83, -1, 83, 4, -1, 83, 86, -1,
83, 4, 86, -1, 72, -1, 73, 72, -1, 75,
-1, 74, 75, -1, 76, -1, 61, 52, -1, 1,
52, -1, -1, 84, 77, 78, -1, 79, -1, 78,
50, 79, -1, 78, 52, -1, -1, 79, 85, -1,
79, 43, -1, 79, 13, 85, -1, 79, 14, 4,
-1, 79, 15, 53, -1, 47, -1, 3, -1, -1,
53, -1, 70, -1, 69, 70, -1, 87, -1, 87,
4, -1, 87, -1, 71, 87, -1, 73, -1, 72,
73, -1, 87, -1, 53, -1, 54, -1, 55, -1,
53, -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, 61, 52, -1, 1,
52, -1, -1, 86, 79, 80, -1, 81, -1, 80,
50, 81, -1, 80, 52, -1, -1, 81, 87, -1,
81, 43, -1, 81, 13, 87, -1, 81, 14, 4,
-1, 81, 15, 53, -1, 47, -1, 3, -1, -1,
3, -1, 43, -1, 47, -1, 44, -1, 48, -1,
83, -1, 86, -1, 3, -1, -1, 49, 45, -1
85, -1, 88, -1, 3, -1, -1, 49, 45, -1
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
@@ -665,11 +666,11 @@ static const yytype_uint16 yyrline[] =
283, 307, 308, 309, 310, 314, 315, 316, 320, 327,
334, 338, 342, 349, 364, 365, 369, 381, 381, 386,
386, 391, 402, 417, 418, 419, 423, 424, 429, 431,
436, 437, 441, 442, 443, 444, 449, 454, 459, 465,
471, 482, 483, 492, 493, 499, 500, 501, 508, 508,
512, 513, 514, 519, 520, 522, 524, 526, 528, 538,
539, 545, 548, 557, 577, 579, 588, 593, 594, 599,
606, 608
436, 437, 442, 444, 449, 450, 454, 455, 456, 457,
462, 467, 472, 478, 484, 495, 496, 505, 506, 512,
513, 514, 521, 521, 525, 526, 527, 532, 533, 535,
537, 539, 541, 551, 552, 558, 561, 570, 590, 592,
601, 606, 607, 612, 619, 621
};
#endif
@@ -695,10 +696,11 @@ static const char *const yytname[] =
"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", "variable", "content.opt", "braceless", "id",
"id_colon", "symbol", "string_as_id", "epilogue.opt", 0
"symbols.prec", "symbol.prec", "symbols.1", "generic_symlist",
"generic_symlist_item", "symbol_def", "symbol_defs.1", "grammar",
"rules_or_grammar_declaration", "rules", "$@3", "rhses.1", "rhs",
"variable", "content.opt", "braceless", "id", "id_colon", "symbol",
"string_as_id", "epilogue.opt", 0
};
#endif
@@ -725,11 +727,11 @@ static const yytype_uint8 yyr1[] =
60, 60, 60, 60, 60, 61, 61, 61, 61, 61,
61, 61, 61, 61, 62, 62, 61, 64, 63, 65,
63, 63, 66, 67, 67, 67, 68, 68, 69, 69,
70, 70, 71, 71, 71, 71, 72, 72, 72, 72,
72, 73, 73, 74, 74, 75, 75, 75, 77, 76,
78, 78, 78, 79, 79, 79, 79, 79, 79, 80,
80, 81, 81, 82, 83, 83, 84, 85, 85, 86,
87, 87
70, 70, 71, 71, 72, 72, 73, 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
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
@@ -741,11 +743,11 @@ static const yytype_uint8 yyr2[] =
2, 1, 1, 1, 1, 1, 1, 2, 3, 3,
1, 1, 2, 3, 0, 1, 3, 0, 3, 0,
3, 3, 3, 1, 1, 1, 0, 1, 1, 2,
1, 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
1, 2, 1, 2, 1, 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
@@ -758,24 +760,25 @@ static const yytype_uint8 yydefact[] =
0, 16, 0, 0, 0, 20, 0, 41, 23, 24,
0, 0, 28, 0, 0, 0, 31, 32, 33, 0,
6, 34, 44, 4, 5, 36, 35, 56, 0, 0,
0, 0, 0, 93, 0, 42, 90, 89, 91, 10,
0, 0, 0, 97, 0, 42, 94, 93, 95, 10,
12, 13, 14, 0, 17, 18, 19, 21, 0, 25,
0, 27, 29, 30, 99, 95, 94, 97, 37, 98,
0, 96, 0, 0, 73, 75, 78, 45, 0, 57,
0, 66, 71, 50, 67, 48, 51, 58, 63, 64,
65, 38, 60, 62, 39, 43, 92, 8, 15, 22,
26, 77, 76, 0, 74, 2, 83, 46, 52, 72,
68, 69, 59, 61, 101, 79, 80, 70, 83, 82,
0, 0, 0, 85, 84, 81, 86, 87, 88
0, 27, 29, 30, 103, 99, 98, 101, 37, 102,
0, 100, 0, 0, 77, 79, 82, 45, 0, 57,
0, 70, 75, 50, 71, 48, 51, 62, 67, 68,
69, 38, 64, 66, 39, 43, 96, 8, 15, 22,
26, 81, 80, 0, 78, 2, 87, 46, 52, 58,
60, 76, 72, 73, 63, 65, 105, 83, 84, 59,
61, 74, 87, 86, 0, 0, 0, 89, 88, 85,
90, 91, 92
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int8 yydefgoto[] =
static const yytype_int16 yydefgoto[] =
{
-1, 1, 2, 43, 82, 88, 45, 49, 48, 46,
47, 90, 96, 101, 102, 92, 93, 83, 84, 85,
116, 125, 126, 58, 107, 55, 77, 86, 103, 79,
115
47, 90, 118, 119, 96, 101, 102, 92, 93, 83,
84, 85, 116, 127, 128, 58, 107, 55, 77, 86,
103, 79, 115
};
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
@@ -783,54 +786,55 @@ static const yytype_int8 yydefgoto[] =
#define YYPACT_NINF -60
static const yytype_int16 yypact[] =
{
-60, 18, 96, -60, -60, -60, -16, 17, 24, -60,
-60, 18, 100, -60, -60, -60, -16, 24, 27, -60,
-60, -60, -8, -60, -60, 11, 70, -60, 71, 80,
2, -60, 46, 87, 49, -60, 31, -60, -60, -60,
40, 50, -60, 91, 93, 0, -60, -60, -60, 15,
-60, -60, 51, -60, -60, -60, -60, 44, 12, 12,
0, 25, 25, -60, 56, -60, -60, -60, 106, -60,
-60, -60, -60, 107, -60, -60, -60, -60, 108, -60,
136, -60, -60, -60, -60, -60, -60, -60, -60, -60,
88, -60, 89, 1, -60, -60, -60, -60, 56, -60,
2, -60, 46, 87, 48, -60, 31, -60, -60, -60,
40, 49, -60, 91, 92, 0, -60, -60, -60, 15,
-60, -60, 50, -60, -60, -60, -60, 43, 12, 12,
0, 25, 25, -60, 55, -60, -60, -60, 97, -60,
-60, -60, -60, 98, -60, -60, -60, -60, 99, -60,
110, -60, -60, -60, -60, -60, -60, -60, -60, -60,
51, -60, 62, 1, -60, -60, -60, -60, 55, -60,
0, -60, -60, 12, 84, 12, 0, -60, -60, -60,
-60, 25, -60, -60, 25, -60, -60, -60, -60, -60,
-60, -60, -60, 97, -60, -60, -60, -60, 0, -60,
140, -60, -60, -60, -60, 14, 38, -60, -60, -60,
0, 142, 98, -60, -60, 38, -60, -60, -60
-60, -60, -60, 101, -60, -60, -60, -60, 0, -60,
111, -60, 140, -60, -60, -60, -60, 10, 38, -60,
-60, -60, -60, -60, 0, 141, 94, -60, -60, 38,
-60, -60, -60
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
-60, -60, -60, -60, 147, -60, -60, -60, -60, -60,
-60, -60, 54, 101, -59, -25, 105, -60, 67, -60,
-60, -60, 27, -60, -60, -50, -19, -60, -35, -58,
-60
-60, -60, -60, -60, 142, -60, -60, -60, -60, -60,
-60, -60, -60, 30, -60, 102, -59, -27, 104, -60,
67, -60, -60, -60, 23, -60, -60, -50, -19, -60,
-35, -58, -60
};
/* 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 -101
#define YYTABLE_NINF -105
static const yytype_int16 yytable[] =
{
78, -100, 80, 74, 105, 62, 4, 5, 6, 7,
78, -104, 80, 74, 105, 62, 4, 5, 6, 7,
8, 9, 10, 11, 56, 97, 80, 12, 3, 14,
4, 5, 6, 7, 8, 9, 10, 11, 74, 94,
94, 12, 27, 14, 67, 53, 121, 50, 117, 54,
35, 74, 123, 69, 75, 123, 27, 76, 63, 81,
113, 130, 131, 132, 35, 97, 75, 42, 57, 76,
51, 122, 127, 81, 128, 91, 129, 52, 119, 75,
119, 42, 76, 59, 94, 60, 94, 68, 98, 99,
100, 133, 75, 122, 61, 76, 70, 74, 120, 64,
65, 134, 66, 71, 72, 136, 73, 89, 87, 53,
134, 4, 5, 6, 7, 8, 9, 10, 11, 106,
108, 109, 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, 110,
111, 112, 124, 74, 118, 39, 137, 40, 41, 44,
114, 138, 42, 104, 95, 135
94, 12, 27, 14, 67, 53, 123, 50, 117, 54,
35, 74, 125, 69, 75, 125, 27, 76, 63, 81,
113, 134, 135, 136, 35, 120, 75, 42, 57, 76,
132, 124, 133, 81, 131, 91, 121, 51, 121, 75,
52, 42, 76, 59, 94, 60, 94, 68, 98, 99,
100, 137, 75, 120, 61, 76, 70, 74, 122, 64,
65, 66, 71, 138, 72, 73, 89, 87, 53, 140,
106, 108, 109, 111, 138, 4, 5, 6, 7, 8,
9, 10, 11, 110, 112, 130, 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, 74, 44, 141, 126, 142, 129, 39,
114, 40, 41, 95, 104, 139, 42
};
static const yytype_uint8 yycheck[] =
@@ -841,16 +845,16 @@ static const yytype_uint8 yycheck[] =
49, 16, 31, 18, 3, 43, 94, 53, 88, 47,
39, 3, 101, 3, 44, 104, 31, 47, 46, 48,
49, 13, 14, 15, 39, 90, 44, 56, 47, 47,
43, 96, 120, 48, 50, 53, 52, 43, 93, 44,
95, 56, 47, 3, 93, 4, 95, 46, 53, 54,
50, 96, 52, 48, 122, 53, 93, 43, 95, 44,
43, 56, 47, 3, 93, 4, 95, 46, 53, 54,
55, 43, 44, 118, 4, 47, 46, 3, 4, 43,
3, 126, 43, 43, 3, 130, 3, 53, 47, 43,
135, 5, 6, 7, 8, 9, 10, 11, 12, 3,
3, 3, 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, 3,
52, 52, 45, 3, 90, 49, 4, 51, 52, 2,
83, 53, 56, 52, 49, 128
3, 43, 43, 128, 3, 3, 53, 47, 43, 134,
3, 3, 3, 52, 139, 5, 6, 7, 8, 9,
10, 11, 12, 3, 52, 4, 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, 3, 2, 4, 45, 53, 118, 49,
83, 51, 52, 49, 52, 132, 56
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -862,15 +866,16 @@ static const yytype_uint8 yystos[] =
24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41, 42, 49,
51, 52, 56, 60, 61, 63, 66, 67, 65, 64,
53, 43, 43, 43, 47, 82, 3, 47, 80, 3,
53, 43, 43, 43, 47, 84, 3, 47, 82, 3,
4, 4, 3, 46, 43, 3, 43, 3, 46, 3,
46, 43, 3, 3, 3, 44, 47, 83, 85, 86,
1, 48, 61, 74, 75, 76, 84, 47, 62, 53,
68, 53, 72, 73, 83, 73, 69, 85, 53, 54,
55, 70, 71, 85, 70, 82, 3, 81, 3, 3,
3, 52, 52, 49, 75, 87, 77, 82, 69, 72,
4, 86, 85, 71, 45, 78, 79, 86, 50, 52,
13, 14, 15, 43, 85, 79, 85, 4, 53
46, 43, 3, 3, 3, 44, 47, 85, 87, 88,
1, 48, 61, 76, 77, 78, 86, 47, 62, 53,
68, 53, 74, 75, 85, 75, 71, 87, 53, 54,
55, 72, 73, 87, 72, 84, 3, 83, 3, 3,
3, 52, 52, 49, 77, 89, 79, 84, 69, 70,
87, 74, 4, 88, 87, 73, 45, 80, 81, 70,
4, 88, 50, 52, 13, 14, 15, 43, 87, 81,
87, 4, 53
};
#define yyerrok (yyerrstatus = 0)
@@ -1025,7 +1030,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
{ fputs (quotearg_style (c_quoting_style, (yyvaluep->chars)), stderr); };
/* Line 22 of yacc.c */
#line 1029 "parse-gram.c"
#line 1034 "parse-gram.c"
break;
case 4: /* "\"integer\"" */
@@ -1034,7 +1039,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
{ fprintf (stderr, "%d", (yyvaluep->integer)); };
/* Line 22 of yacc.c */
#line 1038 "parse-gram.c"
#line 1043 "parse-gram.c"
break;
case 43: /* "\"{...}\"" */
@@ -1043,7 +1048,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->code)); };
/* Line 22 of yacc.c */
#line 1047 "parse-gram.c"
#line 1052 "parse-gram.c"
break;
case 44: /* "\"char\"" */
@@ -1052,7 +1057,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
{ fputs (char_name ((yyvaluep->character)), stderr); };
/* Line 22 of yacc.c */
#line 1056 "parse-gram.c"
#line 1061 "parse-gram.c"
break;
case 45: /* "\"epilogue\"" */
@@ -1061,7 +1066,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
/* Line 22 of yacc.c */
#line 1065 "parse-gram.c"
#line 1070 "parse-gram.c"
break;
case 47: /* "\"identifier\"" */
@@ -1070,7 +1075,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
{ fputs ((yyvaluep->uniqstr), stderr); };
/* Line 22 of yacc.c */
#line 1074 "parse-gram.c"
#line 1079 "parse-gram.c"
break;
case 48: /* "\"identifier:\"" */
@@ -1079,7 +1084,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
{ fprintf (stderr, "%s:", (yyvaluep->uniqstr)); };
/* Line 22 of yacc.c */
#line 1083 "parse-gram.c"
#line 1088 "parse-gram.c"
break;
case 51: /* "\"%{...%}\"" */
@@ -1088,7 +1093,7 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
/* Line 22 of yacc.c */
#line 1092 "parse-gram.c"
#line 1097 "parse-gram.c"
break;
case 53: /* "\"type\"" */
@@ -1097,70 +1102,70 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
{ fprintf (stderr, "<%s>", (yyvaluep->uniqstr)); };
/* Line 22 of yacc.c */
#line 1101 "parse-gram.c"
#line 1106 "parse-gram.c"
break;
case 80: /* "variable" */
case 82: /* "variable" */
/* Line 22 of yacc.c */
#line 189 "parse-gram.y"
{ fputs ((yyvaluep->uniqstr), stderr); };
/* Line 22 of yacc.c */
#line 1110 "parse-gram.c"
#line 1115 "parse-gram.c"
break;
case 81: /* "content.opt" */
case 83: /* "content.opt" */
/* Line 22 of yacc.c */
#line 184 "parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
/* Line 22 of yacc.c */
#line 1119 "parse-gram.c"
#line 1124 "parse-gram.c"
break;
case 82: /* "braceless" */
case 84: /* "braceless" */
/* Line 22 of yacc.c */
#line 184 "parse-gram.y"
{ fprintf (stderr, "{\n%s\n}", (yyvaluep->chars)); };
/* Line 22 of yacc.c */
#line 1128 "parse-gram.c"
#line 1133 "parse-gram.c"
break;
case 83: /* "id" */
case 85: /* "id" */
/* Line 22 of yacc.c */
#line 196 "parse-gram.y"
{ fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
/* Line 22 of yacc.c */
#line 1137 "parse-gram.c"
#line 1142 "parse-gram.c"
break;
case 84: /* "id_colon" */
case 86: /* "id_colon" */
/* Line 22 of yacc.c */
#line 197 "parse-gram.y"
{ fprintf (stderr, "%s:", (yyvaluep->symbol)->tag); };
/* Line 22 of yacc.c */
#line 1146 "parse-gram.c"
#line 1151 "parse-gram.c"
break;
case 85: /* "symbol" */
case 87: /* "symbol" */
/* Line 22 of yacc.c */
#line 196 "parse-gram.y"
{ fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
/* Line 22 of yacc.c */
#line 1155 "parse-gram.c"
#line 1160 "parse-gram.c"
break;
case 86: /* "string_as_id" */
case 88: /* "string_as_id" */
/* Line 22 of yacc.c */
#line 196 "parse-gram.y"
{ fprintf (stderr, "%s", (yyvaluep->symbol)->tag); };
/* Line 22 of yacc.c */
#line 1164 "parse-gram.c"
#line 1169 "parse-gram.c"
break;
default:
break;
@@ -1612,10 +1617,10 @@ YYLTYPE yylloc;
YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
#endif
/* Three stacks and their tools:
`yyss': related to states,
`yyvs': related to semantic values,
`yyls': related to locations.
/* The stacks and their tools:
`yyss' is related to states.
`yyvs' is related to semantic values.
`yyls' is related to locations.
Refer to the stacks thru separate pointers, to allow yyoverflow
to reallocate them elsewhere. */
@@ -1684,7 +1689,7 @@ YYLTYPE yylloc;
}
/* Line 22 of yacc.c */
#line 1688 "parse-gram.c"
#line 1693 "parse-gram.c"
yylsp[0] = yylloc;
goto yysetstate;
@@ -2334,68 +2339,96 @@ yyreduce:
/* Line 22 of yacc.c */
#line 436 "parse-gram.y"
{ (yyval.list) = (yyvsp[(1) - (1)].list); }
{ (yyval.symbol) = (yyvsp[(1) - (1)].symbol); }
break;
case 61:
/* Line 22 of yacc.c */
#line 437 "parse-gram.y"
{ (yyval.list) = symbol_list_prepend ((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].list)); }
{ (yyval.symbol) = (yyvsp[(1) - (2)].symbol); symbol_user_token_number_set ((yyvsp[(1) - (2)].symbol), (yyvsp[(2) - (2)].integer), (yylsp[(2) - (2)])); }
break;
case 62:
/* Line 22 of yacc.c */
#line 441 "parse-gram.y"
#line 443 "parse-gram.y"
{ (yyval.list) = symbol_list_sym_new ((yyvsp[(1) - (1)].symbol), (yylsp[(1) - (1)])); }
break;
case 63:
/* Line 22 of yacc.c */
#line 442 "parse-gram.y"
{ (yyval.list) = symbol_list_type_new ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
#line 445 "parse-gram.y"
{ (yyval.list) = symbol_list_prepend ((yyvsp[(1) - (2)].list), symbol_list_sym_new ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)]))); }
break;
case 64:
/* Line 22 of yacc.c */
#line 443 "parse-gram.y"
{ (yyval.list) = symbol_list_default_tagged_new ((yylsp[(1) - (1)])); }
#line 449 "parse-gram.y"
{ (yyval.list) = (yyvsp[(1) - (1)].list); }
break;
case 65:
/* Line 22 of yacc.c */
#line 444 "parse-gram.y"
{ (yyval.list) = symbol_list_default_tagless_new ((yylsp[(1) - (1)])); }
#line 450 "parse-gram.y"
{ (yyval.list) = symbol_list_prepend ((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].list)); }
break;
case 66:
/* Line 22 of yacc.c */
#line 450 "parse-gram.y"
{
current_type = (yyvsp[(1) - (1)].uniqstr);
tag_seen = true;
}
#line 454 "parse-gram.y"
{ (yyval.list) = symbol_list_sym_new ((yyvsp[(1) - (1)].symbol), (yylsp[(1) - (1)])); }
break;
case 67:
/* Line 22 of yacc.c */
#line 455 "parse-gram.y"
{ (yyval.list) = symbol_list_type_new ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
break;
case 68:
/* Line 22 of yacc.c */
#line 456 "parse-gram.y"
{ (yyval.list) = symbol_list_default_tagged_new ((yylsp[(1) - (1)])); }
break;
case 69:
/* Line 22 of yacc.c */
#line 457 "parse-gram.y"
{ (yyval.list) = symbol_list_default_tagless_new ((yylsp[(1) - (1)])); }
break;
case 70:
/* Line 22 of yacc.c */
#line 463 "parse-gram.y"
{
current_type = (yyvsp[(1) - (1)].uniqstr);
tag_seen = true;
}
break;
case 71:
/* Line 22 of yacc.c */
#line 468 "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 68:
case 72:
/* Line 22 of yacc.c */
#line 460 "parse-gram.y"
#line 473 "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)]));
@@ -2403,10 +2436,10 @@ yyreduce:
}
break;
case 69:
case 73:
/* Line 22 of yacc.c */
#line 466 "parse-gram.y"
#line 479 "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)]));
@@ -2414,10 +2447,10 @@ yyreduce:
}
break;
case 70:
case 74:
/* Line 22 of yacc.c */
#line 472 "parse-gram.y"
#line 485 "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)]));
@@ -2426,98 +2459,98 @@ yyreduce:
}
break;
case 77:
case 81:
/* Line 22 of yacc.c */
#line 502 "parse-gram.y"
#line 515 "parse-gram.y"
{
yyerrok;
}
break;
case 78:
case 82:
/* Line 22 of yacc.c */
#line 508 "parse-gram.y"
#line 521 "parse-gram.y"
{ current_lhs = (yyvsp[(1) - (1)].symbol); current_lhs_location = (yylsp[(1) - (1)]); }
break;
case 80:
/* Line 22 of yacc.c */
#line 512 "parse-gram.y"
{ grammar_current_rule_end ((yylsp[(1) - (1)])); }
break;
case 81:
/* Line 22 of yacc.c */
#line 513 "parse-gram.y"
{ grammar_current_rule_end ((yylsp[(3) - (3)])); }
break;
case 83:
/* Line 22 of yacc.c */
#line 519 "parse-gram.y"
{ grammar_current_rule_begin (current_lhs, current_lhs_location); }
break;
case 84:
/* Line 22 of yacc.c */
#line 521 "parse-gram.y"
{ grammar_current_rule_symbol_append ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
#line 525 "parse-gram.y"
{ grammar_current_rule_end ((yylsp[(1) - (1)])); }
break;
case 85:
/* Line 22 of yacc.c */
#line 523 "parse-gram.y"
{ grammar_current_rule_action_append ((yyvsp[(2) - (2)].code), (yylsp[(2) - (2)])); }
break;
case 86:
/* Line 22 of yacc.c */
#line 525 "parse-gram.y"
{ grammar_current_rule_prec_set ((yyvsp[(3) - (3)].symbol), (yylsp[(3) - (3)])); }
#line 526 "parse-gram.y"
{ grammar_current_rule_end ((yylsp[(3) - (3)])); }
break;
case 87:
/* Line 22 of yacc.c */
#line 527 "parse-gram.y"
{ grammar_current_rule_dprec_set ((yyvsp[(3) - (3)].integer), (yylsp[(3) - (3)])); }
#line 532 "parse-gram.y"
{ grammar_current_rule_begin (current_lhs, current_lhs_location); }
break;
case 88:
/* Line 22 of yacc.c */
#line 529 "parse-gram.y"
{ grammar_current_rule_merge_set ((yyvsp[(3) - (3)].uniqstr), (yylsp[(3) - (3)])); }
#line 534 "parse-gram.y"
{ grammar_current_rule_symbol_append ((yyvsp[(2) - (2)].symbol), (yylsp[(2) - (2)])); }
break;
case 89:
/* Line 22 of yacc.c */
#line 536 "parse-gram.y"
{ grammar_current_rule_action_append ((yyvsp[(2) - (2)].code), (yylsp[(2) - (2)])); }
break;
case 90:
/* Line 22 of yacc.c */
#line 539 "parse-gram.y"
{ (yyval.uniqstr) = uniqstr_new ((yyvsp[(1) - (1)].chars)); }
#line 538 "parse-gram.y"
{ grammar_current_rule_prec_set ((yyvsp[(3) - (3)].symbol), (yylsp[(3) - (3)])); }
break;
case 91:
/* Line 22 of yacc.c */
#line 545 "parse-gram.y"
#line 540 "parse-gram.y"
{ grammar_current_rule_dprec_set ((yyvsp[(3) - (3)].integer), (yylsp[(3) - (3)])); }
break;
case 92:
/* Line 22 of yacc.c */
#line 542 "parse-gram.y"
{ grammar_current_rule_merge_set ((yyvsp[(3) - (3)].uniqstr), (yylsp[(3) - (3)])); }
break;
case 94:
/* Line 22 of yacc.c */
#line 552 "parse-gram.y"
{ (yyval.uniqstr) = uniqstr_new ((yyvsp[(1) - (1)].chars)); }
break;
case 95:
/* Line 22 of yacc.c */
#line 558 "parse-gram.y"
{
(yyval.chars) = "";
}
break;
case 93:
case 97:
/* Line 22 of yacc.c */
#line 558 "parse-gram.y"
#line 571 "parse-gram.y"
{
code_props plain_code;
(yyvsp[(1) - (1)].code)[strlen ((yyvsp[(1) - (1)].code)) - 1] = '\n';
@@ -2528,17 +2561,17 @@ yyreduce:
}
break;
case 94:
case 98:
/* Line 22 of yacc.c */
#line 578 "parse-gram.y"
#line 591 "parse-gram.y"
{ (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
break;
case 95:
case 99:
/* Line 22 of yacc.c */
#line 580 "parse-gram.y"
#line 593 "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);
@@ -2546,27 +2579,27 @@ yyreduce:
}
break;
case 96:
case 100:
/* Line 22 of yacc.c */
#line 588 "parse-gram.y"
#line 601 "parse-gram.y"
{ (yyval.symbol) = symbol_from_uniqstr ((yyvsp[(1) - (1)].uniqstr), (yylsp[(1) - (1)])); }
break;
case 99:
case 103:
/* Line 22 of yacc.c */
#line 600 "parse-gram.y"
#line 613 "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 101:
case 105:
/* Line 22 of yacc.c */
#line 609 "parse-gram.y"
#line 622 "parse-gram.y"
{
code_props plain_code;
code_props_plain_init (&plain_code, (yyvsp[(2) - (2)].chars), (yylsp[(2) - (2)]));
@@ -2580,7 +2613,7 @@ yyreduce:
/* Line 22 of yacc.c */
#line 2584 "parse-gram.c"
#line 2617 "parse-gram.c"
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2799,7 +2832,7 @@ yyreturn:
/* Line 22 of yacc.c */
#line 619 "parse-gram.y"
#line 632 "parse-gram.y"

View File

@@ -1,7 +1,7 @@
%{/* Bison Grammar Parser -*- C -*-
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation,
Inc.
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
@@ -192,12 +192,12 @@ static int current_prec = 0;
%type <integer> INT
%printer { fprintf (stderr, "%d", $$); } INT
%type <symbol> id id_colon symbol string_as_id
%type <symbol> id id_colon symbol symbol.prec string_as_id
%printer { fprintf (stderr, "%s", $$->tag); } id symbol string_as_id
%printer { fprintf (stderr, "%s:", $$->tag); } id_colon
%type <assoc> precedence_declarator
%type <list> symbols.1 generic_symlist generic_symlist_item
%type <list> symbols.1 symbols.prec generic_symlist generic_symlist_item
%%
input:
@@ -399,7 +399,7 @@ symbol_declaration:
;
precedence_declaration:
precedence_declarator type.opt symbols.1
precedence_declarator type.opt symbols.prec
{
symbol_list *list;
++current_prec;
@@ -424,6 +424,19 @@ type.opt:
| TYPE { current_type = $1; tag_seen = true; }
;
/* Just like symbols.1 but accept INT for the sake of POSIX. */
symbols.prec:
symbol.prec
{ $$ = symbol_list_sym_new ($1, @1); }
| symbols.prec symbol.prec
{ $$ = symbol_list_prepend ($1, symbol_list_sym_new ($2, @2)); }
;
symbol.prec:
symbol { $$ = $1; }
| symbol INT { $$ = $1; symbol_user_token_number_set ($1, $2, @2); }
;
/* One or more symbols to be %typed. */
symbols.1:
symbol

View File

@@ -1,7 +1,7 @@
/* Symbol table manager for Bison.
Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free
Software Foundation, Inc.
Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
@@ -358,8 +358,6 @@ symbol_user_token_number_set (symbol *sym, int user_token_number, location loc)
{
int *user_token_numberp;
aver (sym->class == token_sym);
if (sym->user_token_number != USER_NUMBER_ALIAS)
user_token_numberp = &sym->user_token_number;
else

View File

@@ -1,6 +1,6 @@
# Bison Regressions. -*- Autotest -*-
# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software
# Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
@@ -1181,3 +1181,64 @@ state 2
]])
AT_CLEANUP
## ---------------------------------------- ##
## Token number in precedence declaration. ##
## ---------------------------------------- ##
AT_SETUP([[Token number in precedence declaration.]])
# POSIX says token numbers can be declared in %left, %right, and %nonassoc, but
# we lost this in Bison 1.50.
AT_DATA_GRAMMAR([input.y],
[[%{
#include <stdio.h>
void yyerror (char const *);
int yylex (void);
%}
%error-verbose
%left TK1 1 TK2 2 "tok alias" 3
%%
start: TK1 sr_conflict "tok alias" ;
sr_conflict:
TK2
| TK2 "tok alias"
;
%%
void
yyerror (char const *msg)
{
fprintf (stderr, "%s\n", msg);
}
int
yylex (void)
{
static int const input[] = { 1, 2, 3, 0 };
static int const *inputp = input;
return *inputp++;
}
int
main (void)
{
return yyparse ();
}
]])
AT_BISON_CHECK([[-o input.c input.y]], [[0]],,
[[input.y:24.5-19: warning: rule useless in parser due to conflicts: sr_conflict: TK2 "tok alias"
]])
AT_COMPILE([[input]])
AT_PARSER_CHECK([[./input]])
AT_CLEANUP