(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>
+ * 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>
+
* 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.
scan-gram.l \
scan-skel.l \
state.c state.h \
+ symlist.c symlist.h \
symtab.c symtab.h \
system.h \
types.h \
#include "files.h"
#include "getargs.h"
#include "output.h"
+#include "symlist.h"
#include "gram.h"
#include "reader.h"
#include "conflicts.h"
#endif
#ifndef YYSTYPE
-#line 89 "parse-gram.y"
+#line 90 "parse-gram.y"
typedef union {
symbol_t *symbol;
- symbol_list *list;
+ symbol_list_t *list;
int integer;
char *string;
associativity assoc;
} yystype;
/* Line 199 of /usr/local/share/bison/bison.simple. */
-#line 235 "parse-gram.c"
+#line 236 "parse-gram.c"
# define YYSTYPE yystype
# define YYSTYPE_IS_TRIVIAL 1
#endif
/* Line 219 of /usr/local/share/bison/bison.simple. */
-#line 256 "parse-gram.c"
+#line 257 "parse-gram.c"
#if ! defined (yyoverflow) || YYERROR_VERBOSE
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const unsigned short yyrline[] =
{
- 0, 151, 151, 164, 166, 169, 171, 172, 173, 174,
- 175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
- 185, 186, 189, 191, 192, 196, 204, 204, 210, 210,
- 215, 224, 239, 241, 242, 245, 247, 252, 254, 258,
- 263, 268, 274, 280, 290, 293, 302, 304, 310, 312,
- 315, 315, 320, 322, 325, 328, 330, 332, 336, 338,
- 339, 342, 348, 357, 365, 370, 376, 378
+ 0, 152, 152, 165, 167, 170, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
+ 186, 187, 190, 192, 193, 197, 205, 205, 211, 211,
+ 216, 225, 240, 242, 243, 246, 248, 253, 255, 259,
+ 264, 269, 275, 281, 291, 294, 303, 305, 311, 313,
+ 316, 316, 321, 323, 326, 329, 331, 333, 337, 339,
+ 340, 343, 349, 358, 366, 371, 377, 379
};
#endif
switch (yyn)
{
case 2:
-#line 153 "parse-gram.y"
+#line 154 "parse-gram.y"
{
yycontrol->errcode = 0;
epilogue_set (yyvsp[0].string, yylsp[0]);
break;
case 6:
-#line 171 "parse-gram.y"
+#line 172 "parse-gram.y"
{ prologue_augment (yyvsp[0].string, yylsp[0]); }
break;
case 7:
-#line 172 "parse-gram.y"
+#line 173 "parse-gram.y"
{ debug_flag = 1; }
break;
case 8:
-#line 173 "parse-gram.y"
+#line 174 "parse-gram.y"
{ muscle_insert (yyvsp[-1].string, yyvsp[0].string); }
break;
case 9:
-#line 174 "parse-gram.y"
+#line 175 "parse-gram.y"
{ defines_flag = 1; }
break;
case 10:
-#line 175 "parse-gram.y"
+#line 176 "parse-gram.y"
{ error_verbose = 1; }
break;
case 11:
-#line 176 "parse-gram.y"
+#line 177 "parse-gram.y"
{ expected_conflicts = yyvsp[0].integer; }
break;
case 12:
-#line 177 "parse-gram.y"
+#line 178 "parse-gram.y"
{ spec_file_prefix = yyvsp[0].string; }
break;
case 13:
-#line 178 "parse-gram.y"
+#line 179 "parse-gram.y"
{ locations_flag = 1; }
break;
case 14:
-#line 179 "parse-gram.y"
+#line 180 "parse-gram.y"
{ spec_name_prefix = yyvsp[0].string; }
break;
case 15:
-#line 180 "parse-gram.y"
+#line 181 "parse-gram.y"
{ no_lines_flag = 1; }
break;
case 16:
-#line 181 "parse-gram.y"
+#line 182 "parse-gram.y"
{ spec_outfile = yyvsp[0].string; }
break;
case 17:
-#line 182 "parse-gram.y"
+#line 183 "parse-gram.y"
{ pure_parser = 1; }
break;
case 18:
-#line 183 "parse-gram.y"
+#line 184 "parse-gram.y"
{ skeleton = yyvsp[0].string; }
break;
case 19:
-#line 184 "parse-gram.y"
+#line 185 "parse-gram.y"
{ token_table_flag = 1; }
break;
case 20:
-#line 185 "parse-gram.y"
+#line 186 "parse-gram.y"
{ report_flag = 1; }
break;
case 21:
-#line 186 "parse-gram.y"
+#line 187 "parse-gram.y"
{ yacc_flag = 1; }
break;
case 24:
-#line 193 "parse-gram.y"
+#line 194 "parse-gram.y"
{
grammar_start_symbol_set (yyvsp[0].symbol, yylsp[0]);
}
break;
case 25:
-#line 197 "parse-gram.y"
+#line 198 "parse-gram.y"
{
typed = 1;
MUSCLE_INSERT_INT ("stype_line", yylsp[0].first_line);
break;
case 26:
-#line 205 "parse-gram.y"
+#line 206 "parse-gram.y"
{ current_class = nterm_sym; }
break;
case 27:
-#line 206 "parse-gram.y"
+#line 207 "parse-gram.y"
{
current_class = unknown_sym;
current_type = NULL;
break;
case 28:
-#line 210 "parse-gram.y"
+#line 211 "parse-gram.y"
{ current_class = token_sym; }
break;
case 29:
-#line 211 "parse-gram.y"
+#line 212 "parse-gram.y"
{
current_class = unknown_sym;
current_type = NULL;
break;
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)
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;
case 31:
-#line 226 "parse-gram.y"
+#line 227 "parse-gram.y"
{
- symbol_list *list;
+ symbol_list_t *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);
+ LIST_FREE (symbol_list_t, yyvsp[0].list);
current_type = NULL;
}
break;
case 32:
-#line 240 "parse-gram.y"
+#line 241 "parse-gram.y"
{ yyval.assoc = left_assoc; }
break;
case 33:
-#line 241 "parse-gram.y"
+#line 242 "parse-gram.y"
{ yyval.assoc = right_assoc; }
break;
case 34:
-#line 242 "parse-gram.y"
+#line 243 "parse-gram.y"
{ yyval.assoc = non_assoc; }
break;
case 35:
-#line 246 "parse-gram.y"
+#line 247 "parse-gram.y"
{ current_type = NULL;}
break;
case 36:
-#line 247 "parse-gram.y"
+#line 248 "parse-gram.y"
{ current_type = yyvsp[0].string; }
break;
case 37:
-#line 253 "parse-gram.y"
+#line 254 "parse-gram.y"
{ yyval.list = symbol_list_new (yyvsp[0].symbol, yylsp[0]); }
break;
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]); }
break;
case 39:
-#line 260 "parse-gram.y"
+#line 261 "parse-gram.y"
{
current_type = yyvsp[0].string;
}
break;
case 40:
-#line 264 "parse-gram.y"
+#line 265 "parse-gram.y"
{
symbol_class_set (yyvsp[0].symbol, current_class);
symbol_type_set (yyvsp[0].symbol, yylsp[0], current_type);
break;
case 41:
-#line 269 "parse-gram.y"
+#line 270 "parse-gram.y"
{
symbol_class_set (yyvsp[-1].symbol, current_class);
symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
break;
case 42:
-#line 275 "parse-gram.y"
+#line 276 "parse-gram.y"
{
symbol_class_set (yyvsp[-1].symbol, current_class);
symbol_type_set (yyvsp[-1].symbol, yylsp[-1], current_type);
break;
case 43:
-#line 281 "parse-gram.y"
+#line 282 "parse-gram.y"
{
symbol_class_set (yyvsp[-2].symbol, current_class);
symbol_type_set (yyvsp[-2].symbol, yylsp[-2], current_type);
break;
case 44:
-#line 292 "parse-gram.y"
+#line 293 "parse-gram.y"
{;}
break;
case 45:
-#line 294 "parse-gram.y"
+#line 295 "parse-gram.y"
{;}
break;
case 50:
-#line 316 "parse-gram.y"
+#line 317 "parse-gram.y"
{ current_lhs = yyvsp[-1].symbol; current_lhs_location = yylsp[-1]; }
break;
case 51:
-#line 317 "parse-gram.y"
+#line 318 "parse-gram.y"
{;}
break;
case 52:
-#line 321 "parse-gram.y"
+#line 322 "parse-gram.y"
{ grammar_rule_end (yylsp[0]); }
break;
case 53:
-#line 322 "parse-gram.y"
+#line 323 "parse-gram.y"
{ grammar_rule_end (yylsp[0]); }
break;
case 54:
-#line 327 "parse-gram.y"
+#line 328 "parse-gram.y"
{ grammar_rule_begin (current_lhs, current_lhs_location); }
break;
case 55:
-#line 329 "parse-gram.y"
+#line 330 "parse-gram.y"
{ grammar_current_rule_symbol_append (yyvsp[0].symbol, yylsp[0]); }
break;
case 56:
-#line 331 "parse-gram.y"
+#line 332 "parse-gram.y"
{ grammar_current_rule_action_append (yyvsp[0].string, yylsp[0]); }
break;
case 57:
-#line 333 "parse-gram.y"
+#line 334 "parse-gram.y"
{ grammar_current_rule_prec_set (yyvsp[0].symbol); }
break;
case 58:
-#line 337 "parse-gram.y"
+#line 338 "parse-gram.y"
{ yyval.symbol = yyvsp[0].symbol; }
break;
case 59:
-#line 338 "parse-gram.y"
+#line 339 "parse-gram.y"
{ yyval.symbol = yyvsp[0].symbol; }
break;
case 60:
-#line 339 "parse-gram.y"
+#line 340 "parse-gram.y"
{ yyval.symbol = getsym (yyvsp[0].string, yylsp[0]); }
break;
case 61:
-#line 344 "parse-gram.y"
+#line 345 "parse-gram.y"
{ yyval.string = yyvsp[0].string; }
break;
case 62:
-#line 350 "parse-gram.y"
+#line 351 "parse-gram.y"
{
yyval.symbol = getsym (yyvsp[0].string, yylsp[0]);
symbol_class_set (yyval.symbol, token_sym);
break;
case 63:
-#line 359 "parse-gram.y"
+#line 360 "parse-gram.y"
{
yyval.string = yyvsp[0].string + 1;
yyval.string[strlen (yyval.string) - 1] = '\0';
break;
case 64:
-#line 367 "parse-gram.y"
+#line 368 "parse-gram.y"
{
yyval.string = xstrdup ("");
}
break;
case 65:
-#line 371 "parse-gram.y"
+#line 372 "parse-gram.y"
{
yyval.string = yyvsp[0].string;
}
}
/* Line 1012 of /usr/local/share/bison/bison.simple. */
-#line 1523 "parse-gram.c"
+#line 1524 "parse-gram.c"
\f
yyvsp -= yylen;
yyssp -= yylen;
return yyresult;
}
-#line 380 "parse-gram.y"
+#line 381 "parse-gram.y"
/*------------------------------------------------------------------.
| When debugging the parser, display tokens' locations and values. |
#ifndef YYSTYPE
-#line 89 "parse-gram.y"
+#line 90 "parse-gram.y"
typedef union {
symbol_t *symbol;
- symbol_list *list;
+ symbol_list_t *list;
int integer;
char *string;
associativity assoc;
#include "files.h"
#include "getargs.h"
#include "output.h"
+#include "symlist.h"
#include "gram.h"
#include "reader.h"
#include "conflicts.h"
%union
{
symbol_t *symbol;
- symbol_list *list;
+ symbol_list_t *list;
int integer;
char *string;
associativity assoc;
}
| "%type" TYPE symbols.1
{
- symbol_list *list;
+ symbol_list_t *list;
for (list = $3; list; list = list->next)
symbol_type_set (list->sym, list->location, $2);
- LIST_FREE (symbol_list, $3);
+ LIST_FREE (symbol_list_t, $3);
}
;
precedence_declaration:
precedence_declarator type.opt symbols.1
{
- symbol_list *list;
+ symbol_list_t *list;
++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);
+ LIST_FREE (symbol_list_t, $3);
current_type = NULL;
}
;
#include "getargs.h"
#include "files.h"
#include "symtab.h"
+#include "symlist.h"
#include "options.h"
#include "gram.h"
#include "complain.h"
#include "muscle_tab.h"
int lineno;
-static symbol_list *grammar = NULL;
+static symbol_list_t *grammar = NULL;
static int start_flag = 0;
/* Nonzero if %union has been seen. */
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;
-}
-
\f
-/*--------------------------------------------------------------.
-| 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. |
`-----------------------*/
}
\f
/*-------------------------------------------------------------------.
-| 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 |
| followed by the contents of the right hand side, followed by a |
| null pointer instead of a symbol to terminate the rule. The next |
`-------------------------------------------------------------------*/
/* The (currently) last symbol of GRAMMAR. */
-symbol_list *grammar_end = NULL;
+symbol_list_t *grammar_end = NULL;
/* Append S to the GRAMMAR. */
void
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)
grammar_end->next = p;
/* The rule currently being defined, and the previous rule.
CURRENT_RULE points to the first LHS of the current rule, while
PREVIOUS_RULE_END points to the *end* of the previous rule (NULL). */
-symbol_list *current_rule = NULL;
-symbol_list *previous_rule_end = NULL;
+symbol_list_t *current_rule = NULL;
+symbol_list_t *previous_rule_end = NULL;
/*----------------------------------------------.
action. Create the MIDRULE. */
location_t dummy_location = current_rule->action_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
that the action just read can belong to it. */
{
unsigned int itemno;
int ruleno;
- symbol_list *p;
+ symbol_list_t *p;
ritem = XCALLOC (item_number_t, nritems);
rules = XCALLOC (rule_t, nrules) - 1;
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->next = symbol_list_new (startsymbol, empty_location);
p->next->next = symbol_list_new (eoftoken, empty_location);
/* Convert the grammar into the format described in gram.h. */
packgram ();
- /* The grammar as a symbol_list is no longer needed. */
- LIST_FREE (symbol_list, grammar);
+ /* The grammar as a symbol_list_t is no longer needed. */
+ LIST_FREE (symbol_list_t, grammar);
}
#ifndef READER_H_
# define READER_H_
-# include "location.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 "symlist.h"
# include "parse-gram.h"
typedef struct gram_control_s
location_t *loc, const char *msg);
int gram_parse (void *control);
-char *get_type_name PARAMS ((int n, symbol_list *rule));
extern int typed;
/* From reader.c. */
location_t l));
void grammar_current_rule_action_append PARAMS ((const char *action,
location_t l));
-extern symbol_list *current_rule;
+extern symbol_list_t *current_rule;
void reader PARAMS ((void));
#endif /* !READER_H_ */
static int braces_level = 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));
#define SC_COMMENT 1
case 82:
YY_RULE_SETUP
#line 444 "scan-gram.l"
-{ handle_dollar (yytext); }
+{ handle_dollar (yytext, *yylloc); }
YY_BREAK
case 83:
YY_RULE_SETUP
`------------------------------------------------------------------*/
static void
-handle_dollar (char *cp)
+handle_dollar (char *cp, location_t location)
{
const char *type_name = NULL;
stack. It is not the same as the rule->length in the case of mid
rule actions. */
int rule_length = 0;
- symbol_list *rhs;
+ symbol_list_t *rhs;
for (rhs = current_rule->next; rhs; rhs = rhs->next)
++rule_length;
if (*cp == '$')
{
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)
- complain (_("$$ of `%s' has no declared type"),
- current_rule->sym->tag);
+ complain_at (location, _("$$ of `%s' has no declared type"),
+ current_rule->sym->tag);
if (!type_name)
type_name = "";
obstack_fgrow1 (&string_obstack,
int n = strtol (cp, &cp, 10);
if (n > rule_length)
- complain (_("invalid value: %s%d"), "$", n);
+ complain_at (location, _("invalid value: %s%d"), "$", n);
else
{
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)
- complain (_("$%d of `%s' has no declared type"),
+ complain_at (location, _("$%d of `%s' has no declared type"),
n, current_rule->sym->tag);
if (!type_name)
type_name = "";
stack. It is not the same as the rule->length in the case of mid
rule actions. */
int rule_length = 0;
- symbol_list *rhs;
+ symbol_list_t *rhs;
for (rhs = current_rule->next; rhs; rhs = rhs->next)
++rule_length;
static int braces_level = 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));
%}
"{" YY_OBS_GROW; braces_level++;
- "$"("<"[^>]+">")?(-?[0-9]+|"$") { handle_dollar (yytext); }
+ "$"("<"[^>]+">")?(-?[0-9]+|"$") { handle_dollar (yytext, *yylloc); }
"@"(-?[0-9]+|"$") { handle_at (yytext); }
[^$@\[\]/\'\"\{\}\n\r]+ YY_OBS_GROW;
`------------------------------------------------------------------*/
static void
-handle_dollar (char *cp)
+handle_dollar (char *cp, location_t location)
{
const char *type_name = NULL;
stack. It is not the same as the rule->length in the case of mid
rule actions. */
int rule_length = 0;
- symbol_list *rhs;
+ symbol_list_t *rhs;
for (rhs = current_rule->next; rhs; rhs = rhs->next)
++rule_length;
if (*cp == '$')
{
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)
- complain (_("$$ of `%s' has no declared type"),
- current_rule->sym->tag);
+ complain_at (location, _("$$ of `%s' has no declared type"),
+ current_rule->sym->tag);
if (!type_name)
type_name = "";
obstack_fgrow1 (&string_obstack,
int n = strtol (cp, &cp, 10);
if (n > rule_length)
- complain (_("invalid value: %s%d"), "$", n);
+ complain_at (location, _("invalid value: %s%d"), "$", n);
else
{
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)
- complain (_("$%d of `%s' has no declared type"),
+ complain_at (location, _("$%d of `%s' has no declared type"),
n, current_rule->sym->tag);
if (!type_name)
type_name = "";
stack. It is not the same as the rule->length in the case of mid
rule actions. */
int rule_length = 0;
- symbol_list *rhs;
+ symbol_list_t *rhs;
for (rhs = current_rule->next; rhs; rhs = rhs->next)
++rule_length;
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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_ */
]])
AT_CHECK([bison input.y], [1], [],
-[[input.y:2: invalid value: $1
+[[input.y:2.6-14: invalid value: $1
]])
AT_CLEANUP