* src/reader.h, src/reader.c (symbol_list_new): Export it.

(symbol_list_prepend): New.
* src/parse-gram.y (%union): `list' is a new member.
(symbols.1): New, replaces...
(terms_to_prec.1, nterms_to_type.1): these.
* src/symtab.h, src/symtab.c (symbol_type_set, symbol_precedence_set)
Take a location as additional argument.
Adjust all callers.
This commit is contained in:
Akim Demaille
2002-06-17 07:04:24 +00:00
parent 74886d31e7
commit 1e0bab9276
8 changed files with 284 additions and 271 deletions

View File

@@ -1,3 +1,14 @@
2002-06-17 Akim Demaille <akim@epita.fr>
* src/reader.h, src/reader.c (symbol_list_new): Export it.
(symbol_list_prepend): New.
* src/parse-gram.y (%union): `list' is a new member.
(symbols.1): New, replaces...
(terms_to_prec.1, nterms_to_type.1): these.
* src/symtab.h, src/symtab.c (symbol_type_set, symbol_precedence_set)
Take a location as additional argument.
Adjust all callers.
2002-06-15 Akim Demaille <akim@epita.fr> 2002-06-15 Akim Demaille <akim@epita.fr>
* src/parse-gram.y: Move %token in the declaration section so that * src/parse-gram.y: Move %token in the declaration section so that

View File

