]> git.saurik.com Git - bison.git/blobdiff - src/symtab.h
Flag glr tests.
[bison.git] / src / symtab.h
index 4dd463f37b902ff3634c58993a18bf8d1fd45339..0e521626c7e41b96e6c0e20945c9c0f2c3ceb79a 100644 (file)
@@ -1,84 +1,99 @@
-/* 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, 2007, 2008
    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.
 
-   Bison is free software; you can redistribute it and/or modify
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
 
-   Bison is distributed in the hope that it will be useful,
+   This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    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.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/**
+ * \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 "location.h"
+# include "scan-code.h"
+# include "uniqstr.h"
 
 /*----------.
 | Symbols.  |
 `----------*/
 
 
 /*----------.
 | Symbols.  |
 `----------*/
 
-/* Associativity values for tokens and rules.  */
+/** Symbol classes.  */
 typedef enum
 {
 typedef enum
 {
-  undef_assoc,
-  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;
-  /* The location of its first occurence.  */
-  location_t location;
-
-  /* Its %type and associated printer and destructor.  */
-  char *type_name;
-  char *destructor;
-  location_t destructor_location;
-  char *printer;
-  location_t printer_location;
-
-  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 \c \%type.  */
+  uniqstr type_name;
+  /** Its \c \%type's location.  */
+  location type_location;
+
+  /** Any \c \%destructor declared specifically for this symbol.
+
+     Access this field only through <tt>symbol</tt>'s interface functions.  For
+     example, if <tt>symbol::destructor = NULL</tt>, a default \c \%destructor
+     or a per-type \c \%destructor might be appropriate, and
+     \c symbol_destructor_get will compute the correct one.  */
+  code_props destructor;
+
+  /** Any \c \%printer declared specifically for this symbol.
+
+     Access this field only through <tt>symbol</tt>'s interface functions.
+     \sa symbol::destructor  */
+  code_props printer;
+
+  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
@@ -88,84 +103,163 @@ 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)
+
+/** 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);
+
+
+/*--------------------.
+| Methods on symbol.  |
+`--------------------*/
+
+/** Print a symbol (for debugging). */
+void symbol_print (symbol *s, FILE *f);
+
+/** Is this a dummy nonterminal?  */
+bool symbol_is_dummy (const symbol *sym);
+
+/** Return the name of the symbol that can be used as an identifier.
+ ** Consider the alias if needed.
+ ** Return 0 if there is none (e.g., the symbol is only defined as
+ ** a string). */
+uniqstr symbol_id_get (symbol const *sym);
+
+/** 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);
+
+/** Get the \c class string associated with \c sym.  */
+const char *symbol_class_get_string (symbol *sym);
+
+/** Set the \c destructor associated with \c sym.  */
+void symbol_destructor_set (symbol *sym, code_props const *destructor);
+
+/** Get the computed \c \%destructor for \c sym, which was initialized with
+    \c code_props_none_init if there's no \c \%destructor.  */
+code_props const *symbol_destructor_get (symbol const *sym);
+
+/** Set the \c printer associated with \c sym.  */
+void symbol_printer_set (symbol *sym, code_props const *printer);
+
+/** Get the computed \c \%printer for \c sym, which was initialized with
+    \c code_props_none_init if there's no \c \%printer.  */
+code_props const *symbol_printer_get (symbol const *sym);
+
+/* 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);
+
+/** Set the \c user_token_number associated with \c sym.  */
+void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
+
+
+
+/*------------------.
+| Special symbols.  |
+`------------------*/
+
+/** 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.
+
+   $accept: start-symbol $end */
+extern symbol *accept;
 
 
+/** The user start symbol. */
+extern symbol *startsymbol;
+/** The location of the \c \%start declaration.  */
+extern location startsymbol_location;
 
 
-/* Fetch (or create) the symbol associated to KEY.  */
-symbol_t *symbol_get PARAMS ((const char *key, location_t location));
 
 
-/* Generate a dummy nonterminal, whose name cannot conflict with the
-   user's names.  */
-symbol_t *dummy_symbol_get PARAMS ((location_t location));
+/*-----------------.
+| Semantic types.  |
+`-----------------*/
 
 
-/* Declare the new SYMBOL.  Make it an alias of SYMVAL.  */
-void symbol_make_alias PARAMS ((symbol_t *symbol, symbol_t *symval,
-                               location_t location));
+/** A semantic type and its associated \c \%destructor and \c \%printer.
 
 
-/* Set the TYPE_NAME associated to SYMBOL. Does nothing if passed 0 as
-   TYPE_NAME.  */
-void symbol_type_set PARAMS ((symbol_t *symbol,
-                             char *type_name, location_t location));
+   Access the fields of this struct only through the interface functions in
+   this file.  \sa symbol::destructor  */
+typedef struct {
+  /** The key, name of the semantic type.  */
+  uniqstr tag;
 
 
-/* Set the DESTRUCTOR associated to SYMBOL.  */
-void symbol_destructor_set PARAMS ((symbol_t *symbol,
-                                   char *destructor, location_t location));
+  /** Any \c %destructor declared for this semantic type.  */
+  code_props destructor;
+  /** Any \c %printer declared for this semantic type.  */
+  code_props printer;
+} semantic_type;
 
 
-/* Set the PRINTER associated to SYMBOL.  */
-void symbol_printer_set PARAMS ((symbol_t *symbol,
-                                char *printer, location_t location));
+/** Fetch (or create) the semantic type associated to KEY.  */
+semantic_type *semantic_type_from_uniqstr (const uniqstr key);
 
 
-/* Set the PRECEDENCE associated to SYMBOL.  Ensures that SYMBOL is a
-   terminal.  Does nothing if invoked with UNDEF_ASSOC as ASSOC.  */
-void symbol_precedence_set PARAMS ((symbol_t *symbol,
-                                   int prec, associativity assoc,
-                                   location_t location));
+/** Fetch (or create) the semantic type associated to KEY.  */
+semantic_type *semantic_type_get (const char *key);
 
 
-/* Set the CLASS associated to SYMBOL.  */
-void symbol_class_set PARAMS ((symbol_t *symbol,
-                              symbol_class class, location_t location));
+/** Set the \c destructor associated with \c type.  */
+void semantic_type_destructor_set (semantic_type *type,
+                                   code_props const *destructor);
 
 
-/* Set the USER_TOKEN_NUMBER associated to SYMBOL.  */
-void symbol_user_token_number_set PARAMS ((symbol_t *symbol,
-                                          int user_number,
-                                          location_t location));
+/** Set the \c printer associated with \c type.  */
+void semantic_type_printer_set (semantic_type *type,
+                                code_props const *printer);
 
 
+/*----------------------------------.
+| Symbol and semantic type tables.  |
+`----------------------------------*/
 
 
-/* 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;
-extern location_t startsymbol_location;
+/** Create the symbol and semantic type tables.  */
+void symbols_new (void);
 
 
+/** Free all the memory allocated for symbols and semantic types.  */
+void symbols_free (void);
 
 
-/*---------------.
-| Symbol table.  |
-`---------------*/
+/** Check that all the symbols are defined.
 
 
+    Report any undefined symbols and consider them nonterminals.  */
+void symbols_check_defined (void);
 
 
-/* Create the symbol table.  */
-void symbols_new PARAMS ((void));
+/** Sanity checks and #token_translations construction.
 
 
-/* A function to apply to each symbol. */
-typedef bool (*symbol_processor) PARAMS ((symbol_t *));
+   Perform various sanity checks, assign symbol numbers, and set up
+   #token_translations.  */
+void symbols_pack (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));
 
 
-/* Free all the memory allocated for symbols.  */
-void symbols_free PARAMS ((void));
+/*---------------------------------------.
+| Default %destructor's and %printer's.  |
+`---------------------------------------*/
 
 
-/* Check that all the symbols are defined.  Report any undefined
-   symbols and consider them nonterminals.  */
-void symbols_check_defined PARAMS ((void));
+/** Set the default \c \%destructor for tagged values.  */
+void default_tagged_destructor_set (code_props const *destructor);
+/** Set the default \c \%destructor for tagless values.  */
+void default_tagless_destructor_set (code_props const *destructor);
 
 
-/* Perform various sanity checks, assign symbol numbers, and set up
-   TOKEN_TRANSLATIONS.  */
-void symbols_pack PARAMS ((void));
+/** Set the default \c \%printer for tagged values.  */
+void default_tagged_printer_set (code_props const *printer);
+/** Set the default \c \%printer for tagless values.  */
+void default_tagless_printer_set (code_props const *printer);
 
 #endif /* !SYMTAB_H_ */
 
 #endif /* !SYMTAB_H_ */