Home | History | Annotate | Download | only in src
      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.  */
     30 typedef 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.  */
     86 symbol_list *symbol_list_sym_new (symbol *sym, location loc);
     87 
     88 /** Create a list containing \c type_name at \c loc.  */
     89 symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
     90 
     91 /** Create a list containing a \c <*> at \c loc.  */
     92 symbol_list *symbol_list_default_tagged_new (location loc);
     93 /** Create a list containing a \c <> at \c loc.  */
     94 symbol_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>.  */
    100 void symbol_list_syms_print (const symbol_list *l, FILE *f);
    101 
    102 /** Prepend \c node to \c list.  */
    103 symbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node);
    104 
    105 /** Free \c list, but not the items it contains.  */
    106 void symbol_list_free (symbol_list *list);
    107 
    108 /** Return the length of \c l. */
    109 int symbol_list_length (symbol_list const *l);
    110 
    111 /** Get item \c n in symbol list \c l.  */
    112 symbol_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.  */
    116 uniqstr 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. */
    119 bool symbol_list_null (symbol_list *node);
    120 
    121 /** Set the \c \%destructor for \c node as \c code at \c loc.  */
    122 void 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.  */
    126 void symbol_list_printer_set (symbol_list *node,
    127                               code_props const *printer);
    128 
    129 #endif /* !SYMLIST_H_ */
    130