@@ -225,12 +225,13 @@ int current_prec = 0;
#line 89 "parse-gram.y" #line 89 "parse-gram.y"
typedef union { typedef union {
symbol_t *symbol; symbol_t *symbol;
symbol_list *list;
int integer; int integer;
char *string; char *string;
associativity assoc; associativity assoc;
} yystype; } yystype;
/* Line 199 of /usr/local/share/bison/bison.simple. */ /* Line 199 of /usr/local/share/bison/bison.simple. */
#line 234 "parse-gram.c" #line 235 "parse-gram.c"
# define YYSTYPE yystype # define YYSTYPE yystype
# define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_TRIVIAL 1
#endif #endif
@@ -251,7 +252,7 @@ typedef struct yyltype
/* Line 219 of /usr/local/share/bison/bison.simple. */ /* Line 219 of /usr/local/share/bison/bison.simple. */
#line 255 "parse-gram.c" #line 256 "parse-gram.c"
#if ! defined (yyoverflow) || YYERROR_VERBOSE #if ! defined (yyoverflow) || YYERROR_VERBOSE
@@ -353,16 +354,16 @@ union yyalloc
/* YYFINAL -- State number of the termination state. */ /* YYFINAL -- State number of the termination state. */
#define YYFINAL 3 #define YYFINAL 3
#define YYFLAG -32768 #define YYFLAG -32768
#define YYLAST 102 #define YYLAST 111
/* YYNTOKENS -- Number of terminals. */ /* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 40 #define YYNTOKENS 40
/* YYNNTS -- Number of nonterminals. */ /* YYNNTS -- Number of nonterminals. */
#define YYNNTS 29 #define YYNNTS 26
/* YYNRULES -- Number of rules. */ /* YYNRULES -- Number of rules. */
#define YYNRULES 71 #define YYNRULES 67
/* YYNRULES -- Number of states. */ /* YYNRULES -- Number of states. */
#define YYNSTATES 97 #define YYNSTATES 93
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2 #define YYUNDEFTOK 2
@@ -414,47 +415,45 @@ static const unsigned char yyprhs[] =
0, 0, 3, 8, 9, 13, 15, 17, 19, 23, 0, 0, 3, 8, 9, 13, 15, 17, 19, 23,
25, 27, 30, 34, 36, 40, 42, 46, 48, 51, 25, 27, 30, 34, 36, 40, 42, 46, 48, 51,
53, 55, 57, 59, 61, 64, 67, 68, 72, 73, 53, 55, 57, 59, 61, 64, 67, 68, 72, 73,
77, 78, 83, 84, 89, 91, 93, 95, 96, 98, 77, 81, 85, 87, 89, 91, 92, 94, 96, 99,
100, 103, 105, 108, 110, 112, 115, 118, 122, 124, 101, 103, 106, 109, 113, 115, 118, 120, 123, 125,
127, 129, 132, 134, 137, 138, 144, 146, 150, 151, 128, 129, 135, 137, 141, 142, 145, 148, 152, 154,
154, 157, 161, 163, 165, 167, 169, 171, 173, 174, 156, 158, 160, 162, 164, 165, 168, 169
177, 178
}; };
/* YYRHS -- A `-1'-separated list of the rules' RHS. */ /* YYRHS -- A `-1'-separated list of the rules' RHS. */
static const signed char yyrhs[] = static const signed char yyrhs[] =
{ {
41, 0, -1, 42, 36, 57, 67, -1, -1, 42, 41, 0, -1, 42, 36, 54, 64, -1, -1, 42,
43, 68, -1, 44, -1, 37, -1, 25, -1, 21, 43, 65, -1, 44, -1, 37, -1, 25, -1, 21,
66, 66, -1, 23, -1, 17, -1, 13, 5, -1, 63, 63, -1, 23, -1, 17, -1, 13, 5, -1,
19, 31, 66, -1, 26, -1, 20, 31, 66, -1, 19, 31, 63, -1, 26, -1, 20, 31, 63, -1,
27, -1, 18, 31, 66, -1, 22, -1, 28, 66, 27, -1, 18, 31, 63, -1, 22, -1, 28, 63,
-1, 29, -1, 16, -1, 24, -1, 49, -1, 45, -1, 29, -1, 16, -1, 24, -1, 48, -1, 45,
-1, 14, 63, -1, 9, 39, -1, -1, 7, 46, -1, 14, 60, -1, 9, 39, -1, -1, 7, 46,
56, -1, -1, 6, 47, 56, -1, -1, 8, 30, 53, -1, -1, 6, 47, 53, -1, 8, 30, 51,
48, 53, -1, -1, 51, 52, 50, 54, -1, 10, -1, 49, 50, 51, -1, 10, -1, 11, -1, 12,
-1, 11, -1, 12, -1, -1, 30, -1, 35, -1, -1, -1, 30, -1, 60, -1, 51, 60, -1, 30,
53, 35, -1, 63, -1, 54, 63, -1, 30, -1, -1, 35, -1, 35, 5, -1, 35, 62, -1, 35,
35, -1, 35, 5, -1, 35, 65, -1, 35, 5, 5, 62, -1, 52, -1, 53, 52, -1, 55, -1,
65, -1, 55, -1, 56, 55, -1, 58, -1, 57, 54, 55, -1, 56, -1, 44, 32, -1, -1, 35,
58, -1, 59, -1, 44, 32, -1, -1, 35, 33, 33, 57, 58, 32, -1, 59, -1, 58, 34, 59,
60, 61, 32, -1, 62, -1, 61, 34, 62, -1, -1, -1, 59, 60, -1, 59, 61, -1, 59, 15,
-1, 62, 63, -1, 62, 64, -1, 62, 15, 63, 60, -1, 35, -1, 62, -1, 4, -1, 39, -1,
-1, 35, -1, 65, -1, 4, -1, 39, -1, 3, 3, -1, 3, -1, -1, 36, 38, -1, -1, 32,
-1, 3, -1, -1, 36, 38, -1, -1, 32, -1 -1
}; };
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const unsigned short yyrline[] = static const unsigned short yyrline[] =
{ {
0, 150, 150, 163, 165, 168, 170, 171, 172, 173, 0, 151, 151, 164, 166, 169, 171, 172, 173, 174,
174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
184, 185, 188, 190, 191, 195, 203, 203, 209, 209, 185, 186, 189, 191, 192, 196, 204, 204, 210, 210,
214, 214, 220, 220, 227, 229, 230, 233, 235, 239, 215, 224, 239, 241, 242, 245, 247, 252, 254, 258,
241, 245, 251, 259, 264, 269, 275, 281, 291, 294, 263, 268, 274, 280, 290, 293, 302, 304, 310, 312,
303, 305, 311, 313, 316, 316, 321, 323, 326, 329, 315, 315, 320, 322, 325, 328, 330, 332, 336, 338,
331, 333, 337, 339, 340, 343, 349, 358, 366, 371, 339, 342, 348, 357, 365, 370, 376, 378
377, 379
}; };
#endif #endif
@@ -472,12 +471,12 @@ static const char *const yytname[] =
"\"%skeleton\"", "\"%token-table\"", "TYPE", "\"=\"", "\";\"", "\":\"", "\"%skeleton\"", "\"%token-table\"", "TYPE", "\"=\"", "\";\"", "\":\"",
"\"|\"", "\"identifier\"", "\"%%\"", "PROLOGUE", "EPILOGUE", "\"|\"", "\"identifier\"", "\"%%\"", "PROLOGUE", "EPILOGUE",
"BRACED_CODE", "$axiom", "input", "declarations", "declaration", "BRACED_CODE", "$axiom", "input", "declarations", "declaration",
"grammar_declaration", "symbol_declaration", "@1", "@2", "@3", "grammar_declaration", "symbol_declaration", "@1", "@2",
"precedence_declaration", "@4", "precedence_declarator", "type.opt", "precedence_declaration", "precedence_declarator", "type.opt",
"nterms_to_type.1", "terms_to_prec.1", "symbol_def", "symbol_defs.1", "symbols.1", "symbol_def", "symbol_defs.1", "grammar",
"grammar", "rules_or_grammar_declaration", "rules", "@5", "rhses.1", "rules_or_grammar_declaration", "rules", "@3", "rhses.1", "rhs",
"rhs", "symbol", "action", "string_as_id", "string_content", "symbol", "action", "string_as_id", "string_content", "epilogue.opt",
"epilogue.opt", "semi_colon.opt", 0 "semi_colon.opt", 0
}; };
#endif #endif
@@ -498,11 +497,10 @@ static const unsigned char yyr1[] =
0, 40, 41, 42, 42, 43, 43, 43, 43, 43, 0, 40, 41, 42, 42, 43, 43, 43, 43, 43,
43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
43, 43, 44, 44, 44, 44, 46, 45, 47, 45, 43, 43, 44, 44, 44, 44, 46, 45, 47, 45,
48, 45, 50, 49, 51, 51, 51, 52, 52, 53, 45, 48, 49, 49, 49, 50, 50, 51, 51, 52,
53, 54, 54, 55, 55, 55, 55, 55, 56, 56, 52, 52, 52, 52, 53, 53, 54, 54, 55, 55,
57, 57, 58, 58, 60, 59, 61, 61, 62, 62, 57, 56, 58, 58, 59, 59, 59, 59, 60, 60,
62, 62, 63, 63, 63, 64, 65, 66, 67, 67, 60, 61, 62, 63, 64, 64, 65, 65
68, 68
}; };
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
@@ -511,11 +509,10 @@ static const unsigned char yyr2[] =
0, 2, 4, 0, 3, 1, 1, 1, 3, 1, 0, 2, 4, 0, 3, 1, 1, 1, 3, 1,
1, 2, 3, 1, 3, 1, 3, 1, 2, 1, 1, 2, 3, 1, 3, 1, 3, 1, 2, 1,
1, 1, 1, 1, 2, 2, 0, 3, 0, 3, 1, 1, 1, 1, 2, 2, 0, 3, 0, 3,
0, 4, 0, 4, 1, 1, 1, 0, 1, 1, 3, 3, 1, 1, 1, 0, 1, 1, 2, 1,
2, 1, 2, 1, 1, 2, 2, 3, 1, 2, 1, 2, 2, 3, 1, 2, 1, 2, 1, 2,
1, 2, 1, 2, 0, 5, 1, 3, 0, 2, 0, 5, 1, 3, 0, 2, 2, 3, 1, 1,
2, 3, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 0, 2, 0, 1
0, 1
}; };
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -523,48 +520,48 @@ static const unsigned char yyr2[] =
means the default is an error. */ means the default is an error. */
static const short yydefact[] = static const short yydefact[] =
{ {
3, 0, 0, 0, 28, 26, 0, 0, 34, 35, 3, 0, 0, 0, 28, 26, 0, 0, 32, 33,
36, 0, 0, 20, 10, 0, 0, 0, 0, 17, 34, 0, 0, 20, 10, 0, 0, 0, 0, 17,
9, 21, 7, 13, 15, 0, 19, 0, 6, 70, 9, 21, 7, 13, 15, 0, 19, 0, 6, 66,
5, 23, 22, 37, 0, 0, 30, 25, 11, 66, 5, 23, 22, 35, 0, 0, 0, 25, 11, 62,
64, 62, 24, 63, 0, 0, 0, 67, 0, 18, 60, 58, 24, 59, 0, 0, 0, 63, 0, 18,
0, 0, 68, 50, 52, 71, 4, 38, 32, 43, 0, 0, 64, 46, 48, 67, 4, 36, 0, 39,
44, 48, 29, 27, 0, 16, 12, 14, 8, 54, 40, 44, 29, 27, 30, 37, 16, 12, 14, 8,
53, 0, 51, 2, 0, 45, 46, 49, 39, 31, 50, 49, 0, 47, 2, 31, 41, 42, 45, 38,
58, 69, 33, 41, 47, 40, 0, 56, 42, 55, 54, 65, 43, 0, 52, 51, 54, 0, 61, 55,
58, 0, 65, 59, 60, 57, 61 56, 53, 57
}; };
/* YYPGOTO[NTERM-NUM]. */ /* YYPGOTO[NTERM-NUM]. */
static const short yydefgoto[] = static const short yydefgoto[] =
{ {
-1, 1, 2, 29, 51, 31, 35, 34, 64, 32, -1, 1, 2, 29, 51, 31, 35, 34, 32, 33,
74, 33, 58, 79, 82, 61, 62, 52, 53, 54, 58, 64, 61, 62, 52, 53, 54, 80, 83, 84,
80, 86, 87, 93, 94, 43, 48, 73, 56 65, 90, 43, 48, 74, 56
}; };
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */ STATE-NUM. */
static const short yypact[] = static const short yypact[] =
{ {
-32768, 9, 32,-32768,-32768,-32768, -13, -9,-32768,-32768, -32768, 23, 74,-32768,-32768,-32768, 1, -31,-32768,-32768,
-32768, 27, 0,-32768,-32768, 3, 5, 33, 60,-32768, -32768, 29, 0,-32768,-32768, 7, 10, 14, 39,-32768,
-32768,-32768,-32768,-32768,-32768, 60,-32768, 12,-32768, 34, -32768,-32768,-32768,-32768,-32768, 39,-32768, 18,-32768, 15,
-32768,-32768,-32768, 35, -24, -24,-32768,-32768,-32768,-32768, -32768,-32768,-32768, 16, -24, -24, 0,-32768,-32768,-32768,
-32768,-32768,-32768,-32768, 60, 60, 60,-32768, 60,-32768, -32768,-32768,-32768,-32768, 39, 39, 39,-32768, 39,-32768,
38, 49, 66,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 17, 19, 8,-32768,-32768,-32768,-32768,-32768, 0,-32768,
2,-32768, -24, -24, 47,-32768,-32768,-32768,-32768,-32768, 4,-32768, -24, -24, 0,-32768,-32768,-32768,-32768,-32768,
-32768, 29,-32768,-32768, 0, 80,-32768,-32768,-32768, 50, -32768,-32768, 20,-32768,-32768, 0, 45,-32768,-32768,-32768,
-32768,-32768, 0,-32768,-32768,-32768, -20, -2,-32768,-32768, -32768,-32768,-32768, -22, -2,-32768,-32768, 0,-32768,-32768,
-32768, 0,-32768,-32768,-32768, -2,-32768 -32768, -2,-32768
}; };
/* YYPGOTO[NTERM-NUM]. */ /* YYPGOTO[NTERM-NUM]. */
static const short yypgoto[] = static const short yypgoto[] =
{ {
-32768,-32768,-32768,-32768, 82,-32768,-32768,-32768,-32768,-32768, -32768,-32768,-32768,-32768, 47,-32768,-32768,-32768,-32768,-32768,
-32768,-32768,-32768,-32768,-32768, -47, 51,-32768, 36,-32768, -32768, -4, -23, 25,-32768, 9,-32768,-32768,-32768, -21,
-32768,-32768, -3, -12,-32768, -50, -17,-32768,-32768 -12,-32768, -55, 11,-32768,-32768
}; };
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
@@ -572,32 +569,34 @@ static const short yypgoto[] =
number is the opposite. If zero, do what YYDEFACT says. */ number is the opposite. If zero, do what YYDEFACT says. */
static const short yytable[] = static const short yytable[] =
{ {
42, 39, 40, 39, 40, 39, 59, 75, 49, 3, 42, 39, 40, 39, 40, 77, 59, 39, 37, 76,
76, 60, 89, 91, 90, 77, 77, 36, 4, 5, 85, 60, 86, 87, 4, 5, 6, 7, 8, 9,
6, 7, 8, 9, 10, 84, 12, 65, 66, 67, 10, 82, 12, 3, 4, 5, 6, 7, 8, 9,
37, 68, 38, 41, 44, 41, 45, 92, 4, 5, 10, 36, 12, 41, 38, 41, 49, 88, 44, 78,
6, 7, 8, 9, 10, 11, 12, 50, 13, 14, 78, 45, 47, 50, 72, 46, 57, 55, 39, 30,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 70, 71, 79, 50, 75, 66, 67, 68, 81, 69,
25, 26, 83, 47, 46, 57, 55, 81, 27, 28, 63, 73, 0, 79, 0, 91, 0, 0, 0, 0,
88, 69, 4, 5, 6, 7, 8, 9, 10, 96, 0, 0, 89, 0, 0, 92, 0, 0, 0, 89,
12, 70, 78, 39, 30, 85, 63, 95, 72, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
0, 50, 71 23, 24, 25, 26, 0, 0, 0, 0, 0, 0,
27, 28
}; };
static const short yycheck[] = static const short yycheck[] =
{ {
12, 3, 4, 3, 4, 3, 30, 5, 25, 0, 12, 3, 4, 3, 4, 60, 30, 3, 39, 5,
60, 35, 32, 15, 34, 62, 63, 30, 6, 7, 32, 35, 34, 15, 6, 7, 8, 9, 10, 11,
8, 9, 10, 11, 12, 75, 14, 44, 45, 46, 12, 76, 14, 0, 6, 7, 8, 9, 10, 11,
39, 48, 5, 35, 31, 35, 31, 39, 6, 7, 12, 30, 14, 35, 5, 35, 25, 39, 31, 62,
8, 9, 10, 11, 12, 13, 14, 35, 16, 17, 63, 31, 3, 35, 36, 31, 30, 32, 3, 2,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 33, 32, 64, 35, 58, 44, 45, 46, 38, 48,
28, 29, 74, 3, 31, 30, 32, 38, 36, 37, 35, 52, -1, 75, -1, 86, -1, -1, -1, -1,
82, 33, 6, 7, 8, 9, 10, 11, 12, 91, -1, -1, 84, -1, -1, 87, -1, -1, -1, 91,
14, 32, 35, 3, 2, 35, 35, 90, 52, -1, 6, 7, 8, 9, 10, 11, 12, 13, 14, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
-1, 35, 36 26, 27, 28, 29, -1, -1, -1, -1, -1, -1,
36, 37
}; };
#if YYDEBUG #if YYDEBUG
@@ -608,13 +607,13 @@ static const unsigned char yystos[] =
0, 41, 42, 0, 6, 7, 8, 9, 10, 11, 0, 41, 42, 0, 6, 7, 8, 9, 10, 11,
12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 36, 37, 43, 23, 24, 25, 26, 27, 28, 29, 36, 37, 43,
44, 45, 49, 51, 47, 46, 30, 39, 5, 3, 44, 45, 48, 49, 47, 46, 30, 39, 5, 3,
4, 35, 63, 65, 31, 31, 31, 3, 66, 66, 4, 35, 60, 62, 31, 31, 31, 3, 63, 63,
35, 44, 57, 58, 59, 32, 68, 30, 52, 30, 35, 44, 54, 55, 56, 32, 65, 30, 50, 30,
35, 55, 56, 56, 48, 66, 66, 66, 66, 33, 35, 52, 53, 53, 51, 60, 63, 63, 63, 63,
32, 36, 58, 67, 50, 5, 65, 55, 35, 53, 33, 32, 36, 55, 64, 51, 5, 62, 52, 60,
60, 38, 54, 63, 65, 35, 61, 62, 63, 32, 57, 38, 62, 58, 59, 32, 34, 15, 39, 60,
34, 15, 39, 63, 64, 62, 63 61, 59, 60
}; };
#endif #endif
@@ -1184,7 +1183,7 @@ yyreduce:
switch (yyn) switch (yyn)
{ {
case 2: case 2:
#line 152 "parse-gram.y" #line 153 "parse-gram.y"
{ {
yycontrol->errcode = 0; yycontrol->errcode = 0;
epilogue_set (yyvsp[0].string, yylsp[0]); epilogue_set (yyvsp[0].string, yylsp[0]);
@@ -1192,94 +1191,94 @@ yyreduce:
break; break;
case 6: case 6:
#line 170 "parse-gram.y" #line 171 "parse-gram.y"
{ prologue_augment (yyvsp[0].string, yylsp[0]); } { prologue_augment (yyvsp[0].string, yylsp[0]); }
break; break;
case 7: case 7:
#line 171 "parse-gram.y" #line 172 "parse-gram.y"
{ debug_flag = 1; } { debug_flag = 1; }
break; break;
case 8: case 8:
#line 172 "parse-gram.y" #line 173 "parse-gram.y"
{ muscle_insert (yyvsp[-1].string, yyvsp[0].string); } { muscle_insert (yyvsp[-1].string, yyvsp[0].string); }
break; break;
case 9: case 9:
#line 173 "parse-gram.y" #line 174 "parse-gram.y"
{ defines_flag = 1; } { defines_flag = 1; }
break; break;
case 10: case 10:
#line 174 "parse-gram.y" #line 175 "parse-gram.y"
{ error_verbose = 1; } { error_verbose = 1; }
break; break;
case 11: case 11:
#line 175 "parse-gram.y" #line 176 "parse-gram.y"
{ expected_conflicts = yyvsp[0].integer; } { expected_conflicts = yyvsp[0].integer; }
break; break;
case 12: case 12:
#line 176 "parse-gram.y" #line 177 "parse-gram.y"
{ spec_file_prefix = yyvsp[0].string; } { spec_file_prefix = yyvsp[0].string; }
break; break;
case 13: case 13:
#line 177 "parse-gram.y" #line 178 "parse-gram.y"
{ locations_flag = 1; } { locations_flag = 1; }
break; break;
case 14: case 14:
#line 178 "parse-gram.y" #line 179 "parse-gram.y"
{ spec_name_prefix = yyvsp[0].string; } { spec_name_prefix = yyvsp[0].string; }
break; break;
case 15: case 15:
#line 179 "parse-gram.y" #line 180 "parse-gram.y"
{ no_lines_flag = 1; } { no_lines_flag = 1; }
break; break;
case 16: case 16:
#line 180 "parse-gram.y" #line 181 "parse-gram.y"
{ spec_outfile = yyvsp[0].string; } { spec_outfile = yyvsp[0].string; }
break; break;
case 17: case 17:
#line 181 "parse-gram.y" #line 182 "parse-gram.y"
{ pure_parser = 1; } { pure_parser = 1; }
break; break;
case 18: case 18:
#line 182 "parse-gram.y" #line 183 "parse-gram.y"
{ skeleton = yyvsp[0].string; } { skeleton = yyvsp[0].string; }
break; break;
case 19: case 19:
#line 183 "parse-gram.y" #line 184 "parse-gram.y"
{ token_table_flag = 1; } { token_table_flag = 1; }
break; break;
case 20: case 20:
#line 184 "parse-gram.y" #line 185 "parse-gram.y"
{ report_flag = 1; } { report_flag = 1; }
break; break;
case 21: case 21:
#line 185 "parse-gram.y" #line 186 "parse-gram.y"
{ yacc_flag = 1; } { yacc_flag = 1; }
break; break;
case 24: case 24:
#line 192 "parse-gram.y" #line 193 "parse-gram.y"
{ {
grammar_start_symbol_set (yyvsp[0].symbol, yylsp[0]); grammar_start_symbol_set (yyvsp[0].symbol, yylsp[0]);
} }
break; break;
case 25: case 25:
#line 196 "parse-gram.y" #line 197 "parse-gram.y"
{ {
typed = 1; typed = 1;
MUSCLE_INSERT_INT ("stype_line", yylsp[0].first_line); MUSCLE_INSERT_INT ("stype_line", yylsp[0].first_line);
@@ -1288,12 +1287,12 @@ yyreduce:
break; break;
case 26: case 26:
#line 204 "parse-gram.y" #line 205 "parse-gram.y"
{ current_class = nterm_sym; } { current_class = nterm_sym; }
break; break;
case 27: case 27:
#line 205 "parse-gram.y" #line 206 "parse-gram.y"
{ {
current_class = unknown_sym; current_class = unknown_sym;
current_type = NULL; current_type = NULL;
@@ -1301,12 +1300,12 @@ yyreduce:
break; break;
case 28: case 28:
#line 209 "parse-gram.y" #line 210 "parse-gram.y"
{ current_class = token_sym; } { current_class = token_sym; }
break; break;
case 29: case 29:
#line 210 "parse-gram.y" #line 211 "parse-gram.y"
{ {
current_class = unknown_sym; current_class = unknown_sym;
current_type = NULL; current_type = NULL;
@@ -1314,216 +1313,203 @@ yyreduce:
break; break;
case 30: case 30:
#line 214 "parse-gram.y" #line 216 "parse-gram.y"
{current_type = yyvsp[0].string; } {
symbol_list *list;
for (list = yyvsp[0].list; list; list = list->next)
symbol_type_set (list->sym, list->location, yyvsp[-1].string);
LIST_FREE (symbol_list, yyvsp[0].list);
}
break; break;
case 31: case 31:
#line 215 "parse-gram.y" #line 226 "parse-gram.y"
{ {
symbol_list *list;
++current_prec;
for (list = yyvsp[0].list; list; list = list->next)
{
symbol_type_set (list->sym, list->location, current_type);
symbol_precedence_set (list->sym, list->location, current_prec, yyvsp[-2].assoc);
}
LIST_FREE (symbol_list, yyvsp[0].list);
current_type = NULL; current_type = NULL;
} }
break; break;
case 32: case 32:
#line 222 "parse-gram.y" #line 240 "parse-gram.y"
{ current_assoc = yyvsp[-1].assoc; ++current_prec; }
break;
case 33:
#line 224 "parse-gram.y"
{ current_assoc = non_assoc; current_type = NULL; }
break;
case 34:
#line 228 "parse-gram.y"
{ yyval.assoc = left_assoc; } { yyval.assoc = left_assoc; }
break; break;
case 35: case 33:
#line 229 "parse-gram.y" #line 241 "parse-gram.y"
{ yyval.assoc = right_assoc; } { yyval.assoc = right_assoc; }
break; break;
case 36: case 34:
#line 230 "parse-gram.y" #line 242 "parse-gram.y"
{ yyval.assoc = non_assoc; } { yyval.assoc = non_assoc; }
break; break;
case 37: case 35:
#line 234 "parse-gram.y" #line 246 "parse-gram.y"
{ current_type = NULL;} { current_type = NULL;}
break; break;
case 38: case 36:
#line 235 "parse-gram.y" #line 247 "parse-gram.y"
{ current_type = yyvsp[0].string; } { current_type = yyvsp[0].string; }
break; break;
case 37:
#line 253 "parse-gram.y"
{ yyval.list = symbol_list_new (yyvsp[0].symbol, yylsp[0]); }
break;
case 38:
#line 254 "parse-gram.y"
{ yyval.list = symbol_list_prepend (yyvsp[-1].list, yyvsp[0].symbol, yylsp[0]); }
break;
case 39: case 39:
#line 240 "parse-gram.y" #line 260 "parse-gram.y"
{ symbol_type_set (yyvsp[0].symbol, current_type); }
break;
case 40:
#line 241 "parse-gram.y"
{ symbol_type_set (yyvsp[0].symbol, current_type); }
break;
case 41:
#line 247 "parse-gram.y"
{
symbol_type_set (yyvsp[0].symbol, current_type);
symbol_precedence_set (yyvsp[0].symbol, current_prec, current_assoc);
}
break;
case 42:
#line 252 "parse-gram.y"
{
symbol_type_set (yyvsp[0].symbol, current_type);
symbol_precedence_set (yyvsp[0].symbol, current_prec, current_assoc);
}
break;
case 43:
#line 261 "parse-gram.y"
{ {
current_type = yyvsp[0].string; current_type = yyvsp[0].string;
} }
break; break;
case 44: case 40:
#line 265 "parse-gram.y" #line 264 "parse-gram.y"
{ {
symbol_class_set (yyvsp[0].symbol, current_class); symbol_class_set (yyvsp[0].symbol, current_class);
symbol_type_set (yyvsp[0].symbol, current_type); symbol_type_set (yyvsp[0].symbol, yylsp[0], current_type);
} }
break; break;
case 45: case 41:
#line 270 "parse-gram.y" #line 269 "parse-gram.y"
{ {
symbol_class_set (yyvsp[-1].symbol, current_class); symbol_class_set (yyvsp[-1].symbol, current_class);
symbol_type_set (yyvsp[-1].symbol, current_type); symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
symbol_user_token_number_set (yyvsp[-1].symbol, yyvsp[0].integer); symbol_user_token_number_set (yyvsp[-1].symbol, yyvsp[0].integer);
} }
break; break;
case 46: case 42:
#line 276 "parse-gram.y" #line 275 "parse-gram.y"
{ {
symbol_class_set (yyvsp[-1].symbol, current_class); symbol_class_set (yyvsp[-1].symbol, current_class);
symbol_type_set (yyvsp[-1].symbol, current_type); symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
symbol_make_alias (yyvsp[-1].symbol, yyvsp[0].symbol); symbol_make_alias (yyvsp[-1].symbol, yyvsp[0].symbol);
} }
break; break;
case 47: case 43:
#line 282 "parse-gram.y" #line 281 "parse-gram.y"
{ {
symbol_class_set (yyvsp[-2].symbol, current_class); symbol_class_set (yyvsp[-2].symbol, current_class);
symbol_type_set (yyvsp[-2].symbol, current_type); symbol_type_set (yyvsp[-2].symbol, yylsp[-2], current_type);
symbol_user_token_number_set (yyvsp[-2].symbol, yyvsp[-1].integer); symbol_user_token_number_set (yyvsp[-2].symbol, yyvsp[-1].integer);
symbol_make_alias (yyvsp[-2].symbol, yyvsp[0].symbol); symbol_make_alias (yyvsp[-2].symbol, yyvsp[0].symbol);
} }
break; break;
case 48: case 44:
#line 293 "parse-gram.y" #line 292 "parse-gram.y"
{;} {;}
break; break;
case 49: case 45:
#line 295 "parse-gram.y" #line 294 "parse-gram.y"
{;} {;}
break; break;
case 54: case 50:
#line 317 "parse-gram.y" #line 316 "parse-gram.y"
{ current_lhs = yyvsp[-1].symbol; current_lhs_location = yylsp[-1]; } { current_lhs = yyvsp[-1].symbol; current_lhs_location = yylsp[-1]; }
break; break;
case 55: case 51:
#line 318 "parse-gram.y" #line 317 "parse-gram.y"
{;} {;}
break; break;
case 56: case 52:
#line 321 "parse-gram.y"
{ grammar_rule_end (yylsp[0]); }
break;
case 53:
#line 322 "parse-gram.y" #line 322 "parse-gram.y"
{ grammar_rule_end (yylsp[0]); } { grammar_rule_end (yylsp[0]); }
break; break;
case 57: case 54:
#line 323 "parse-gram.y" #line 327 "parse-gram.y"
{ grammar_rule_end (yylsp[0]); }
break;
case 58:
#line 328 "parse-gram.y"
{ grammar_rule_begin (current_lhs, current_lhs_location); } { grammar_rule_begin (current_lhs, current_lhs_location); }
break; break;
case 59: case 55:
#line 330 "parse-gram.y" #line 329 "parse-gram.y"
{ grammar_current_rule_symbol_append (yyvsp[0].symbol, yylsp[0]); } { grammar_current_rule_symbol_append (yyvsp[0].symbol, yylsp[0]); }
break; break;
case 60: case 56:
#line 332 "parse-gram.y" #line 331 "parse-gram.y"
{ grammar_current_rule_action_append (yyvsp[0].string, yylsp[0]); } { grammar_current_rule_action_append (yyvsp[0].string, yylsp[0]); }
break; break;
case 61: case 57:
#line 334 "parse-gram.y" #line 333 "parse-gram.y"
{ grammar_current_rule_prec_set (yyvsp[0].symbol); } { grammar_current_rule_prec_set (yyvsp[0].symbol); }
break; break;
case 62: case 58:
#line 337 "parse-gram.y"
{ yyval.symbol = yyvsp[0].symbol; }
break;
case 59:
#line 338 "parse-gram.y" #line 338 "parse-gram.y"
{ yyval.symbol = yyvsp[0].symbol; } { yyval.symbol = yyvsp[0].symbol; }
break; break;
case 63: case 60:
#line 339 "parse-gram.y" #line 339 "parse-gram.y"
{ yyval.symbol = yyvsp[0].symbol; }
break;
case 64:
#line 340 "parse-gram.y"
{ yyval.symbol = getsym (yyvsp[0].string, yylsp[0]); } { yyval.symbol = getsym (yyvsp[0].string, yylsp[0]); }
break; break;
case 65: case 61:
#line 345 "parse-gram.y" #line 344 "parse-gram.y"
{ yyval.string = yyvsp[0].string; } { yyval.string = yyvsp[0].string; }
break; break;
case 66: case 62:
#line 351 "parse-gram.y" #line 350 "parse-gram.y"
{ {
yyval.symbol = getsym (yyvsp[0].string, yylsp[0]); yyval.symbol = getsym (yyvsp[0].string, yylsp[0]);
symbol_class_set (yyval.symbol, token_sym); symbol_class_set (yyval.symbol, token_sym);
} }
break; break;
case 67: case 63:
#line 360 "parse-gram.y" #line 359 "parse-gram.y"
{ {
yyval.string = yyvsp[0].string + 1; yyval.string = yyvsp[0].string + 1;
yyval.string[strlen (yyval.string) - 1] = '\0'; yyval.string[strlen (yyval.string) - 1] = '\0';
} }
break; break;
case 68: case 64:
#line 368 "parse-gram.y" #line 367 "parse-gram.y"
{ {
yyval.string = xstrdup (""); yyval.string = xstrdup ("");
} }
break; break;
case 69: case 65:
#line 372 "parse-gram.y" #line 371 "parse-gram.y"
{ {
yyval.string = yyvsp[0].string; yyval.string = yyvsp[0].string;
} }
@@ -1533,7 +1519,7 @@ yyreduce:
} }
/* Line 1012 of /usr/local/share/bison/bison.simple. */ /* Line 1012 of /usr/local/share/bison/bison.simple. */
#line 1537 "parse-gram.c" #line 1523 "parse-gram.c"
yyvsp -= yylen; yyvsp -= yylen;
yyssp -= yylen; yyssp -= yylen;
@@ -1754,7 +1740,7 @@ yyreturn:
return yyresult; return yyresult;
} }
#line 381 "parse-gram.y" #line 380 "parse-gram.y"
/*------------------------------------------------------------------. /*------------------------------------------------------------------.
| When debugging the parser, display tokens' locations and values. | | When debugging the parser, display tokens' locations and values. |

View File

@@ -96,12 +96,13 @@
#line 89 "parse-gram.y" #line 89 "parse-gram.y"
typedef union { typedef union {
symbol_t *symbol; symbol_t *symbol;
symbol_list *list;
int integer; int integer;
char *string; char *string;
associativity assoc; associativity assoc;
} yystype; } yystype;
/* Line 1271 of /usr/local/share/bison/bison.simple. */ /* Line 1271 of /usr/local/share/bison/bison.simple. */
#line 105 "y.tab.h" #line 106 "y.tab.h"
# define YYSTYPE yystype # define YYSTYPE yystype
#endif #endif

View File

@@ -88,6 +88,7 @@ int current_prec = 0;
%union %union
{ {
symbol_t *symbol; symbol_t *symbol;
symbol_list *list;
int integer; int integer;
char *string; char *string;
associativity assoc; associativity assoc;
@@ -144,7 +145,7 @@ int current_prec = 0;
%type <integer> INT %type <integer> INT
%type <symbol> ID symbol string_as_id %type <symbol> ID symbol string_as_id
%type <assoc> precedence_declarator %type <assoc> precedence_declarator
%type <list> symbols.1
%% %%
input: input:
@@ -211,17 +212,28 @@ symbol_declaration:
current_class = unknown_sym; current_class = unknown_sym;
current_type = NULL; current_type = NULL;
} }
| "%type" TYPE {current_type = $2; } nterms_to_type.1 | "%type" TYPE symbols.1
{ {
current_type = NULL; symbol_list *list;
for (list = $3; list; list = list->next)
symbol_type_set (list->sym, list->location, $2);
LIST_FREE (symbol_list, $3);
} }
; ;
precedence_declaration: precedence_declaration:
precedence_declarator type.opt precedence_declarator type.opt symbols.1
{ current_assoc = $1; ++current_prec; } {
terms_to_prec.1 symbol_list *list;
{ current_assoc = non_assoc; current_type = NULL; } ++current_prec;
for (list = $3; list; list = list->next)
{
symbol_type_set (list->sym, list->location, current_type);
symbol_precedence_set (list->sym, list->location, current_prec, $1);
}
LIST_FREE (symbol_list, $3);
current_type = NULL;
}
; ;
precedence_declarator: precedence_declarator:
@@ -236,23 +248,10 @@ type.opt:
; ;
/* One or more nonterminals to be %typed. */ /* One or more nonterminals to be %typed. */
nterms_to_type.1:
ID { symbol_type_set ($1, current_type); }
| nterms_to_type.1 ID { symbol_type_set ($2, current_type); }
;
/* One or more symbols to be given a precedence/associativity. */ symbols.1:
terms_to_prec.1: symbol { $$ = symbol_list_new ($1, @1); }
symbol | symbols.1 symbol { $$ = symbol_list_prepend ($1, $2, @2); }
{
symbol_type_set ($1, current_type);
symbol_precedence_set ($1, current_prec, current_assoc);
}
| terms_to_prec.1 symbol
{
symbol_type_set ($2, current_type);
symbol_precedence_set ($2, current_prec, current_assoc);
}
; ;
/* One token definition. */ /* One token definition. */
@@ -264,24 +263,24 @@ symbol_def:
| ID | ID
{ {
symbol_class_set ($1, current_class); symbol_class_set ($1, current_class);
symbol_type_set ($1, current_type); symbol_type_set ($1, @1, current_type);
} }
| ID INT | ID INT
{ {
symbol_class_set ($1, current_class); symbol_class_set ($1, current_class);
symbol_type_set ($1, current_type); symbol_type_set ($1, @1, current_type);
symbol_user_token_number_set ($1, $2); symbol_user_token_number_set ($1, $2);
} }
| ID string_as_id | ID string_as_id
{ {
symbol_class_set ($1, current_class); symbol_class_set ($1, current_class);
symbol_type_set ($1, current_type); symbol_type_set ($1, @1, current_type);
symbol_make_alias ($1, $2); symbol_make_alias ($1, $2);
} }
| ID INT string_as_id | ID INT string_as_id
{ {
symbol_class_set ($1, current_class); symbol_class_set ($1, current_class);
symbol_type_set ($1, current_type); symbol_type_set ($1, @1, current_type);
symbol_user_token_number_set ($1, $2); symbol_user_token_number_set ($1, $2);
symbol_make_alias ($1, $3); symbol_make_alias ($1, $3);
} }

View File

@@ -41,7 +41,7 @@ static int start_flag = 0;
/* Nonzero if %union has been seen. */ /* Nonzero if %union has been seen. */
int typed = 0; int typed = 0;
static symbol_list * symbol_list *
symbol_list_new (symbol_t *sym, location_t location) symbol_list_new (symbol_t *sym, location_t location)
{ {
symbol_list *res = XMALLOC (symbol_list, 1); symbol_list *res = XMALLOC (symbol_list, 1);
@@ -53,6 +53,14 @@ symbol_list_new (symbol_t *sym, location_t location)
return res; return res;
} }
symbol_list *
symbol_list_prepend (symbol_list *list, symbol_t *symbol, location_t location)
{
symbol_list *res = symbol_list_new (symbol, location);
res->next = list;
return res;
}
/*--------------------------------------------------------------. /*--------------------------------------------------------------.
| Get the data type (alternative in the union) of the value for | | Get the data type (alternative in the union) of the value for |

View File

@@ -36,6 +36,10 @@ typedef struct symbol_list
symbol_t *ruleprec; symbol_t *ruleprec;
} symbol_list; } symbol_list;
symbol_list *symbol_list_new PARAMS ((symbol_t *sym, location_t location));
symbol_list *symbol_list_prepend PARAMS ((symbol_list *list,
symbol_t *sym, location_t location));
# include "parse-gram.h" # include "parse-gram.h"
typedef struct gram_control_s typedef struct gram_control_s

View File

@@ -102,12 +102,13 @@ symbol_tag_print (symbol_t *symbol, FILE *out)
`------------------------------------------------------------------*/ `------------------------------------------------------------------*/
void void
symbol_type_set (symbol_t *symbol, char *type_name) symbol_type_set (symbol_t *symbol, location_t location, char *type_name)
{ {
if (type_name) if (type_name)
{ {
if (symbol->type_name) if (symbol->type_name)
complain (_("type redeclaration for %s"), symbol->tag); complain_at (location,
_("type redeclaration for %s"), symbol->tag);
symbol->type_name = type_name; symbol->type_name = type_name;
} }
} }
@@ -119,13 +120,14 @@ symbol_type_set (symbol_t *symbol, char *type_name)
`------------------------------------------------------------------*/ `------------------------------------------------------------------*/
void void
symbol_precedence_set (symbol_t *symbol, symbol_precedence_set (symbol_t *symbol, location_t location,
int prec, associativity assoc) int prec, associativity assoc)
{ {
if (assoc != undef_assoc) if (assoc != undef_assoc)
{ {
if (symbol->prec != 0) if (symbol->prec != 0)
complain (_("redefining precedence of %s"), symbol->tag); complain_at (location,
_("redefining precedence of %s"), symbol->tag);
symbol->prec = prec; symbol->prec = prec;
symbol->assoc = assoc; symbol->assoc = assoc;
} }

View File

@@ -54,12 +54,13 @@ typedef short symbol_number_t;
typedef struct symbol_s symbol_t; typedef struct symbol_s symbol_t;
struct symbol_s struct symbol_s
{ {
/* The key, name of the symbol. */ /* The key, name of the symbol. */
char *tag; char *tag;
/* Its type. */
/* Its %type. */
char *type_name; char *type_name;
/* The location of its first occurence. */ /* The location of its first occurence. */
location_t location; location_t location;
symbol_number_t number; symbol_number_t number;
@@ -106,11 +107,12 @@ void symbol_make_alias PARAMS ((symbol_t *symbol, symbol_t *symval));
/* Set the TYPE_NAME associated to SYMBOL. Does nothing if passed 0 as /* Set the TYPE_NAME associated to SYMBOL. Does nothing if passed 0 as
TYPE_NAME. */ TYPE_NAME. */
void symbol_type_set PARAMS ((symbol_t *symbol, char *type_name)); void symbol_type_set PARAMS ((symbol_t *symbol, location_t location,
char *type_name));
/* Set the PRECEDENCE associated to SYMBOL. Ensures that SYMBOL is a /* Set the PRECEDENCE associated to SYMBOL. Ensures that SYMBOL is a
terminal. Does nothing if invoked with UNDEF_ASSOC as ASSOC. */ terminal. Does nothing if invoked with UNDEF_ASSOC as ASSOC. */
void symbol_precedence_set PARAMS ((symbol_t *symbol, void symbol_precedence_set PARAMS ((symbol_t *symbol, location_t location,
int prec, associativity assoc)); int prec, associativity assoc));
/* Set the CLASS associated to SYMBOL. */ /* Set the CLASS associated to SYMBOL. */