X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/4613f49b90c0c440910da55581f95183b9bb1272..a51d426a63f276249acccb50cd7bc930d34ebb6c:/src/symlist.c diff --git a/src/symlist.c b/src/symlist.c index 5b25ac56..ed42ce1e 100644 --- a/src/symlist.c +++ b/src/symlist.c @@ -1,6 +1,6 @@ /* Lists of symbols for Bison - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2005 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -16,9 +16,10 @@ 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. */ + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ +#include #include "system.h" #include "complain.h" @@ -32,18 +33,40 @@ symbol_list * symbol_list_new (symbol *sym, location loc) { - symbol_list *res = MALLOC (res, 1); - res->next = NULL; + symbol_list *res = xmalloc (sizeof *res); + res->sym = sym; res->location = loc; + 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 (symbol_list *l, FILE *f) +{ + for (/* Nothing. */; l && l->sym; l = l->next) + { + symbol_print (l->sym, f); + if (l && l->sym) + fprintf (f, ", "); + } +} + + /*---------------------------------. | Prepend SYM at LOC to the LIST. | `---------------------------------*/ @@ -73,43 +96,64 @@ symbol_list_free (symbol_list *list) `--------------------*/ unsigned int -symbol_list_length (symbol_list *list) +symbol_list_length (symbol_list *l) { int res = 0; - for (/* Nothing. */; list; list = list->next) + for (/* Nothing. */; l; 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; }