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