]> git.saurik.com Git - bison.git/blobdiff - src/symtab.h
* src/parse-gram.y (grammar_declaration): Don't confuse Doxygen (at
[bison.git] / src / symtab.h
index 4ca81465d9e2dae9586d6ba1ca400e51c0d6828d..00770a6e24807fbea6c3eb27db14d48cadbb9de9 100644 (file)
@@ -1,5 +1,6 @@
-/* Definitions for symtab.c and callers, part of bison,
-   Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002
+/* Definitions for symtab.c and callers, part of Bison.
+
+   Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2004, 2005, 2006
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
    Free Software Foundation, Inc.
 
    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.  */
+
+/**
+ * \file symtab.h
+ * \brief Manipulating ::symbol.
+ */
 
 #ifndef SYMTAB_H_
 # define SYMTAB_H_
 
 
 #ifndef SYMTAB_H_
 # define SYMTAB_H_
 
+# include "assoc.h"
+# include "location.h"
+# include "uniqstr.h"
+
 /*----------.
 | Symbols.  |
 `----------*/
 
 /*----------.
 | Symbols.  |
 `----------*/
 
-/* Associativity values for tokens and rules.  */
+/** Symbol classes.  */
 typedef enum
 {
 typedef enum
 {
-  right_assoc,
-  left_assoc,
-  non_assoc
-} associativity;
-
-
-/* Symbol classes.  */
-typedef enum
-{
-  unknown_sym,
-  token_sym,           /* terminal symbol */
-  nterm_sym            /* non-terminal */
+  unknown_sym,          /**< Undefined.  */
+  token_sym,           /**< Terminal. */
+  nterm_sym            /**< Non-terminal. */
 } symbol_class;
 
 
 } symbol_class;
 
 
-/* Internal token numbers. */
-typedef short symbol_number_t;
+/** Internal token numbers. */
+typedef int symbol_number;
+#define SYMBOL_NUMBER_MAXIMUM INT_MAX
+
 
 
+typedef struct symbol symbol;
 
 
-typedef struct symbol_s symbol_t;
-struct symbol_s
+/* When extending this structure, be sure to complete
+   symbol_check_alias_consistency.  */
+struct symbol
 {
 {
-  /* The key, name of the symbol. */
-  char *tag;
-  /* Its type. */
-  char *type_name;
-
-  symbol_number_t number;
-  short prec;
-  associativity assoc;
+  /** The key, name of the symbol.  */
+  uniqstr tag;
+  /** The location of its first occurrence.  */
+  location location;
+
+  /** Its %type and associated printer and destructor.  */
+  uniqstr type_name;
+  location type_location;
+
+  /** Does not own the memory. */
+  const char *destructor;
+  location destructor_location;
+
+  /** Printer. */
+  const char *printer;
+  location printer_location;
+
+  symbol_number number;
+  location prec_location;
+  int prec;
+  assoc assoc;
   int user_token_number;
 
   /* Points to the other in the identifier-symbol pair for an alias.
      Special value USER_NUMBER_ALIAS in the identifier half of the
      identifier-symbol pair for an alias.  */
   int user_token_number;
 
   /* Points to the other in the identifier-symbol pair for an alias.
      Special value USER_NUMBER_ALIAS in the identifier half of the
      identifier-symbol pair for an alias.  */
-  symbol_t *alias;
+  symbol *alias;
   symbol_class class;
   symbol_class class;
+  bool declared;
 };
 
 };
 
-/* Undefined user number.  */
+
+/** Undefined user number.  */
 #define USER_NUMBER_UNDEFINED -1
 
 /* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
 #define USER_NUMBER_UNDEFINED -1
 
 /* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
@@ -78,32 +98,65 @@ struct symbol_s
 #define USER_NUMBER_ALIAS -9991
 
 /* Undefined internal token number.  */
 #define USER_NUMBER_ALIAS -9991
 
 /* Undefined internal token number.  */
