1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Lists of symbols for Bison
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2002, 2005-2007, 2009-2012 Free Software Foundation,
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of Bison, the GNU Compiler Compiler.
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation, either version 3 of the License, or
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef SYMLIST_H_
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define SYMLIST_H_
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "location.h"
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include "scan-code.h"
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "symtab.h"
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include "named-ref.h"
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* A list of symbols, used during the parsing to store the rules.  */
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef struct symbol_list
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /**
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   * Whether this node contains a symbol, a semantic type, a \c <*>, or a
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   * \c <>.
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   */
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  enum {
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    SYMLIST_SYMBOL, SYMLIST_TYPE,
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    SYMLIST_DEFAULT_TAGGED, SYMLIST_DEFAULT_TAGLESS
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  } content_type;
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  union {
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /**
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     * The symbol or \c NULL iff
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     * <tt>symbol_list::content_type = SYMLIST_SYMBOL</tt>.
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang     */
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    symbol *sym;
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    /**
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang     * The semantic type iff <tt>symbol_list::content_type = SYMLIST_TYPE</tt>.
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang     */
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    uniqstr type_name;
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  } content;
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  location location;
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Proper location of the symbol, not all the rule */
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  location sym_loc;
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* If this symbol is the generated lhs for a midrule but this is the rule in
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang     whose rhs it appears, MIDRULE = a pointer to that midrule.  */
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct symbol_list *midrule;
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* If this symbol is the generated lhs for a midrule and this is that
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang     midrule, MIDRULE_PARENT_RULE = a pointer to the rule in whose rhs it
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang     appears, and MIDRULE_PARENT_RHS_INDEX = its rhs index (1-origin) in the
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang     parent rule.  */
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  struct symbol_list *midrule_parent_rule;
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int midrule_parent_rhs_index;
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* The action is attached to the LHS of a rule, but action properties for
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   * each RHS are also stored here.  */
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  code_props action_props;
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Precedence/associativity.  */
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  symbol *ruleprec;
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int dprec;
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int merger;
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  location merger_declaration_location;
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Named reference. */
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  named_ref *named_ref;
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* The list.  */
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct symbol_list *next;
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} symbol_list;
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Create a list containing \c sym at \c loc.  */
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wangsymbol_list *symbol_list_sym_new (symbol *sym, location loc);
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Create a list containing \c type_name at \c loc.  */
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wangsymbol_list *symbol_list_type_new (uniqstr type_name, location loc);
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Create a list containing a \c <*> at \c loc.  */
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wangsymbol_list *symbol_list_default_tagged_new (location loc);
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Create a list containing a \c <> at \c loc.  */
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wangsymbol_list *symbol_list_default_tagless_new (location loc);
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Print this list.
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  \pre For every node \c n in the list, <tt>n->content_type =
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  SYMLIST_SYMBOL</tt>.  */
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid symbol_list_syms_print (const symbol_list *l, FILE *f);
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Prepend \c node to \c list.  */
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wangsymbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node);
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Free \c list, but not the items it contains.  */
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid symbol_list_free (symbol_list *list);
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Return the length of \c l. */
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wangint symbol_list_length (symbol_list const *l);
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Get item \c n in symbol list \c l.  */
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsymbol_list *symbol_list_n_get (symbol_list *l, int n);
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Get the data type (alternative in the union) of the value for
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   symbol N in rule RULE.  */
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuniqstr symbol_list_n_type_name_get (symbol_list *l, location loc, int n);
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Check whether the node is a border element of a rule. */
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wangbool symbol_list_null (symbol_list *node);
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Set the \c \%destructor for \c node as \c code at \c loc.  */
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid symbol_list_destructor_set (symbol_list *node,
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                 code_props const *destructor);
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/** Set the \c \%printer for \c node as \c code at \c loc.  */
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid symbol_list_printer_set (symbol_list *node,
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                              code_props const *printer);
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* !SYMLIST_H_ */
130