]> git.saurik.com Git - bison.git/blame - src/symlist.c
* src/reader.h, src/reader.c (symbol_list, symbol_list_new)
[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"
22#include "symlist.h"
23
24
25/*----------------------------------------------.
26| Create a list containing SYMBOL at LOCATION. |
27`----------------------------------------------*/
28
29symbol_list_t *
30symbol_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
46symbol_list_t *
47symbol_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
60void
61symbol_list_free (symbol_list_t *list)
62{
63 LIST_FREE (symbol_list_t, list);
64}
65
66
67/*--------------------------------------------------------------.
68| Get the data type (alternative in the union) of the value for |
69| symbol N in rule RULE. |
70`--------------------------------------------------------------*/
71
72char *
73symbol_list_n_type_name_get (symbol_list_t *rule, location_t location, int n)
74{
75 int i;
76 symbol_list_t *rp;
77
78 if (n < 0)
79 {
80 complain_at (location, _("invalid $ value"));
81 return NULL;
82 }
83
84 rp = rule;
85 i = 0;
86
87 while (i < n)
88 {
89 rp = rp->next;
90 if (rp == NULL || rp->sym == NULL)
91 {
92 complain_at (location, _("invalid $ value"));
93 return NULL;
94 }
95 ++i;
96 }
97
98 return rp->sym->type_name;
99}