Home | History | Annotate | Download | only in src
      1 /* Definitions for symtab.c and callers, part of Bison.
      2 
      3    Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2004, 2005, 2006
      4    Free Software Foundation, Inc.
      5 
      6    This file is part of Bison, the GNU Compiler Compiler.
      7 
      8    Bison 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 2, or (at your option)
     11    any later version.
     12 
     13    Bison 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 Bison; see the file COPYING.  If not, write to
     20    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     21    Boston, MA 02110-1301, USA.  */
     22 
     23 #ifndef SYMTAB_H_
     24 # define SYMTAB_H_
     25 
     26 # include "assoc.h"
     27 # include "location.h"
     28 # include "uniqstr.h"
     29 
     30 /*----------.
     31 | Symbols.  |
     32 `----------*/
     33 
     34 /* Symbol classes.  */
     35 typedef enum
     36 {
     37   unknown_sym,
     38   token_sym,		/* terminal symbol */
     39   nterm_sym		/* non-terminal */
     40 } symbol_class;
     41 
     42 
     43 /* Internal token numbers. */
     44 typedef int symbol_number;
     45 #define SYMBOL_NUMBER_MAXIMUM INT_MAX
     46 
     47 
     48 typedef struct symbol symbol;
     49 
     50 /* When extending this structure, be sure to complete
     51    symbol_check_alias_consistency.  */
     52 struct symbol
     53 {
     54   /* The key, name of the symbol.  */
     55   uniqstr tag;
     56   /* The location of its first occurrence.  */
     57   location location;
     58 
     59   /* Its %type and associated printer and destructor.  */
     60   uniqstr type_name;
     61   location type_location;
     62 
     63   /* Does not own the memory. */
     64   const char *destructor;
     65   location destructor_location;
     66 
     67   /* Does not own the memory. */
     68   const char *printer;
     69   location printer_location;
     70 
     71   symbol_number number;
     72   location prec_location;
     73   int prec;
     74   assoc assoc;
     75   int user_token_number;
     76 
     77   /* Points to the other in the identifier-symbol pair for an alias.
     78      Special value USER_NUMBER_ALIAS in the identifier half of the
     79      identifier-symbol pair for an alias.  */
     80   symbol *alias;
     81   symbol_class class;
     82   bool declared;
     83 };
     84 
     85 /* Undefined user number.  */
     86 #define USER_NUMBER_UNDEFINED -1
     87 
     88 /* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol
     89    *has* (not is) a string literal alias.  For instance, `%token foo
     90    "foo"' has `"foo"' numbered regularly, and `foo' numbered as
     91    USER_NUMBER_ALIAS.  */
     92 #define USER_NUMBER_ALIAS -9991
     93 
     94 /* Undefined internal token number.  */
     95 #define NUMBER_UNDEFINED (-1)
     96 
     97 /* Print a symbol (for debugging). */
     98 void symbol_print (symbol *s, FILE *f);
     99 
    100 /* Fetch (or create) the symbol associated to KEY.  */
    101 symbol *symbol_get (const char *key, location loc);
    102 
    103 /* Generate a dummy nonterminal, whose name cannot conflict with the
    104    user's names.  */
    105 symbol *dummy_symbol_get (location loc);
    106 
    107 /* Declare the new symbol SYM.  Make it an alias of SYMVAL.  */
    108 void symbol_make_alias (symbol *sym, symbol *symval, location loc);
    109 
    110 /* Set the TYPE_NAME associated with SYM.  Do nothing if passed 0 as
    111    TYPE_NAME.  */
    112 void symbol_type_set (symbol *sym, uniqstr type_name, location loc);
    113 
    114 /* Set the DESTRUCTOR associated with SYM.  */
    115 void symbol_destructor_set (symbol *sym, const char *destructor, location loc);
    116 
    117 /* Set the PRINTER associated with SYM.  */
    118 void symbol_printer_set (symbol *sym, const char *printer, location loc);
    119 
    120 /* Set the PRECEDENCE associated with SYM.  Ensure that SYMBOL is a
    121    terminal.  Do nothing if invoked with UNDEF_ASSOC as ASSOC.  */
    122 void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc);
    123 
    124 /* Set the CLASS associated with SYM.  */
    125 void symbol_class_set (symbol *sym, symbol_class class, location loc,
    126 		       bool declaring);
    127 
    128 /* Set the USER_TOKEN_NUMBER associated with SYM.  */
    129 void symbol_user_token_number_set (symbol *sym, int user_number, location loc);
    130 
    131 
    132 /* Distinguished symbols.  AXIOM is the real start symbol, that used
    133    by the automaton.  STARTSYMBOL is the one specified by the user.
    134    */
    135 extern symbol *errtoken;
    136 extern symbol *undeftoken;
    137 extern symbol *endtoken;
    138 extern symbol *accept;
    139 extern symbol *startsymbol;
    140 extern location startsymbol_location;
    141 
    142 
    143 /*---------------.
    144 | Symbol table.  |
    145 `---------------*/
    146 
    147 
    148 /* Create the symbol table.  */
    149 void symbols_new (void);
    150 
    151 /* Free all the memory allocated for symbols.  */
    152 void symbols_free (void);
    153 
    154 /* Check that all the symbols are defined.  Report any undefined
    155    symbols and consider them nonterminals.  */
    156 void symbols_check_defined (void);
    157 
    158 /* Perform various sanity checks, assign symbol numbers, and set up
    159    TOKEN_TRANSLATIONS.  */
    160 void symbols_pack (void);
    161 
    162 #endif /* !SYMTAB_H_ */
    163