1/* Lists of symbols for Bison
2
3   Copyright (C) 2002, 2005-2007, 2009-2012 Free Software Foundation,
4   Inc.
5
6   This file is part of Bison, the GNU Compiler Compiler.
7
8   This program is free software: you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation, either version 3 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
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
19   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21#ifndef SYMLIST_H_
22# define SYMLIST_H_
23
24# include "location.h"
25# include "scan-code.h"
26# include "symtab.h"
27# include "named-ref.h"
28
29/* A list of symbols, used during the parsing to store the rules.  */
30typedef struct symbol_list
31{
32  /**
33   * Whether this node contains a symbol, a semantic type, a \c <*>, or a
34   * \c <>.
35   */
36  enum {
37    SYMLIST_SYMBOL, SYMLIST_TYPE,
38    SYMLIST_DEFAULT_TAGGED, SYMLIST_DEFAULT_TAGLESS
39  } content_type;
40  union {
41    /**
42     * The symbol or \c NULL iff
43     * <tt>symbol_list::content_type = SYMLIST_SYMBOL</tt>.
44     */
45    symbol *sym;
46    /**
47     * The semantic type iff <tt>symbol_list::content_type = SYMLIST_TYPE</tt>.
48     */
49    uniqstr type_name;
50  } content;
51  location location;
52
53  /* Proper location of the symbol, not all the rule */
54  location sym_loc;
55
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.  */
58  struct symbol_list *midrule;
59
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
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;
70
71  /* Precedence/associativity.  */
72  symbol *ruleprec;
73  int dprec;
74  int merger;
75  location merger_declaration_location;
76
77  /* Named reference. */
78  named_ref *named_ref;
79
80  /* The list.  */
81  struct symbol_list *next;
82} symbol_list;
83
84
85/** Create a list containing \c sym at \c loc.  */
86symbol_list *symbol_list_sym_new (symbol *sym, location loc);
87
88/** Create a list containing \c type_name at \c loc.  */
89symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
90
91/** Create a list containing a \c <*> at \c loc.  */
92symbol_list *symbol_list_default_tagged_new (location loc);
93/** Create a list containing a \c <> at \c loc.  */
94symbol_list *symbol_list_default_tagless_new (location loc);
95
96/** Print this list.
97
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. */
109int symbol_list_length (symbol_list const *l);
110
111/** Get item \c n in symbol list \c l.  */
112symbol_list *symbol_list_n_get (symbol_list *l, int n);
113
114/* Get the data type (alternative in the union) of the value for
115   symbol N in rule RULE.  */
116uniqstr symbol_list_n_type_name_get (symbol_list *l, location loc, int n);
117
118/* Check whether the node is a border element of a rule. */
119bool symbol_list_null (symbol_list *node);
120
121/** Set the \c \%destructor for \c node as \c code at \c loc.  */
122void symbol_list_destructor_set (symbol_list *node,
123                                 code_props const *destructor);
124
125/** Set the \c \%printer for \c node as \c code at \c loc.  */
126void symbol_list_printer_set (symbol_list *node,
127                              code_props const *printer);
128
129#endif /* !SYMLIST_H_ */
130