X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/527187137ac6314b86246bca71cb996203b4fa10..22b081deb7ab1d0ec7a279e5213fa7fdc2c85207:/src/symtab.h?ds=inline
diff --git a/src/symtab.h b/src/symtab.h
index 65155227..84113394 100644
--- a/src/symtab.h
+++ b/src/symtab.h
@@ -51,6 +51,38 @@ typedef int symbol_number;
typedef struct symbol symbol;
+/* Declaration status of a symbol.
+
+ First, it is "undeclared". Then, if "undeclared" and used in a
+ %printer/%destructor, it is "used". If not "declared" by used in a
+ rule, it is "needed". Finally, if declared (via a rule for
+ nonterminals, or %oken), it is "declared".
+
+ When status are checked at the end, "declared" symbols are fine,
+ "used" symbols trigger warnings, otherwise it's an error.
+*/
+
+typedef enum
+ {
+ /** Used in the input file for an unknown reason (error). */
+ undeclared,
+ /** Used by %destructor/%printer but not defined (warning). */
+ used,
+ /** Used in the gramar (rules) but not defined (error). */
+ needed,
+ /** Defined with %type or %token (good). */
+ declared,
+ } status;
+
+typedef enum code_props_type code_props_type;
+enum code_props_type
+ {
+ destructor = 0,
+ printer = 1,
+ };
+
+enum { CODE_PROPS_SIZE = 2 };
+
/* When extending this structure, be sure to complete
symbol_check_alias_consistency. */
struct symbol
@@ -65,19 +97,14 @@ struct symbol
/** Its \c \%type's location. */
location type_location;
- /** Any \c \%destructor declared specifically for this symbol.
-
- Access this field only through symbol's interface functions. For
- example, if symbol::destructor = NULL, 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 \%destructor (resp. \%printer) declared specificially for this
+ symbol.
- /** Any \c \%printer declared specifically for this symbol.
-
- Access this field only through symbol's interface functions.
- \sa symbol::destructor */
- code_props printer;
+ Access this field only through symbol's interface functions. For
+ Example, if symbol::destructor = NULL (resp. symbol::printer
+ = NULL), a default \c \%destructor (resp. \%printer) or a per-type
+ \c symbol_destructor_printer_get will compute the corect one. */
+ code_props props[CODE_PROPS_SIZE];
symbol_number number;
location prec_location;
@@ -90,7 +117,7 @@ struct symbol
symbol-string pair for an alias. */
symbol *alias;
symbol_class class;
- bool declared;
+ status status;
};
/** Undefined user number. */
@@ -127,7 +154,10 @@ 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.
+/** The name of the code_props type: "\%destructor" or "\%printer". */
+char const *code_props_type_string (code_props_type kind);
+
+/** 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). */
@@ -144,19 +174,15 @@ void symbol_make_alias (symbol *sym, symbol *str, location loc);
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, code_props const *destructor);
+/** Set the \c \%destructor or \c \%printer associated with \c sym. */
+void symbol_code_props_set (symbol *sym, code_props_type kind,
+ 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);
+/** Get the computed \c \%destructor or \c %printer for \c sym, which was
+initialized with \c code_props_none_init if there's no \c \%destructor or
+\c %printer. */
+code_props const *symbol_code_props_get (symbol const *sym,
+ code_props_type kind);
/* Set the \c precedence associated with \c sym.
@@ -206,25 +232,30 @@ typedef struct {
/** The key, name of the semantic type. */
uniqstr tag;
- /** Any \c %destructor declared for this semantic type. */
- code_props destructor;
- /** Any \c %printer declared for this semantic type. */
- code_props printer;
+ /** The location of its first occurence. */
+ location location;
+
+ /** Its status : "undeclared", "used" or "declared".
+ It cannot be "needed". */
+ status status;
+
+ /** Any \c %destructor and %printer declared for this
+ semantic type. */
+ code_props props[CODE_PROPS_SIZE];
+
} semantic_type;
/** Fetch (or create) the semantic type associated to KEY. */
-semantic_type *semantic_type_from_uniqstr (const uniqstr key);
+semantic_type *semantic_type_from_uniqstr (const uniqstr key,
+ const location *loc);
/** Fetch (or create) the semantic type associated to KEY. */
-semantic_type *semantic_type_get (const char *key);
+semantic_type *semantic_type_get (const char *key, const location *loc);
-/** Set the \c destructor associated with \c type. */
-void semantic_type_destructor_set (semantic_type *type,
- code_props const *destructor);
-
-/** Set the \c printer associated with \c type. */
-void semantic_type_printer_set (semantic_type *type,
- code_props const *printer);
+/** Set the \c destructor or \c printer associated with \c type. */
+void semantic_type_code_props_set (semantic_type *type,
+ code_props_type kind,
+ code_props const *code);
/*----------------------------------.
| Symbol and semantic type tables. |
@@ -252,14 +283,11 @@ void symbols_pack (void);
| Default %destructor's and %printer's. |
`---------------------------------------*/
-/** 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);
-
-/** 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);
+/** Set the default \c \%destructor or \c \%printer for tagged values. */
+void default_tagged_code_props_set (code_props_type kind,
+ code_props const *code);
+/** Set the default \c \%destructor or \c \%printer for tagless values. */
+void default_tagless_code_props_set (code_props_type kind,
+ code_props const *destructor);
#endif /* !SYMTAB_H_ */