* src/reader.h, src/reader.c (symbol_list, symbol_list_new)

(symbol_list_prepend, get_type_name): Move to...
* src/symlist.h, src/symlist.c (symbol_list_t, symbol_list_new)
(symbol_list_prepend, symbol_list_n_type_name_get): here.
Adjust all callers.
(symbol_list_free): New.
* src/scan-gram.l (handle_dollar): Takes a location.
* tests/input.at (Invalid $n): Adjust.
This commit is contained in:
Akim Demaille
2002-06-17 07:04:49 +00:00
parent 1e0bab9276
commit 56c4720342
12 changed files with 298 additions and 196 deletions

View File

@@ -1,3 +1,15 @@
2002-06-17 Akim Demaille <akim@epita.fr>
* src/reader.h, src/reader.c (symbol_list, symbol_list_new)
(symbol_list_prepend, get_type_name): Move to...
* src/symlist.h, src/symlist.c (symbol_list_t, symbol_list_new)
(symbol_list_prepend, symbol_list_n_type_name_get): here.
Adjust all callers.
(symbol_list_free): New.
* src/scan-gram.l (handle_dollar): Takes a location.
* tests/input.at (Invalid $n): Adjust.
2002-06-17 Akim Demaille <akim@epita.fr> 2002-06-17 Akim Demaille <akim@epita.fr>
* src/reader.h, src/reader.c (symbol_list_new): Export it. * src/reader.h, src/reader.c (symbol_list_new): Export it.

View File

@@ -59,6 +59,7 @@ bison_SOURCES = \
scan-gram.l \ scan-gram.l \
scan-skel.l \ scan-skel.l \
state.c state.h \ state.c state.h \
symlist.c symlist.h \
symtab.c symtab.h \ symtab.c symtab.h \
system.h \ system.h \
types.h \ types.h \

View File

