(root)/
bison-3.8.2/
src/
symlist.h
       1  /* Lists of symbols for Bison
       2  
       3     Copyright (C) 2002, 2005-2007, 2009-2015, 2018-2021 Free Software
       4     Foundation, 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 <https://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 for many different
      30     purposes: rules, symbol declarations or properties (such as
      31     %destructor, etc.)...  */
      32  typedef struct symbol_list
      33  {
      34    /**
      35     * Whether this node contains a symbol, a semantic type, a \c <*>, or a
      36     * \c <>.
      37     */
      38    enum {
      39      SYMLIST_SYMBOL,
      40      SYMLIST_TYPE
      41    } content_type;
      42    union {
      43      /**
      44       * The symbol or \c NULL iff
      45       * <tt>symbol_list::content_type = SYMLIST_SYMBOL</tt>.
      46       */
      47      symbol *sym;
      48      /**
      49       * The semantic type iff <tt>symbol_list::content_type = SYMLIST_TYPE</tt>.
      50       */
      51      semantic_type *sem_type;
      52    } content;
      53  
      54    /* Named reference. */
      55    named_ref *named_ref;
      56  
      57    /* Proper location of the symbol, not all the rule */
      58    location sym_loc;
      59  
      60    /* If this symbol is the generated lhs for a midrule but this is the rule in
      61       whose rhs it appears, MIDRULE = a pointer to that midrule.  */
      62    struct symbol_list *midrule;
      63  
      64    /* If this symbol is the generated lhs for a midrule and this is that
      65       midrule, MIDRULE_PARENT_RULE = a pointer to the rule in whose rhs it
      66       appears, and MIDRULE_PARENT_RHS_INDEX = its rhs index (1-origin) in the
      67       parent rule.  */
      68    struct symbol_list *midrule_parent_rule;
      69    int midrule_parent_rhs_index;
      70  
      71    /*--------------------------------------------------------------.
      72    | Used for rules only (attached to the "LHS", one per rule even |
      73    | when several RHSs are bound to a single lhs via "|").         |
      74    `--------------------------------------------------------------*/
      75  
      76    /* Location of the RHS. */
      77    location rhs_loc;
      78  
      79    /* Precedence/associativity.  */
      80    symbol *ruleprec;
      81  
      82    /* The action is attached to the LHS of a rule, but action properties for
      83     * each RHS are also stored here.  */
      84    code_props action_props;
      85  
      86    /* The location of the first %empty for this rule, or \a
      87       empty_loc.  */
      88    location percent_empty_loc;
      89  
      90    int dprec;
      91    location dprec_loc;
      92    int merger;
      93    location merger_declaration_loc;
      94  
      95    /* Counts of the number of expected conflicts for this rule, or -1 if none
      96       given. */
      97    int expected_sr_conflicts;
      98    int expected_rr_conflicts;
      99  
     100    /* The list.  */
     101    struct symbol_list *next;
     102  } symbol_list;
     103  
     104  
     105  /** Create a list containing \c sym at \c loc.  */
     106  symbol_list *symbol_list_sym_new (symbol *sym, location loc);
     107  
     108  /** Create a list containing \c type_name at \c loc.  */
     109  symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
     110  
     111  /** Assign the type \c type_name to all the members of \c syms.
     112   ** \returns \c syms */
     113  symbol_list *symbol_list_type_set (symbol_list *syms, uniqstr type_name);
     114  
     115  /** Find a symbol with the same content as \c sym within \c syms.  */
     116  symbol_list *symbol_list_find_symbol (symbol_list *syms, const symbol *sym);
     117  
     118  /** Print this list.
     119  
     120    \pre For every node \c n in the list, <tt>n->content_type =
     121    SYMLIST_SYMBOL</tt>.  */
     122  void symbol_list_syms_print (const symbol_list *l, FILE *f);
     123  
     124  /** Prepend \c node to \c list.  */
     125  symbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node);
     126  
     127  /** The last node of this list. */
     128  symbol_list *symbol_list_last (symbol_list *list);
     129  
     130  /** Append \c node to \c list.  */
     131  symbol_list *symbol_list_append (symbol_list *list, symbol_list *node);
     132  
     133  /** Free \c list, but not the items it contains.  */
     134  void symbol_list_free (symbol_list *list);
     135  
     136  /** Return the length of \c l. */
     137  int symbol_list_length (symbol_list const *l);
     138  
     139  /** Get item \c n in symbol list \c l.
     140   ** \pre  0 <= n
     141   ** \post res != NULL
     142   **/
     143  symbol_list *symbol_list_n_get (symbol_list *l, int n);
     144  
     145  /** Get the data type (alternative in the union) of the value for
     146      symbol N in rule RULE.  */
     147  uniqstr symbol_list_n_type_name_get (symbol_list *l, int n);
     148  
     149  /** Check whether the node is a border element of a rule. */
     150  bool symbol_list_null (symbol_list *node);
     151  
     152  /** Set the \c \%destructor or \c \%printer for \c node as \c cprops.  */
     153  void symbol_list_code_props_set (symbol_list *node, code_props_type kind,
     154                                   code_props const *cprops);
     155  
     156  #endif /* !SYMLIST_H_ */