]> git.saurik.com Git - bison.git/blame - src/symlist.c
* src/derives.h, src/derives.c (derives): A `rule_t***' instead of
[bison.git] / src / symlist.c
CommitLineData
56c47203
AD
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"
9280d3ef 22#include "complain.h"
56c47203
AD
23#include "symlist.h"
24
25
26/*----------------------------------------------.
27| Create a list containing SYMBOL at LOCATION. |
28`----------------------------------------------*/
29
30symbol_list_t *
31symbol_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;
676385e2
PH
39 res->dprec = 0;
40 res->merger = 0;
56c47203
AD
41 return res;
42}
43
44
45/*-----------------------------------------.
46| Prepend SYMBOL at LOCATION to the LIST. |
47`-----------------------------------------*/
48
49symbol_list_t *
50symbol_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
63void
64symbol_list_free (symbol_list_t *list)
65{
66 LIST_FREE (symbol_list_t, list);
67}
68
69
dafdc66f
AD
70/*--------------------.
71| Return its length. |
72`--------------------*/
73
74unsigned int
75symbol_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
56c47203
AD
84/*--------------------------------------------------------------.
85| Get the data type (alternative in the union) of the value for |
86| symbol N in rule RULE. |
87`--------------------------------------------------------------*/
88
89char *
90symbol_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}