]> git.saurik.com Git - bison.git/blame - src/symlist.h
2007-11-08 Paolo Bonzini <bonzini@gnu.org>
[bison.git] / src / symlist.h
CommitLineData
56c47203 1/* Lists of symbols for Bison
e3921448 2
28e52c0d 3 Copyright (C) 2002, 2005, 2006, 2007 Free Software Foundation, Inc.
56c47203
AD
4
5 This file is part of Bison, the GNU Compiler Compiler.
6
f16b0819 7 This program is free software: you can redistribute it and/or modify
56c47203 8 it under the terms of the GNU General Public License as published by
f16b0819
PE
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
56c47203 11
f16b0819 12 This program is distributed in the hope that it will be useful,
56c47203
AD
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
f16b0819 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
56c47203
AD
19
20#ifndef SYMLIST_H_
21# define SYMLIST_H_
22
56c47203 23# include "location.h"
7c0c6181 24# include "scan-code.h"
e3921448 25# include "symtab.h"
56c47203 26
affac613 27/* A list of symbols, used during the parsing to store the rules. */
e3921448 28typedef struct symbol_list
56c47203 29{
3be03b13 30 /**
12e35840 31 * Whether this node contains a symbol, a semantic type, a \c <*>, or a
3ebecc24 32 * \c <>.
3be03b13 33 */
12e35840
JD
34 enum {
35 SYMLIST_SYMBOL, SYMLIST_TYPE,
36 SYMLIST_DEFAULT_TAGGED, SYMLIST_DEFAULT_TAGLESS
37 } content_type;
3be03b13 38 union {
7c0c6181
JD
39 /**
40 * The symbol or \c NULL iff
41 * <tt>symbol_list::content_type = SYMLIST_SYMBOL</tt>.
42 */
3be03b13 43 symbol *sym;
7c0c6181
JD
44 /**
45 * The semantic type iff <tt>symbol_list::content_type = SYMLIST_TYPE</tt>.
46 */
3be03b13
JD
47 uniqstr type_name;
48 } content;
e3921448 49 location location;
56c47203 50
ffa4ba3a
JD
51 /* If this symbol is the generated lhs for a midrule but this is the rule in
52 whose rhs it appears, MIDRULE = a pointer to that midrule. */
6ec2c0f2 53 struct symbol_list *midrule;
84866159 54
ffa4ba3a
JD
55 /* If this symbol is the generated lhs for a midrule and this is that
56 midrule, MIDRULE_PARENT_RULE = a pointer to the rule in whose rhs it
57 appears, and MIDRULE_PARENT_RHS_INDEX = its rhs index (1-origin) in the
58 parent rule. */
59 struct symbol_list *midrule_parent_rule;
60 int midrule_parent_rhs_index;
61
f6857bbf
JD
62 /* The action is attached to the LHS of a rule, but action properties for
63 * each RHS are also stored here. */
64 code_props action_props;
affac613
AD
65
66 /* Precedence/associativity. */
e3921448 67 symbol *ruleprec;
676385e2
PH
68 int dprec;
69 int merger;
8ee5b538 70 location merger_declaration_location;
affac613
AD
71
72 /* The list. */
73 struct symbol_list *next;
e3921448 74} symbol_list;
56c47203
AD
75
76
3be03b13
JD
77/** Create a list containing \c sym at \c loc. */
78symbol_list *symbol_list_sym_new (symbol *sym, location loc);
56c47203 79
3be03b13
JD
80/** Create a list containing \c type_name at \c loc. */
81symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
867a3e00 82
12e35840
JD
83/** Create a list containing a \c <*> at \c loc. */
84symbol_list *symbol_list_default_tagged_new (location loc);
3ebecc24 85/** Create a list containing a \c <> at \c loc. */
12e35840 86symbol_list *symbol_list_default_tagless_new (location loc);
56c47203 87
3be03b13 88/** Print this list.
56c47203 89
3be03b13
JD
90 \pre For every node \c n in the list, <tt>n->content_type =
91 SYMLIST_SYMBOL</tt>. */
92void symbol_list_syms_print (const symbol_list *l, FILE *f);
93
94/** Prepend \c node to \c list. */
95symbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node);
96
97/** Free \c list, but not the items it contains. */
98void symbol_list_free (symbol_list *list);
99
100/** Return the length of \c l. */
b37acfe1 101int symbol_list_length (symbol_list const *l);
affac613 102
3be03b13 103/** Get item \c n in symbol list \c l. */
affac613 104symbol_list *symbol_list_n_get (symbol_list *l, int n);
56c47203
AD
105
106/* Get the data type (alternative in the union) of the value for
107 symbol N in rule RULE. */
affac613
AD
108uniqstr symbol_list_n_type_name_get (symbol_list *l, location loc, int n);
109
7c0c6181
JD
110/** Set the \c \%destructor for \c node as \c code at \c loc. */
111void symbol_list_destructor_set (symbol_list *node, char const *code,
3be03b13
JD
112 location loc);
113
7c0c6181
JD
114/** Set the \c \%printer for \c node as \c code at \c loc. */
115void symbol_list_printer_set (symbol_list *node, char const *code,
3be03b13
JD
116 location loc);
117
56c47203 118#endif /* !SYMLIST_H_ */