diff options
author | Joel E. Denny <jdenny@ces.clemson.edu> | 2007-01-02 23:31:14 +0000 |
---|---|---|
committer | Joel E. Denny <jdenny@ces.clemson.edu> | 2007-01-02 23:31:14 +0000 |
commit | 28e52c0d622b3017e14d2cf2e526238aa2cfd6ef (patch) | |
tree | 7eb0d069b70590bebf4228d94cf3611c6a58f70a /src/scan-code.h | |
parent | 960349830600dc408ebd1ddc9710aa3ed955ed66 (diff) | |
download | bison-28e52c0d622b3017e14d2cf2e526238aa2cfd6ef.tar.gz |
Encapsulate code properties and related functionality for the various
destructors, printers, and actions into a code_props structure and
interface. This patch merely implements code_props in scan-code.h and
scan-code.l. Future patches will rewrite other modules to use it.
Discussed starting at
<http://lists.gnu.org/archive/html/bison-patches/2006-11/msg00020.html>.
* src/location.h (EMPTY_LOCATION_INIT): Define so that it's easier to
consistently initialize const structs that have an empty location
field.
* src/location.c (empty_location): Initialize with EMPTY_LOCATION_INIT
to ensure consistency.
* src/scan-code.h (code_props): New structure.
(code_props_none_init, CODE_PROPS_NONE_INIT, code_props_none): New
function, macro, and const global variable for initializing a
code_props with no code.
(code_props_plain_init, code_props_symbol_action_init,
code_props_rule_action_init, code_props_translate_code): The rest of
the new code_props functional interface. Among other things, the init
functions set the code_props kind field so that
code_props_translate_code will know whether to behave like
translate_symbol_action, translate_rule_action, or translate_code.
These old translate functions must remain until all other modules are
updated to use the new code_props interface.
(code_scanner_last_string_free): New function similar to
gram_scanner_last_string_free.
(code_scanner_free): Add documentation.
* src/scan-code.l: Implement the new interface.
(code_lex): Make it static, add a code_props* argument, and remove the
rule argument.
(last_string): New static global similar to the one in scan-gram.l.
(SC_RULE_ACTION): Update to use the code_props* argument to code_lex
instead of rule.
(SC_SYMBOL_ACTION): For $$, set the is_value_used member of the
code_props since Bison may one day use this information for destructors
and printers.
(<*><<EOF>>): Use STRING_FINISH so that last_string is set.
(handle_action_dollar): Use symbol_list_n_get and set used flag
directly since symbol_list_n_used_set is removed.
(translate_action): Add a code_props* argument and remove the rule,
action, and location arguments. Pass the code_props* on to code_lex.
(translate_rule_action, translate_symbol_action, translate_code):
Rewrite as wrappers around the new code_props interface.
* src/symlist.h, src/symlist.c (symbol_list_n_used_set): Remove since
it would eventually need to break the encapsulation of code_props.
Diffstat (limited to 'src/scan-code.h')
-rw-r--r-- | src/scan-code.h | 148 |
1 files changed, 142 insertions, 6 deletions
diff --git a/src/scan-code.h b/src/scan-code.h index f2d79720..a6e1fc13 100644 --- a/src/scan-code.h +++ b/src/scan-code.h @@ -1,6 +1,6 @@ -/* Bison Action Scanner +/* Bison code properties structure and scanner. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006, 2007 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -24,13 +24,149 @@ # define SCAN_CODE_H_ # include "location.h" -# include "symlist.h" -/* Keeps track of the maximum number of semantic values to the left of - a handle (those referenced by $0, $-1, etc.) are required by the - semantic actions of this grammar. */ +struct symbol_list; + +/** + * Keeps track of the maximum number of semantic values to the left of a handle + * (those referenced by $0, $-1, etc.) that are required by the semantic + * actions of this grammar. + */ extern int max_left_semantic_context; +/** + * A code passage captured from the grammar file and possibly translated, + * and/or properties associated with such a code passage. Don't break + * encapsulation by modifying the fields directly. Use the provided interface + * functions. + */ +typedef struct code_props { + /** Set by the init functions. */ + enum { + CODE_PROPS_NONE, CODE_PROPS_PLAIN, + CODE_PROPS_SYMBOL_ACTION, CODE_PROPS_RULE_ACTION + } kind; + + /** \c NULL iff \c code_props::kind is \c CODE_PROPS_NONE. */ + char const *code; + /** Undefined iff \c code_props::code is \c NULL. */ + location location; + + /** + * \c false iff either: + * - \c code_props_translate_code has never previously been invoked for + * the \c code_props that would contain the code passage associated + * with \c self. (That \c code_props is not the same as this one if this + * one is for a RHS \c symbol_list node. Instead, it's the \c code_props + * for the LHS symbol of the same rule.) + * - \c code_props_translate_code has been invoked for that \c code_props, + * but the symbol value associated with this \c code_props was not + * referenced in the code passage. + */ + bool is_value_used; + + /** \c NULL iff \c code_props::kind is not \c CODE_PROPS_RULE_ACTION. */ + struct symbol_list *rule; +} code_props; + +/** + * \pre + * - <tt>self != NULL</tt>. + * \post + * - \c self has been overwritten to contain no code. + */ +void code_props_none_init (code_props *self); + +/** Equivalent to \c code_props_none_init. */ +#define CODE_PROPS_NONE_INIT \ + {CODE_PROPS_NONE, NULL, EMPTY_LOCATION_INIT, false, NULL} + +/** Initialized by \c CODE_PROPS_NONE_INIT with no further modification. */ +extern code_props const code_props_none; + +/** + * \pre + * - <tt>self != NULL</tt>. + * - <tt>code != NULL</tt>. + * - \c code is an untranslated code passage containing no Bison escapes. + * - \c code was extracted from the grammar file at \c code_loc. + * \post + * - \c self has been overwritten to represent the specified plain code + * passage. + * - \c self will become invalid if the caller frees \c code before invoking + * \c code_props_translate_code on \c self. + */ +void code_props_plain_init (code_props *self, char const *code, + location code_loc); + +/** + * \pre + * - <tt>self != NULL</tt>. + * - <tt>code != NULL</tt>. + * - \c code is an untranslated code passage. The only Bison escapes it + * might contain are $$ and \@$, referring to a single symbol. + * - \c code was extracted from the grammar file at \c code_loc. + * \post + * - \c self has been overwritten to represent the specified symbol action. + * - \c self will become invalid if the caller frees \c code before invoking + * \c code_props_translate_code on \c self. + */ +void code_props_symbol_action_init (code_props *self, char const *code, + location code_loc); + +/** + * \pre + * - <tt>self != NULL</tt>. + * - <tt>code != NULL</tt>. + * - <tt>rule != NULL</tt>. + * - \c code is the untranslated action of the rule for which \c rule is the + * LHS node. Thus, \c code possibly contains Bison escapes such as $$, $1, + * $2, etc referring to the values of the rule. + * - \c code was extracted from the grammar file at \c code_loc. + * \post + * - \c self has been overwritten to represent the specified rule action. + * - \c self does not claim responsibility for the memory of \c rule. + * - \c self will become invalid if: + * - The caller frees \c code before invoking \c code_props_translate_code + * on \c self. + * - The caller frees \c rule. + */ +void code_props_rule_action_init (code_props *self, char const *code, + location code_loc, struct symbol_list *rule); + +/** + * \pre + * - If there's a code passage contained in \c self and it contains Bison + * escapes, all grammar declarations have already been parsed as they may + * affect warnings and complaints issued here. + * \post + * - All M4-special symbols and Bison escapes have been translated in + * \c self->code. + * - <tt>self->code != self->code\@pre</tt> unless + * <tt>self->code\@pre = NULL</tt>. + */ +void code_props_translate_code (code_props *self); + +/** + * \pre + * - None. + * \post + * - The dynamic memory allocated by the previous invocation of + * \c code_props_translate_code (if any) was freed. The \c code_props + * instance for which \c code_props_translate_code was invoked is now + * invalid. + */ +void code_scanner_last_string_free (void); + +/** + * \pre + * - None. + * \post + * - All dynamic memory allocated during any previous invocations of + * \c code_props_translate_code, \c translate_rule_action, + * \c translate_symbol_action, and \c translate_code has been freed. All + * \c code_props instances may now be invalid. + */ void code_scanner_free (void); /* The action of the rule R contains $$, $1 etc. referring to the values |