@@ -68,6 +68,7 @@
#include "files.h" #include "files.h"
#include "getargs.h" #include "getargs.h"
#include "output.h" #include "output.h"
#include "symlist.h"
#include "gram.h" #include "gram.h"
#include "reader.h" #include "reader.h"
#include "conflicts.h" #include "conflicts.h"
@@ -222,16 +223,16 @@ int current_prec = 0;
#endif #endif
#ifndef YYSTYPE #ifndef YYSTYPE
#line 89 "parse-gram.y" #line 90 "parse-gram.y"
typedef union { typedef union {
symbol_t *symbol; symbol_t *symbol;
symbol_list *list; symbol_list_t *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 235 "parse-gram.c" #line 236 "parse-gram.c"
# define YYSTYPE yystype # define YYSTYPE yystype
# define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_TRIVIAL 1
#endif #endif
@@ -252,7 +253,7 @@ typedef struct yyltype
/* Line 219 of /usr/local/share/bison/bison.simple. */ /* Line 219 of /usr/local/share/bison/bison.simple. */
#line 256 "parse-gram.c" #line 257 "parse-gram.c"
#if ! defined (yyoverflow) || YYERROR_VERBOSE #if ! defined (yyoverflow) || YYERROR_VERBOSE
@@ -447,13 +448,13 @@ static const signed char yyrhs[] =
/* 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, 151, 151, 164, 166, 169, 171, 172, 173, 174, 0, 152, 152, 165, 167, 170, 172, 173, 174, 175,
175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
185, 186, 189, 191, 192, 196, 204, 204, 210, 210, 186, 187, 190, 192, 193, 197, 205, 205, 211, 211,
215, 224, 239, 241, 242, 245, 247, 252, 254, 258, 216, 225, 240, 242, 243, 246, 248, 253, 255, 259,
263, 268, 274, 280, 290, 293, 302, 304, 310, 312, 264, 269, 275, 281, 291, 294, 303, 305, 311, 313,
315, 315, 320, 322, 325, 328, 330, 332, 336, 338, 316, 316, 321, 323, 326, 329, 331, 333, 337, 339,
339, 342, 348, 357, 365, 370, 376, 378 340, 343, 349, 358, 366, 371, 377, 379
}; };
#endif #endif
@@ -1183,7 +1184,7 @@ yyreduce:
switch (yyn) switch (yyn)
{ {
case 2: case 2:
#line 153 "parse-gram.y" #line 154 "parse-gram.y"
{ {
yycontrol->errcode = 0; yycontrol->errcode = 0;
epilogue_set (yyvsp[0].string, yylsp[0]); epilogue_set (yyvsp[0].string, yylsp[0]);
@@ -1191,94 +1192,94 @@ yyreduce:
break; break;
case 6: case 6:
#line 171 "parse-gram.y" #line 172 "parse-gram.y"
{ prologue_augment (yyvsp[0].string, yylsp[0]); } { prologue_augment (yyvsp[0].string, yylsp[0]); }
break; break;
case 7: case 7:
#line 172 "parse-gram.y" #line 173 "parse-gram.y"
{ debug_flag = 1; } { debug_flag = 1; }
break; break;
case 8: case 8:
#line 173 "parse-gram.y" #line 174 "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 174 "parse-gram.y" #line 175 "parse-gram.y"
{ defines_flag = 1; } { defines_flag = 1; }
break; break;
case 10: case 10:
#line 175 "parse-gram.y" #line 176 "parse-gram.y"
{ error_verbose = 1; } { error_verbose = 1; }
break; break;
case 11: case 11:
#line 176 "parse-gram.y" #line 177 "parse-gram.y"
{ expected_conflicts = yyvsp[0].integer; } { expected_conflicts = yyvsp[0].integer; }
break; break;
case 12: case 12:
#line 177 "parse-gram.y" #line 178 "parse-gram.y"
{ spec_file_prefix = yyvsp[0].string; } { spec_file_prefix = yyvsp[0].string; }
break; break;
case 13: case 13:
#line 178 "parse-gram.y" #line 179 "parse-gram.y"
{ locations_flag = 1; } { locations_flag = 1; }
break; break;
case 14: case 14:
#line 179 "parse-gram.y" #line 180 "parse-gram.y"
{ spec_name_prefix = yyvsp[0].string; } { spec_name_prefix = yyvsp[0].string; }
break; break;
case 15: case 15:
#line 180 "parse-gram.y" #line 181 "parse-gram.y"
{ no_lines_flag = 1; } { no_lines_flag = 1; }
break; break;
case 16: case 16:
#line 181 "parse-gram.y" #line 182 "parse-gram.y"
{ spec_outfile = yyvsp[0].string; } { spec_outfile = yyvsp[0].string; }
break; break;
case 17: case 17:
#line 182 "parse-gram.y" #line 183 "parse-gram.y"
{ pure_parser = 1; } { pure_parser = 1; }
break; break;
case 18: case 18:
#line 183 "parse-gram.y" #line 184 "parse-gram.y"
{ skeleton = yyvsp[0].string; } { skeleton = yyvsp[0].string; }
break; break;
case 19: case 19:
#line 184 "parse-gram.y" #line 185 "parse-gram.y"
{ token_table_flag = 1; } { token_table_flag = 1; }
break; break;
case 20: case 20:
#line 185 "parse-gram.y" #line 186 "parse-gram.y"
{ report_flag = 1; } { report_flag = 1; }
break; break;
case 21: case 21:
#line 186 "parse-gram.y" #line 187 "parse-gram.y"
{ yacc_flag = 1; } { yacc_flag = 1; }
break; break;
case 24: case 24:
#line 193 "parse-gram.y" #line 194 "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 197 "parse-gram.y" #line 198 "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);
@@ -1287,12 +1288,12 @@ yyreduce:
break; break;
case 26: case 26:
#line 205 "parse-gram.y" #line 206 "parse-gram.y"
{ current_class = nterm_sym; } { current_class = nterm_sym; }
break; break;
case 27: case 27:
#line 206 "parse-gram.y" #line 207 "parse-gram.y"
{ {
current_class = unknown_sym; current_class = unknown_sym;
current_type = NULL; current_type = NULL;
@@ -1300,12 +1301,12 @@ yyreduce:
break; break;
case 28: case 28:
#line 210 "parse-gram.y" #line 211 "parse-gram.y"
{ current_class = token_sym; } { current_class = token_sym; }
break; break;
case 29: case 29:
#line 211 "parse-gram.y" #line 212 "parse-gram.y"
{ {
current_class = unknown_sym; current_class = unknown_sym;
current_type = NULL; current_type = NULL;
@@ -1313,74 +1314,74 @@ yyreduce:
break; break;
case 30: case 30:
#line 216 "parse-gram.y" #line 217 "parse-gram.y"
{ {
symbol_list *list; symbol_list_t *list;
for (list = yyvsp[0].list; list; list = list->next) for (list = yyvsp[0].list; list; list = list->next)
symbol_type_set (list->sym, list->location, yyvsp[-1].string); symbol_type_set (list->sym, list->location, yyvsp[-1].string);
LIST_FREE (symbol_list, yyvsp[0].list); LIST_FREE (symbol_list_t, yyvsp[0].list);
} }
break; break;
case 31: case 31:
#line 226 "parse-gram.y" #line 227 "parse-gram.y"
{ {
symbol_list *list; symbol_list_t *list;
++current_prec; ++current_prec;
for (list = yyvsp[0].list; list; list = list->next) for (list = yyvsp[0].list; list; list = list->next)
{ {
symbol_type_set (list->sym, list->location, current_type); symbol_type_set (list->sym, list->location, current_type);
symbol_precedence_set (list->sym, list->location, current_prec, yyvsp[-2].assoc); symbol_precedence_set (list->sym, list->location, current_prec, yyvsp[-2].assoc);
} }
LIST_FREE (symbol_list, yyvsp[0].list); LIST_FREE (symbol_list_t, yyvsp[0].list);
current_type = NULL; current_type = NULL;
} }
break; break;
case 32: case 32:
#line 240 "parse-gram.y" #line 241 "parse-gram.y"
{ yyval.assoc = left_assoc; } { yyval.assoc = left_assoc; }
break; break;
case 33: case 33:
#line 241 "parse-gram.y" #line 242 "parse-gram.y"
{ yyval.assoc = right_assoc; } { yyval.assoc = right_assoc; }
break; break;
case 34: case 34:
#line 242 "parse-gram.y" #line 243 "parse-gram.y"
{ yyval.assoc = non_assoc; } { yyval.assoc = non_assoc; }
break; break;
case 35: case 35:
#line 246 "parse-gram.y" #line 247 "parse-gram.y"
{ current_type = NULL;} { current_type = NULL;}
break; break;
case 36: case 36:
#line 247 "parse-gram.y" #line 248 "parse-gram.y"
{ current_type = yyvsp[0].string; } { current_type = yyvsp[0].string; }
break; break;
case 37: case 37:
#line 253 "parse-gram.y" #line 254 "parse-gram.y"
{ yyval.list = symbol_list_new (yyvsp[0].symbol, yylsp[0]); } { yyval.list = symbol_list_new (yyvsp[0].symbol, yylsp[0]); }
break; break;
case 38: case 38:
#line 254 "parse-gram.y" #line 255 "parse-gram.y"
{ yyval.list = symbol_list_prepend (yyvsp[-1].list, yyvsp[0].symbol, yylsp[0]); } { yyval.list = symbol_list_prepend (yyvsp[-1].list, yyvsp[0].symbol, yylsp[0]); }
break; break;
case 39: case 39:
#line 260 "parse-gram.y" #line 261 "parse-gram.y"
{ {
current_type = yyvsp[0].string; current_type = yyvsp[0].string;
} }
break; break;
case 40: case 40:
#line 264 "parse-gram.y" #line 265 "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, yylsp[0], current_type); symbol_type_set (yyvsp[0].symbol, yylsp[0], current_type);
@@ -1388,7 +1389,7 @@ yyreduce:
break; break;
case 41: case 41:
#line 269 "parse-gram.y" #line 270 "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, yylsp[-1], current_type); symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
@@ -1397,7 +1398,7 @@ yyreduce:
break; break;
case 42: case 42:
#line 275 "parse-gram.y" #line 276 "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, yylsp[-1], current_type); symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
@@ -1406,7 +1407,7 @@ yyreduce:
break; break;
case 43: case 43:
#line 281 "parse-gram.y" #line 282 "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, yylsp[-2], current_type); symbol_type_set (yyvsp[-2].symbol, yylsp[-2], current_type);
@@ -1416,77 +1417,77 @@ yyreduce:
break; break;
case 44: case 44:
#line 292 "parse-gram.y" #line 293 "parse-gram.y"
{;} {;}
break; break;
case 45: case 45:
#line 294 "parse-gram.y" #line 295 "parse-gram.y"
{;} {;}
break; break;
case 50: case 50:
#line 316 "parse-gram.y" #line 317 "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 51: case 51:
#line 317 "parse-gram.y" #line 318 "parse-gram.y"
{;} {;}
break; break;
case 52: 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 53:
#line 323 "parse-gram.y"
{ grammar_rule_end (yylsp[0]); }
break;
case 54: case 54:
#line 327 "parse-gram.y" #line 328 "parse-gram.y"
{ grammar_rule_begin (current_lhs, current_lhs_location); } { grammar_rule_begin (current_lhs, current_lhs_location); }
break; break;
case 55: case 55:
#line 329 "parse-gram.y" #line 330 "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 56: case 56:
#line 331 "parse-gram.y" #line 332 "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 57: case 57:
#line 333 "parse-gram.y" #line 334 "parse-gram.y"
{ grammar_current_rule_prec_set (yyvsp[0].symbol); } { grammar_current_rule_prec_set (yyvsp[0].symbol); }
break; break;
case 58: 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 60: case 59:
#line 339 "parse-gram.y" #line 339 "parse-gram.y"
{ yyval.symbol = yyvsp[0].symbol; }
break;
case 60:
#line 340 "parse-gram.y"
{ yyval.symbol = getsym (yyvsp[0].string, yylsp[0]); } { yyval.symbol = getsym (yyvsp[0].string, yylsp[0]); }
break; break;
case 61: case 61:
#line 344 "parse-gram.y" #line 345 "parse-gram.y"
{ yyval.string = yyvsp[0].string; } { yyval.string = yyvsp[0].string; }
break; break;
case 62: case 62:
#line 350 "parse-gram.y" #line 351 "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);
@@ -1494,7 +1495,7 @@ yyreduce:
break; break;
case 63: case 63:
#line 359 "parse-gram.y" #line 360 "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';
@@ -1502,14 +1503,14 @@ yyreduce:
break; break;
case 64: case 64:
#line 367 "parse-gram.y" #line 368 "parse-gram.y"
{ {
yyval.string = xstrdup (""); yyval.string = xstrdup ("");
} }
break; break;
case 65: case 65:
#line 371 "parse-gram.y" #line 372 "parse-gram.y"
{ {
yyval.string = yyvsp[0].string; yyval.string = yyvsp[0].string;
} }
@@ -1519,7 +1520,7 @@ yyreduce:
} }
/* Line 1012 of /usr/local/share/bison/bison.simple. */ /* Line 1012 of /usr/local/share/bison/bison.simple. */
#line 1523 "parse-gram.c" #line 1524 "parse-gram.c"
yyvsp -= yylen; yyvsp -= yylen;
yyssp -= yylen; yyssp -= yylen;
@@ -1740,7 +1741,7 @@ yyreturn:
return yyresult; return yyresult;
} }
#line 380 "parse-gram.y" #line 381 "parse-gram.y"
/*------------------------------------------------------------------. /*------------------------------------------------------------------.
| When debugging the parser, display tokens' locations and values. | | When debugging the parser, display tokens' locations and values. |

View File

@@ -93,10 +93,10 @@
#ifndef YYSTYPE #ifndef YYSTYPE
#line 89 "parse-gram.y" #line 90 "parse-gram.y"
typedef union { typedef union {
symbol_t *symbol; symbol_t *symbol;
symbol_list *list; symbol_list_t *list;
int integer; int integer;
char *string; char *string;
associativity assoc; associativity assoc;

View File

@@ -34,6 +34,7 @@
#include "files.h" #include "files.h"
#include "getargs.h" #include "getargs.h"
#include "output.h" #include "output.h"
#include "symlist.h"
#include "gram.h" #include "gram.h"
#include "reader.h" #include "reader.h"
#include "conflicts.h" #include "conflicts.h"
@@ -88,7 +89,7 @@ int current_prec = 0;
%union %union
{ {
symbol_t *symbol; symbol_t *symbol;
symbol_list *list; symbol_list_t *list;
int integer; int integer;
char *string; char *string;
associativity assoc; associativity assoc;
@@ -214,24 +215,24 @@ symbol_declaration:
} }
| "%type" TYPE symbols.1 | "%type" TYPE symbols.1
{ {
symbol_list *list; symbol_list_t *list;
for (list = $3; list; list = list->next) for (list = $3; list; list = list->next)
symbol_type_set (list->sym, list->location, $2); symbol_type_set (list->sym, list->location, $2);
LIST_FREE (symbol_list, $3); LIST_FREE (symbol_list_t, $3);
} }
; ;
precedence_declaration: precedence_declaration:
precedence_declarator type.opt symbols.1 precedence_declarator type.opt symbols.1
{ {
symbol_list *list; symbol_list_t *list;
++current_prec; ++current_prec;
for (list = $3; list; list = list->next) for (list = $3; list; list = list->next)
{ {
symbol_type_set (list->sym, list->location, current_type); symbol_type_set (list->sym, list->location, current_type);
symbol_precedence_set (list->sym, list->location, current_prec, $1); symbol_precedence_set (list->sym, list->location, current_prec, $1);
} }
LIST_FREE (symbol_list, $3); LIST_FREE (symbol_list_t, $3);
current_type = NULL; current_type = NULL;
} }
; ;

View File

@@ -26,6 +26,7 @@
#include "getargs.h" #include "getargs.h"
#include "files.h" #include "files.h"
#include "symtab.h" #include "symtab.h"
#include "symlist.h"
#include "options.h" #include "options.h"
#include "gram.h" #include "gram.h"
#include "complain.h" #include "complain.h"
@@ -35,68 +36,12 @@
#include "muscle_tab.h" #include "muscle_tab.h"
int lineno; int lineno;
static symbol_list *grammar = NULL; static symbol_list_t *grammar = NULL;
static int start_flag = 0; static int start_flag = 0;
/* Nonzero if %union has been seen. */ /* Nonzero if %union has been seen. */
int typed = 0; int typed = 0;
symbol_list *
symbol_list_new (symbol_t *sym, location_t location)
{
symbol_list *res = XMALLOC (symbol_list, 1);
res->next = NULL;
res->sym = sym;
res->location = location;
res->action = NULL;
res->ruleprec = NULL;
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 |
| symbol N in rule RULE. |
`--------------------------------------------------------------*/
char *
get_type_name (int n, symbol_list *rule)
{
int i;
symbol_list *rp;
if (n < 0)
{
complain (_("invalid $ value"));
return NULL;
}
rp = rule;
i = 0;
while (i < n)
{
rp = rp->next;
if (rp == NULL || rp->sym == NULL)
{
complain (_("invalid $ value"));
return NULL;
}
++i;
}
return rp->sym->type_name;
}
/*-----------------------. /*-----------------------.
| Set the start symbol. | | Set the start symbol. |
`-----------------------*/ `-----------------------*/
@@ -183,7 +128,7 @@ gensym (location_t location)
} }
/*-------------------------------------------------------------------. /*-------------------------------------------------------------------.
| Parse the input grammar into a one symbol_list structure. Each | | Parse the input grammar into a one symbol_list_t structure. Each |
| rule is represented by a sequence of symbols: the left hand side | | rule is represented by a sequence of symbols: the left hand side |
| followed by the contents of the right hand side, followed by a | | followed by the contents of the right hand side, followed by a |
| null pointer instead of a symbol to terminate the rule. The next | | null pointer instead of a symbol to terminate the rule. The next |
@@ -201,13 +146,13 @@ gensym (location_t location)
`-------------------------------------------------------------------*/ `-------------------------------------------------------------------*/
/* The (currently) last symbol of GRAMMAR. */ /* The (currently) last symbol of GRAMMAR. */
symbol_list *grammar_end = NULL; symbol_list_t *grammar_end = NULL;
/* Append S to the GRAMMAR. */ /* Append S to the GRAMMAR. */
void void
grammar_symbol_append (symbol_t *symbol, location_t location) grammar_symbol_append (symbol_t *symbol, location_t location)
{ {
symbol_list *p = symbol_list_new (symbol, location); symbol_list_t *p = symbol_list_new (symbol, location);
if (grammar_end) if (grammar_end)
grammar_end->next = p; grammar_end->next = p;
@@ -220,8 +165,8 @@ grammar_symbol_append (symbol_t *symbol, location_t location)
/* The rule currently being defined, and the previous rule. /* The rule currently being defined, and the previous rule.
CURRENT_RULE points to the first LHS of the current rule, while CURRENT_RULE points to the first LHS of the current rule, while
PREVIOUS_RULE_END points to the *end* of the previous rule (NULL). */ PREVIOUS_RULE_END points to the *end* of the previous rule (NULL). */
symbol_list *current_rule = NULL; symbol_list_t *current_rule = NULL;
symbol_list *previous_rule_end = NULL; symbol_list_t *previous_rule_end = NULL;
/*----------------------------------------------. /*----------------------------------------------.
@@ -323,7 +268,7 @@ grammar_midrule_action (void)
action. Create the MIDRULE. */ action. Create the MIDRULE. */
location_t dummy_location = current_rule->action_location; location_t dummy_location = current_rule->action_location;
symbol_t *dummy = gensym (dummy_location); symbol_t *dummy = gensym (dummy_location);
symbol_list *midrule = symbol_list_new (dummy, dummy_location); symbol_list_t *midrule = symbol_list_new (dummy, dummy_location);
/* Make a new rule, whose body is empty, before the current one, so /* Make a new rule, whose body is empty, before the current one, so
that the action just read can belong to it. */ that the action just read can belong to it. */
@@ -397,7 +342,7 @@ packgram (void)
{ {
unsigned int itemno; unsigned int itemno;
int ruleno; int ruleno;
symbol_list *p; symbol_list_t *p;
ritem = XCALLOC (item_number_t, nritems); ritem = XCALLOC (item_number_t, nritems);
rules = XCALLOC (rule_t, nrules) - 1; rules = XCALLOC (rule_t, nrules) - 1;
@@ -518,7 +463,7 @@ reader (void)
axiom: %start EOF. */ axiom: %start EOF. */
{ {
symbol_list *p = symbol_list_new (axiom, empty_location); symbol_list_t *p = symbol_list_new (axiom, empty_location);
p->location = grammar->location; p->location = grammar->location;
p->next = symbol_list_new (startsymbol, empty_location); p->next = symbol_list_new (startsymbol, empty_location);
p->next->next = symbol_list_new (eoftoken, empty_location); p->next->next = symbol_list_new (eoftoken, empty_location);
@@ -544,6 +489,6 @@ reader (void)
/* Convert the grammar into the format described in gram.h. */ /* Convert the grammar into the format described in gram.h. */
packgram (); packgram ();
/* The grammar as a symbol_list is no longer needed. */ /* The grammar as a symbol_list_t is no longer needed. */
LIST_FREE (symbol_list, grammar); LIST_FREE (symbol_list_t, grammar);
} }

View File

@@ -21,25 +21,7 @@
#ifndef READER_H_ #ifndef READER_H_
# define READER_H_ # define READER_H_
# include "location.h" # include "symlist.h"
typedef struct symbol_list
{
struct symbol_list *next;
symbol_t *sym;
location_t location;
/* The action is attached to the LHS of a rule. */
const char *action;
location_t action_location;
symbol_t *ruleprec;
} 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
@@ -66,7 +48,6 @@ void gram_error (gram_control_t *control,
location_t *loc, const char *msg); location_t *loc, const char *msg);
int gram_parse (void *control); int gram_parse (void *control);
char *get_type_name PARAMS ((int n, symbol_list *rule));
extern int typed; extern int typed;
/* From reader.c. */ /* From reader.c. */
@@ -82,7 +63,7 @@ void grammar_current_rule_symbol_append PARAMS ((symbol_t *symbol,
location_t l)); location_t l));
void grammar_current_rule_action_append PARAMS ((const char *action, void grammar_current_rule_action_append PARAMS ((const char *action,
location_t l)); location_t l));
extern symbol_list *current_rule; extern symbol_list_t *current_rule;
void reader PARAMS ((void)); void reader PARAMS ((void));
#endif /* !READER_H_ */ #endif /* !READER_H_ */

View File

@@ -790,7 +790,7 @@ scanner_last_string_free (void)
static int braces_level = 0; static int braces_level = 0;
static int percent_percent_count = 0; static int percent_percent_count = 0;
static void handle_dollar PARAMS ((char *cp)); static void handle_dollar PARAMS ((char *cp, location_t location));
static void handle_at PARAMS ((char *cp)); static void handle_at PARAMS ((char *cp));
#define SC_COMMENT 1 #define SC_COMMENT 1
@@ -1696,7 +1696,7 @@ YY_OBS_GROW; braces_level++;
case 82: case 82:
YY_RULE_SETUP YY_RULE_SETUP
#line 444 "scan-gram.l" #line 444 "scan-gram.l"
{ handle_dollar (yytext); } { handle_dollar (yytext, *yylloc); }
YY_BREAK YY_BREAK
case 83: case 83:
YY_RULE_SETUP YY_RULE_SETUP
@@ -2701,7 +2701,7 @@ int main()
`------------------------------------------------------------------*/ `------------------------------------------------------------------*/
static void static void
handle_dollar (char *cp) handle_dollar (char *cp, location_t location)
{ {
const char *type_name = NULL; const char *type_name = NULL;
@@ -2710,7 +2710,7 @@ handle_dollar (char *cp)
stack. It is not the same as the rule->length in the case of mid stack. It is not the same as the rule->length in the case of mid
rule actions. */ rule actions. */
int rule_length = 0; int rule_length = 0;
symbol_list *rhs; symbol_list_t *rhs;
for (rhs = current_rule->next; rhs; rhs = rhs->next) for (rhs = current_rule->next; rhs; rhs = rhs->next)
++rule_length; ++rule_length;
@@ -2729,10 +2729,10 @@ handle_dollar (char *cp)
if (*cp == '$') if (*cp == '$')
{ {
if (!type_name) if (!type_name)
type_name = get_type_name (0, current_rule); type_name = symbol_list_n_type_name_get (current_rule, location, 0);
if (!type_name && typed) if (!type_name && typed)
complain (_("$$ of `%s' has no declared type"), complain_at (location, _("$$ of `%s' has no declared type"),
current_rule->sym->tag); current_rule->sym->tag);
if (!type_name) if (!type_name)
type_name = ""; type_name = "";
obstack_fgrow1 (&string_obstack, obstack_fgrow1 (&string_obstack,
@@ -2743,13 +2743,14 @@ handle_dollar (char *cp)
int n = strtol (cp, &cp, 10); int n = strtol (cp, &cp, 10);
if (n > rule_length) if (n > rule_length)
complain (_("invalid value: %s%d"), "$", n); complain_at (location, _("invalid value: %s%d"), "$", n);
else else
{ {
if (!type_name && n > 0) if (!type_name && n > 0)
type_name = get_type_name (n, current_rule); type_name = symbol_list_n_type_name_get (current_rule, location,
n);
if (!type_name && typed) if (!type_name && typed)
complain (_("$%d of `%s' has no declared type"), complain_at (location, _("$%d of `%s' has no declared type"),
n, current_rule->sym->tag); n, current_rule->sym->tag);
if (!type_name) if (!type_name)
type_name = ""; type_name = "";
@@ -2779,7 +2780,7 @@ handle_at (char *cp)
stack. It is not the same as the rule->length in the case of mid stack. It is not the same as the rule->length in the case of mid
rule actions. */ rule actions. */
int rule_length = 0; int rule_length = 0;
symbol_list *rhs; symbol_list_t *rhs;
for (rhs = current_rule->next; rhs; rhs = rhs->next) for (rhs = current_rule->next; rhs; rhs = rhs->next)
++rule_length; ++rule_length;

View File

@@ -80,7 +80,7 @@ scanner_last_string_free (void)
static int braces_level = 0; static int braces_level = 0;
static int percent_percent_count = 0; static int percent_percent_count = 0;
static void handle_dollar PARAMS ((char *cp)); static void handle_dollar PARAMS ((char *cp, location_t location));
static void handle_at PARAMS ((char *cp)); static void handle_at PARAMS ((char *cp));
%} %}
@@ -441,7 +441,7 @@ blanks [ \t\f]+
"{" YY_OBS_GROW; braces_level++; "{" YY_OBS_GROW; braces_level++;
"$"("<"[^>]+">")?(-?[0-9]+|"$") { handle_dollar (yytext); } "$"("<"[^>]+">")?(-?[0-9]+|"$") { handle_dollar (yytext, *yylloc); }
"@"(-?[0-9]+|"$") { handle_at (yytext); } "@"(-?[0-9]+|"$") { handle_at (yytext); }
[^$@\[\]/\'\"\{\}\n\r]+ YY_OBS_GROW; [^$@\[\]/\'\"\{\}\n\r]+ YY_OBS_GROW;
@@ -520,7 +520,7 @@ blanks [ \t\f]+
`------------------------------------------------------------------*/ `------------------------------------------------------------------*/
static void static void
handle_dollar (char *cp) handle_dollar (char *cp, location_t location)
{ {
const char *type_name = NULL; const char *type_name = NULL;
@@ -529,7 +529,7 @@ handle_dollar (char *cp)
stack. It is not the same as the rule->length in the case of mid stack. It is not the same as the rule->length in the case of mid
rule actions. */ rule actions. */
int rule_length = 0; int rule_length = 0;
symbol_list *rhs; symbol_list_t *rhs;
for (rhs = current_rule->next; rhs; rhs = rhs->next) for (rhs = current_rule->next; rhs; rhs = rhs->next)
++rule_length; ++rule_length;
@@ -548,10 +548,10 @@ handle_dollar (char *cp)
if (*cp == '$') if (*cp == '$')
{ {
if (!type_name) if (!type_name)
type_name = get_type_name (0, current_rule); type_name = symbol_list_n_type_name_get (current_rule, location, 0);
if (!type_name && typed) if (!type_name && typed)
complain (_("$$ of `%s' has no declared type"), complain_at (location, _("$$ of `%s' has no declared type"),
current_rule->sym->tag); current_rule->sym->tag);
if (!type_name) if (!type_name)
type_name = ""; type_name = "";
obstack_fgrow1 (&string_obstack, obstack_fgrow1 (&string_obstack,
@@ -562,13 +562,14 @@ handle_dollar (char *cp)
int n = strtol (cp, &cp, 10); int n = strtol (cp, &cp, 10);
if (n > rule_length) if (n > rule_length)
complain (_("invalid value: %s%d"), "$", n); complain_at (location, _("invalid value: %s%d"), "$", n);
else else
{ {
if (!type_name && n > 0) if (!type_name && n > 0)
type_name = get_type_name (n, current_rule); type_name = symbol_list_n_type_name_get (current_rule, location,
n);
if (!type_name && typed) if (!type_name && typed)
complain (_("$%d of `%s' has no declared type"), complain_at (location, _("$%d of `%s' has no declared type"),
n, current_rule->sym->tag); n, current_rule->sym->tag);
if (!type_name) if (!type_name)
type_name = ""; type_name = "";
@@ -598,7 +599,7 @@ handle_at (char *cp)
stack. It is not the same as the rule->length in the case of mid stack. It is not the same as the rule->length in the case of mid
rule actions. */ rule actions. */
int rule_length = 0; int rule_length = 0;
symbol_list *rhs; symbol_list_t *rhs;
for (rhs = current_rule->next; rhs; rhs = rhs->next) for (rhs = current_rule->next; rhs; rhs = rhs->next)
++rule_length; ++rule_length;

99
src/symlist.c Normal file
View File

@@ -0,0 +1,99 @@
/* Lists of symbols for Bison
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
Bison is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
Bison is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Bison; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "system.h"
#include "symlist.h"
/*----------------------------------------------.
| Create a list containing SYMBOL at LOCATION. |
`----------------------------------------------*/
symbol_list_t *
symbol_list_new (symbol_t *sym, location_t location)
{
symbol_list_t *res = XMALLOC (symbol_list_t, 1);
res->next = NULL;
res->sym = sym;
res->location = location;
res->action = NULL;
res->ruleprec = NULL;
return res;
}
/*-----------------------------------------.
| Prepend SYMBOL at LOCATION to the LIST. |
`-----------------------------------------*/
symbol_list_t *
symbol_list_prepend (symbol_list_t *list,
symbol_t *symbol, location_t location)
{
symbol_list_t *res = symbol_list_new (symbol, location);
res->next = list;
return res;
}
/*-------------------------------------------------.
| Free the LIST, but not the symbols it contains. |
`-------------------------------------------------*/
void
symbol_list_free (symbol_list_t *list)
{
LIST_FREE (symbol_list_t, list);
}
/*--------------------------------------------------------------.
| Get the data type (alternative in the union) of the value for |
| symbol N in rule RULE. |
`--------------------------------------------------------------*/
char *
symbol_list_n_type_name_get (symbol_list_t *rule, location_t location, int n)
{
int i;
symbol_list_t *rp;
if (n < 0)
{
complain_at (location, _("invalid $ value"));
return NULL;
}
rp = rule;
i = 0;
while (i < n)
{
rp = rp->next;
if (rp == NULL || rp->sym == NULL)
{
complain_at (location, _("invalid $ value"));
return NULL;
}
++i;
}
return rp->sym->type_name;
}

60
src/symlist.h Normal file
View File

@@ -0,0 +1,60 @@
/* Lists of symbols for Bison
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
Bison is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
Bison is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Bison; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef SYMLIST_H_
# define SYMLIST_H_
# include "symtab.h"
# include "location.h"
typedef struct symbol_list_s
{
struct symbol_list_s *next;
symbol_t *sym;
location_t location;
/* The action is attached to the LHS of a rule. */
const char *action;
location_t action_location;
symbol_t *ruleprec;
} symbol_list_t;
/* Create a list containing SYMBOL at LOCATION. */
symbol_list_t *symbol_list_new PARAMS ((symbol_t *sym, location_t location));
/* Prepend SYMBOL at LOCATION to the LIST. */
symbol_list_t * symbol_list_prepend PARAMS ((symbol_list_t *list,
symbol_t *symbol,
location_t location));
/* Free the LIST, but not the symbols it contains. */
void symbol_list_free PARAMS ((symbol_list_t *list));
/* Get the data type (alternative in the union) of the value for
symbol N in rule RULE. */
char *symbol_list_n_type_name_get PARAMS ((symbol_list_t *rule,
location_t location, int n));
#endif /* !SYMLIST_H_ */

View File

@@ -57,7 +57,7 @@ exp: { $$ = $1 ; };
]]) ]])
AT_CHECK([bison input.y], [1], [], AT_CHECK([bison input.y], [1], [],
[[input.y:2: invalid value: $1 [[input.y:2.6-14: invalid value: $1
]]) ]])
AT_CLEANUP AT_CLEANUP