]> git.saurik.com Git - bison.git/blob - src/symlist.c
92d8513d46a620d0ed812e0adcc2205876bc9a26
[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 "complain.h"
23 #include "symlist.h"
24
25
26 /*----------------------------------------------.
27 | Create a list containing SYMBOL at LOCATION. |
28 `----------------------------------------------*/
29
30 symbol_list_t *
31 symbol_list_new (symbol_t *sym, location_t location)
32 {
33 symbol_list_t *res = XMALLOC (symbol_list_t, 1);
34 res->next = NULL;
35 res->sym = sym;
36 res->location = location;
37 res->action = NULL;
38 res->ruleprec = NULL;
39 res->dprec = 0;
40 res->merger = 0;
41 return res;
42 }
43
44
45 /*-----------------------------------------.
46 | Prepend SYMBOL at LOCATION to the LIST. |
47 `-----------------------------------------*/
48
49 symbol_list_t *
50 symbol_list_prepend (symbol_list_t *list,
51 symbol_t *symbol, location_t location)
52 {
53 symbol_list_t *res = symbol_list_new (symbol, location);
54 res->next = list;
55 return res;
56 }
57
58
59 /*-------------------------------------------------.
60 | Free the LIST, but not the symbols it contains. |
61 `-------------------------------------------------*/
62
63 void
64 symbol_list_free (symbol_list_t *list)
65 {
66 LIST_FREE (symbol_list_t, list);
67 }
68
69
70 /*--------------------.
71 | Return its length. |
72 `--------------------*/
73
74 unsigned int
75 symbol_list_length (symbol_list_t *list)
76 {
77 int res = 0;
78 for (/* Nothing. */; list; list = list->next)
79 ++res;
80 return res;
81 }
82
83
84 /*--------------------------------------------------------------.
85 | Get the data type (alternative in the union) of the value for |
86 | symbol N in rule RULE. |
87 `--------------------------------------------------------------*/
88
89 struniq_t
90 symbol_list_n_type_name_get (symbol_list_t *rule, location_t location, int n)
91 {
92 int i;
93 symbol_list_t *rp;
94
95 if (n < 0)
96 {
97 complain_at (location, _("invalid $ value"));
98 return NULL;
99 }
100
101 rp = rule;
102 i = 0;
103
104 while (i < n)
105 {
106 rp = rp->next;
107 if (rp == NULL || rp->sym == NULL)
108 {
109 complain_at (location, _("invalid $ value"));
110 return NULL;
111 }
112 ++i;
113 }
114
115 return rp->sym->type_name;
116 }