]> git.saurik.com Git - bison.git/blob - src/symlist.c
bdb965d31487fb05aca4222add8b0f8fa84b1c63
[bison.git] / src / symlist.c
1 /* Lists of symbols for Bison
2 Copyright (C) 2002 Free Software Foundation, Inc.
3
4 This file is part of Bison, the GNU Compiler Compiler.
5
6 Bison is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 Bison is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Bison; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "system.h"
22 #include "symlist.h"
23
24
25 /*----------------------------------------------.
26 | Create a list containing SYMBOL at LOCATION. |
27 `----------------------------------------------*/
28
29 symbol_list_t *
30 symbol_list_new (symbol_t *sym, location_t location)
31 {
32 symbol_list_t *res = XMALLOC (symbol_list_t, 1);
33 res->next = NULL;
34 res->sym = sym;
35 res->location = location;
36 res->action = NULL;
37 res->ruleprec = NULL;
38 return res;
39 }
40
41
42 /*-----------------------------------------.
43 | Prepend SYMBOL at LOCATION to the LIST. |
44 `-----------------------------------------*/
45
46 symbol_list_t *
47 symbol_list_prepend (symbol_list_t *list,
48 symbol_t *symbol, location_t location)
49 {
50 symbol_list_t *res = symbol_list_new (symbol, location);
51 res->next = list;
52 return res;
53 }
54
55
56 /*-------------------------------------------------.
57 | Free the LIST, but not the symbols it contains. |
58 `-------------------------------------------------*/
59
60 void
61 symbol_list_free (symbol_list_t *list)
62 {
63 LIST_FREE (symbol_list_t, list);
64 }
65
66
67 /*--------------------.
68 | Return its length. |
69 `--------------------*/
70
71 unsigned int
72 symbol_list_length (symbol_list_t *list)
73 {
74 int res = 0;
75 for (/* Nothing. */; list; list = list->next)
76 ++res;
77 return res;
78 }
79
80
81 /*--------------------------------------------------------------.
82 | Get the data type (alternative in the union) of the value for |
83 | symbol N in rule RULE. |
84 `--------------------------------------------------------------*/
85
86 char *
87 symbol_list_n_type_name_get (symbol_list_t *rule, location_t location, int n)
88 {
89 int i;
90 symbol_list_t *rp;
91
92 if (n < 0)
93 {
94 complain_at (location, _("invalid $ value"));
95 return NULL;
96 }
97
98 rp = rule;
99 i = 0;
100
101 while (i < n)
102 {
103 rp = rp->next;
104 if (rp == NULL || rp->sym == NULL)
105 {
106 complain_at (location, _("invalid $ value"));
107 return NULL;
108 }
109 ++i;
110 }
111
112 return rp->sym->type_name;
113 }