]> git.saurik.com Git - bison.git/blobdiff - src/symlist.h
Use ASCII for Sebastien Fricker's name.
[bison.git] / src / symlist.h
index c88c0cae1cb2793840156170312f8a4cec009339..ab9a4b5eb0394819a99a75f234ff502d1a2f8069 100644 (file)
@@ -1,6 +1,6 @@
 /* Lists of symbols for Bison
 
 /* Lists of symbols for Bison
 
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2005, 2006, 2007 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    You should have received a copy of the GNU General Public License
    along with Bison; see the file COPYING.  If not, write to
 
    You should have received a copy of the GNU General Public License
    along with Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #ifndef SYMLIST_H_
 # define SYMLIST_H_
 
 # include "location.h"
 
 #ifndef SYMLIST_H_
 # define SYMLIST_H_
 
 # include "location.h"
+# include "scan-code.h"
 # include "symtab.h"
 
 # include "symtab.h"
 
+/* A list of symbols, used during the parsing to store the rules.  */
 typedef struct symbol_list
 {
 typedef struct symbol_list
 {
-  struct symbol_list *next;
-  symbol *sym;
+  /**
+   * Whether this node contains a symbol, a semantic type, a \c <*>, or a
+   * \c <>.
+   */
+  enum {
+    SYMLIST_SYMBOL, SYMLIST_TYPE,
+    SYMLIST_DEFAULT_TAGGED, SYMLIST_DEFAULT_TAGLESS
+  } content_type;
+  union {
+    /**
+     * The symbol or \c NULL iff
+     * <tt>symbol_list::content_type = SYMLIST_SYMBOL</tt>.
+     */
+    symbol *sym;
+    /**
+     * The semantic type iff <tt>symbol_list::content_type = SYMLIST_TYPE</tt>.
+     */
+    uniqstr type_name;
+  } content;
   location location;
 
   location location;
 
-  /* The action is attached to the LHS of a rule. */
-  const char *action;
-  location action_location;
+  /* If this symbol is the generated lhs for a midrule but this is the rule in
+     whose rhs it appears, MIDRULE = a pointer to that midrule.  */
+  struct symbol_list *midrule;
+
+  /* If this symbol is the generated lhs for a midrule and this is that
+     midrule, MIDRULE_PARENT_RULE = a pointer to the rule in whose rhs it
+     appears, and MIDRULE_PARENT_RHS_INDEX = its rhs index (1-origin) in the
+     parent rule.  */
+  struct symbol_list *midrule_parent_rule;
+  int midrule_parent_rhs_index;
+
+  /* The action is attached to the LHS of a rule, but action properties for
+   * each RHS are also stored here.  */
+  code_props action_props;
 
 
+  /* Precedence/associativity.  */
   symbol *ruleprec;
   int dprec;
   int merger;
   symbol *ruleprec;
   int dprec;
   int merger;
+  location merger_declaration_location;
+
+  /* The list.  */
+  struct symbol_list *next;
 } symbol_list;
 
 
 } symbol_list;
 
 
-/* Create a list containing SYM at LOC.  */
-symbol_list *symbol_list_new (symbol *sym, location loc);
+/** Create a list containing \c sym at \c loc.  */
+symbol_list *symbol_list_sym_new (symbol *sym, location loc);
+
+/** Create a list containing \c type_name at \c loc.  */
+symbol_list *symbol_list_type_new (uniqstr type_name, location loc);
 
 
-/* Prepend SYM at LOC to the LIST.  */
-symbol_list *symbol_list_prepend (symbol_list *list,
-                                 symbol *sym,
-                                 location loc);
+/** Create a list containing a \c <*> at \c loc.  */
+symbol_list *symbol_list_default_tagged_new (location loc);
+/** Create a list containing a \c <> at \c loc.  */
+symbol_list *symbol_list_default_tagless_new (location loc);
 
 
-/* Free the LIST, but not the symbols it contains.  */
+/** Print this list.
+
+  \pre For every node \c n in the list, <tt>n->content_type =
+  SYMLIST_SYMBOL</tt>.  */
+void symbol_list_syms_print (const symbol_list *l, FILE *f);
+
+/** Prepend \c node to \c list.  */
+symbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node);
+
+/** Free \c list, but not the items it contains.  */
 void symbol_list_free (symbol_list *list);
 
 void symbol_list_free (symbol_list *list);
 
-/* Return its length. */
-unsigned int symbol_list_length (symbol_list *list);
+/** Return the length of \c l. */
+int symbol_list_length (symbol_list const *l);
+
+/** Get item \c n in symbol list \c l.  */
+symbol_list *symbol_list_n_get (symbol_list *l, int n);
 
 /* Get the data type (alternative in the union) of the value for
    symbol N in rule RULE.  */
 
 /* Get the data type (alternative in the union) of the value for
    symbol N in rule RULE.  */
-uniqstr symbol_list_n_type_name_get (symbol_list *rp, location loc, int n);
+uniqstr symbol_list_n_type_name_get (symbol_list *l, location loc, int n);
+
+/** Set the \c \%destructor for \c node as \c code at \c loc.  */
+void symbol_list_destructor_set (symbol_list *node, char const *code,
+                                 location loc);
+
+/** Set the \c \%printer for \c node as \c code at \c loc.  */
+void symbol_list_printer_set (symbol_list *node, char const *code,
+                              location loc);
 
 #endif /* !SYMLIST_H_ */
 
 #endif /* !SYMLIST_H_ */