/* Lists of symbols for Bison
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
This file is part of Bison, the GNU Compiler Compiler.
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
+#include <config.h>
#include "system.h"
#include "complain.h"
symbol_list_new (symbol *sym, location loc)
{
symbol_list *res = xmalloc (sizeof *res);
- res->next = NULL;
+
res->sym = sym;
res->location = loc;
+
+ res->midrule = NULL;
+ res->midrule_parent_rule = NULL;
+ res->midrule_parent_rhs_index = 0;
+
res->action = NULL;
+ res->used = false;
+
res->ruleprec = NULL;
res->dprec = 0;
res->merger = 0;
+
+ res->next = NULL;
+
return res;
}
+/*------------------.
+| Print this list. |
+`------------------*/
+
+void
+symbol_list_print (const symbol_list *l, FILE *f)
+{
+ for (/* Nothing. */; l && l->sym; l = l->next)
+ {
+ symbol_print (l->sym, f);
+ fprintf (stderr, l->used ? " used" : " unused");
+ if (l && l->sym)
+ fprintf (f, ", ");
+ }
+}
+
+
/*---------------------------------.
| Prepend SYM at LOC to the LIST. |
`---------------------------------*/
`--------------------*/
unsigned int
-symbol_list_length (symbol_list *list)
+symbol_list_length (const symbol_list *l)
{
int res = 0;
- for (/* Nothing. */; list; list = list->next)
+ for (/* Nothing. */; l && l->sym; l = l->next)
++res;
return res;
}
-/*--------------------------------------------------------------.
-| Get the data type (alternative in the union) of the value for |
-| symbol N in symbol list RP. |
-`--------------------------------------------------------------*/
+/*--------------------------------.
+| Get symbol N in symbol list L. |
+`--------------------------------*/
-uniqstr
-symbol_list_n_type_name_get (symbol_list *rp, location loc, int n)
+symbol_list *
+symbol_list_n_get (symbol_list *l, int n)
{
int i;
if (n < 0)
+ return NULL;
+
+ for (i = 0; i < n; ++i)
{
- complain_at (loc, _("invalid $ value"));
- return NULL;
+ l = l->next;
+ if (l == NULL || l->sym == NULL)
+ return NULL;
}
- i = 0;
+ return l;
+}
+
+
+/*--------------------------------------------------------------.
+| Get the data type (alternative in the union) of the value for |
+| symbol N in symbol list L. |
+`--------------------------------------------------------------*/
- while (i < n)
+uniqstr
+symbol_list_n_type_name_get (symbol_list *l, location loc, int n)
+{
+ l = symbol_list_n_get (l, n);
+ if (!l)
{
- rp = rp->next;
- if (rp == NULL || rp->sym == NULL)
- {
- complain_at (loc, _("invalid $ value"));
- return NULL;
- }
- ++i;
+ complain_at (loc, _("invalid $ value: $%d"), n);
+ return NULL;
}
+ return l->sym->type_name;
+}
- return rp->sym->type_name;
+
+/*----------------------------------------.
+| The symbol N in symbol list L is USED. |
+`----------------------------------------*/
+
+void
+symbol_list_n_used_set (symbol_list *l, int n, bool used)
+{
+ l = symbol_list_n_get (l, n);
+ if (l)
+ l->used = used;
}