1 /* Definitions for symtab.c and callers, part of bison, 
   2    Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002 
   3    Free Software Foundation, Inc. 
   5    This file is part of Bison, the GNU Compiler Compiler. 
   7    Bison is free software; you can redistribute it and/or modify 
   8    it under the terms of the GNU General Public License as published by 
   9    the Free Software Foundation; either version 2, or (at your option) 
  12    Bison is distributed in the hope that it will be useful, 
  13    but WITHOUT ANY WARRANTY; without even the implied warranty of 
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  15    GNU General Public License for more details. 
  17    You should have received a copy of the GNU General Public License 
  18    along with Bison; see the file COPYING.  If not, write to 
  19    the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
  20    Boston, MA 02111-1307, USA.  */ 
  25 # include "location.h" 
  36   token_sym
,            /* terminal symbol */ 
  37   nterm_sym             
/* non-terminal */ 
  41 /* Internal token numbers. */ 
  42 typedef short symbol_number_t
; 
  43 #define SYMBOL_NUMBER_MAX ((symbol_number_t) SHRT_MAX) 
  46 typedef struct symbol_s symbol_t
; 
  49   /* The key, name of the symbol.  */ 
  51   /* The location of its first occurence.  */ 
  54   /* Its %type and associated printer and destructor.  */ 
  57   location_t destructor_location
; 
  59   location_t printer_location
; 
  61   symbol_number_t number
; 
  64   int user_token_number
; 
  66   /* Points to the other in the identifier-symbol pair for an alias. 
  67      Special value USER_NUMBER_ALIAS in the identifier half of the 
  68      identifier-symbol pair for an alias.  */ 
  73 /* Undefined user number.  */ 
  74 #define USER_NUMBER_UNDEFINED -1 
  76 /* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol 
  77    *has* (not is) a string literal alias.  For instance, `%token foo 
  78    "foo"' has `"foo"' numbered regularly, and `foo' numbered as 
  80 #define USER_NUMBER_ALIAS -9991 
  82 /* Undefined internal token number.  */ 
  83 #define NUMBER_UNDEFINED ((symbol_number_t) -1) 
  86 /* Fetch (or create) the symbol associated to KEY.  */ 
  87 symbol_t 
*symbol_get (const char *key
, location_t location
); 
  89 /* Generate a dummy nonterminal, whose name cannot conflict with the 
  91 symbol_t 
*dummy_symbol_get (location_t location
); 
  93 /* Declare the new SYMBOL.  Make it an alias of SYMVAL.  */ 
  94 void symbol_make_alias (symbol_t 
*symbol
, symbol_t 
*symval
, 
  97 /* Set the TYPE_NAME associated to SYMBOL. Does nothing if passed 0 as 
  99 void symbol_type_set (symbol_t 
*symbol
, 
 100                       char *type_name
, location_t location
); 
 102 /* Set the DESTRUCTOR associated to SYMBOL.  */ 
 103 void symbol_destructor_set (symbol_t 
*symbol
, 
 104                             char *destructor
, location_t location
); 
 106 /* Set the PRINTER associated to SYMBOL.  */ 
 107 void symbol_printer_set (symbol_t 
*symbol
, 
 108                          char *printer
, location_t location
); 
 110 /* Set the PRECEDENCE associated to SYMBOL.  Ensures that SYMBOL is a 
 111    terminal.  Does nothing if invoked with UNDEF_ASSOC as ASSOC.  */ 
 112 void symbol_precedence_set (symbol_t 
*symbol
, 
 113                             int prec
, assoc_t assoc
, location_t location
); 
 115 /* Set the CLASS associated to SYMBOL.  */ 
 116 void symbol_class_set (symbol_t 
*symbol
, 
 117                        symbol_class 
class, location_t location
); 
 119 /* Set the USER_TOKEN_NUMBER associated to SYMBOL.  */ 
 120 void symbol_user_token_number_set (symbol_t 
*symbol
, 
 121                                    int user_number
, location_t location
); 
 124 /* Distinguished symbols.  AXIOM is the real start symbol, that used 
 125    by the automaton.  STARTSYMBOL is the one specified by the user. 
 127 extern symbol_t 
*errtoken
; 
 128 extern symbol_t 
*undeftoken
; 
 129 extern symbol_t 
*endtoken
; 
 130 extern symbol_t 
*accept
; 
 131 extern symbol_t 
*startsymbol
; 
 132 extern location_t startsymbol_location
; 
 140 /* Create the symbol table.  */ 
 141 void symbols_new (void); 
 143 /* A function to apply to each symbol. */ 
 144 typedef bool (*symbol_processor
) (symbol_t 
*); 
 146 /* Apply PROCESSOR to all the symbols.  PROCESSOR must return true: on 
 147    false, the processing stops.  */ 
 148 void symbols_do (symbol_processor processor
, void *processor_data
); 
 150 /* Free all the memory allocated for symbols.  */ 
 151 void symbols_free (void); 
 153 /* Check that all the symbols are defined.  Report any undefined 
 154    symbols and consider them nonterminals.  */ 
 155 void symbols_check_defined (void); 
 157 /* Perform various sanity checks, assign symbol numbers, and set up 
 158    TOKEN_TRANSLATIONS.  */ 
 159 void symbols_pack (void); 
 161 #endif /* !SYMTAB_H_ */