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