-#define NUMBER_UNDEFINED ((symbol_number_t) -1)
+#define NUMBER_UNDEFINED (-1)
+
+/** Print a symbol (for debugging). */
+void symbol_print (symbol *s, FILE *f);
+
+/** Fetch (or create) the symbol associated to KEY.  */
+symbol *symbol_from_uniqstr (const uniqstr key, location loc);
+
+/** Fetch (or create) the symbol associated to KEY.  */
+symbol *symbol_get (const char *key, location loc);
+
+/** Generate a dummy nonterminal.
+
+   Its name cannot conflict with the user's names.  */
+symbol *dummy_symbol_get (location loc);
+
+/** Declare the new symbol \c sym.  Make it an alias of \c symval.  */
+void symbol_make_alias (symbol *sym, symbol *symval, location loc);
+
+/** Set the \c type_name associated with \c sym.
+
+    Do nothing if passed 0 as \c type_name.  */
+void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
+
+/** Set the \c destructor associated with \c sym.  */
+void symbol_destructor_set (symbol *sym, const char *destructor, location loc);
+
+/** Set the \c printer associated with \c sym.  */
+void symbol_printer_set (symbol *sym, const char *printer, location loc);
+
+/* Set the \c precedence associated with \c sym.
+
+   Ensure that \a symbol is a terminal.
+   Do nothing if invoked with \c undef_assoc as \c assoc.  */
+void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
 
 
+/** Set the \c class associated with \c sym.  */
+void symbol_class_set (symbol *sym, symbol_class class, location loc,
+                      bool declaring);
 
 
-/* Fetch (or create) the symbol associated to KEY.  */
-symbol_t *getsym PARAMS ((const char *key));
+/** Set the \c user_token_number associated with \c sym.  */
+void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
 
 
-/* Declare the new SYMBOL.  Make it an alias of SYMVAL, and type */
-/* them with TYPENAME.                                           */
-void symbol_make_alias PARAMS ((symbol_t *symbol, symbol_t *symval,
-                               char *typename));
 
 
-/* Set the TYPE_NAME associated to SYMBOL. */
-void symbol_type_set PARAMS ((symbol_t *symbol, char *type_name));
+/** The error token. */
+extern symbol *errtoken;
+/** The token for unknown tokens.  */
+extern symbol *undeftoken;
+/** The end of input token.  */
+extern symbol *endtoken;
+/** The genuine start symbol.
 
 
-/* Set the PRECEDENCE associated to SYMBOL.  */
-void symbol_precedence_set PARAMS ((symbol_t *symbol,
-                                   int prec, associativity assoc));
+   $accept: start-symbol $end */
+extern symbol *accept;
 
 
-/* Distinguished symbols.  AXIOM is the real start symbol, that used
-   by the automaton.  STARTSYMBOL is the one specified by the user.
-   */
-extern symbol_t *errtoken;
-extern symbol_t *undeftoken;
-extern symbol_t *eoftoken;
-extern symbol_t *axiom;
-extern symbol_t *startsymbol;
+/** The user start symbol. */
+extern symbol *startsymbol;
+/** The location of the \c %start declaration.  */
+extern location startsymbol_location;
 
 
 /*---------------.
 
 
 /*---------------.
@@ -111,25 +164,21 @@ extern symbol_t *startsymbol;
 `---------------*/
 
 
 `---------------*/
 
 
-/* Create the symbol table.  */
-void symbols_new PARAMS ((void));
+/** Create the symbol table.  */
+void symbols_new (void);
 
 
-/* A function to apply to each symbol. */
-typedef bool (*symbol_processor) PARAMS ((symbol_t *));
+/** Free all the memory allocated for symbols.  */
+void symbols_free (void);
 
 
-/* Apply PROCESSOR to all the symbols.  PROCESSOR must return TRUE: on
-   FALSE, the processing stops.  */
-void symbols_do PARAMS ((symbol_processor processor, void *processor_data));
+/** Check that all the symbols are defined.
 
 
-/* Free all the memory allocated for symbols.  */
-void symbols_free PARAMS ((void));
+    Report any undefined symbols and consider them nonterminals.  */
+void symbols_check_defined (void);
 
 
-/* Check that all the symbols are defined.  Report any undefined */
-/* symbols and consider them nonterminals.                       */
-void symbols_check_defined PARAMS ((void));
+/** Sanity checks and #token_translations construction.
 
 
-/* Perform various sanity checks, assign symbol numbers, and set up
-   TOKEN_TRANSLATIONS.  */
-void symbols_pack PARAMS ((void));
+   Perform various sanity checks, assign symbol numbers, and set up
+   #token_translations.  */
+void symbols_pack (void);
 
 #endif /* !SYMTAB_H_ */
 
 #endif /* !SYMTAB_H_ */