mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-19 09:13:04 +00:00
code_props: factor more.
* src/symtab.h, src/symtab.c (code_props_type_string): No longer static. * src/output.c (CODE_PROPS): Remove, we can now iterate on both the destructor and the printer. (SET_KEY2): New.
This commit is contained in:
56
src/output.c
56
src/output.c
@@ -402,9 +402,16 @@ prepare_symbol_definitions (void)
|
|||||||
const char *key;
|
const char *key;
|
||||||
const char *value;
|
const char *value;
|
||||||
|
|
||||||
#define SET_KEY(Entry) \
|
#define SET_KEY(Entry) \
|
||||||
obstack_fgrow2 (&format_obstack, "symbol(%d, %s)", i, Entry); \
|
obstack_fgrow2 (&format_obstack, "symbol(%d, %s)", \
|
||||||
obstack_1grow (&format_obstack, 0); \
|
i, Entry); \
|
||||||
|
obstack_1grow (&format_obstack, 0); \
|
||||||
|
key = obstack_finish (&format_obstack);
|
||||||
|
|
||||||
|
#define SET_KEY2(Entry, Suffix) \
|
||||||
|
obstack_fgrow3 (&format_obstack, "symbol(%d, %s_%s)", \
|
||||||
|
i, Entry, Suffix); \
|
||||||
|
obstack_1grow (&format_obstack, 0); \
|
||||||
key = obstack_finish (&format_obstack);
|
key = obstack_finish (&format_obstack);
|
||||||
|
|
||||||
// Whether the symbol has an identifier.
|
// Whether the symbol has an identifier.
|
||||||
@@ -436,28 +443,29 @@ prepare_symbol_definitions (void)
|
|||||||
SET_KEY("type");
|
SET_KEY("type");
|
||||||
MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");
|
MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");
|
||||||
|
|
||||||
#define CODE_PROP(PropName) \
|
{
|
||||||
do { \
|
int j;
|
||||||
code_props const *p = symbol_code_props_get (sym, PropName); \
|
for (j = 0; j < CODE_PROPS_SIZE; ++j)
|
||||||
SET_KEY("has_" #PropName); \
|
{
|
||||||
MUSCLE_INSERT_INT (key, !!p->code); \
|
char const *pname = code_props_type_string (j);
|
||||||
\
|
code_props const *p = symbol_code_props_get (sym, j);
|
||||||
if (p->code) \
|
SET_KEY2("has", pname);
|
||||||
{ \
|
MUSCLE_INSERT_INT (key, !!p->code);
|
||||||
SET_KEY(#PropName "_file"); \
|
|
||||||
MUSCLE_INSERT_STRING (key, p->location.start.file); \
|
|
||||||
\
|
|
||||||
SET_KEY(#PropName "_line"); \
|
|
||||||
MUSCLE_INSERT_INT (key, p->location.start.line); \
|
|
||||||
\
|
|
||||||
SET_KEY(#PropName); \
|
|
||||||
MUSCLE_INSERT_STRING_RAW (key, p->code); \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
CODE_PROP(destructor);
|
if (p->code)
|
||||||
CODE_PROP(printer);
|
{
|
||||||
#undef CODE_PROP
|
SET_KEY2(pname, "file");
|
||||||
|
MUSCLE_INSERT_STRING (key, p->location.start.file);
|
||||||
|
|
||||||
|
SET_KEY2(pname, "line");
|
||||||
|
MUSCLE_INSERT_INT (key, p->location.start.line);
|
||||||
|
|
||||||
|
SET_KEY(pname);
|
||||||
|
MUSCLE_INSERT_STRING_RAW (key, p->code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#undef SET_KEY2
|
||||||
#undef SET_KEY
|
#undef SET_KEY
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,11 +100,7 @@ symbol_new (uniqstr tag, location loc)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------.
|
char const *
|
||||||
| Name of the code_props type: %destructor or %printer. |
|
|
||||||
`-------------------------------------------------------*/
|
|
||||||
|
|
||||||
static char const *
|
|
||||||
code_props_type_string (code_props_type kind)
|
code_props_type_string (code_props_type kind)
|
||||||
{
|
{
|
||||||
switch (kind)
|
switch (kind)
|
||||||
|
|||||||
@@ -154,7 +154,10 @@ void symbol_print (symbol *s, FILE *f);
|
|||||||
/** Is this a dummy nonterminal? */
|
/** Is this a dummy nonterminal? */
|
||||||
bool symbol_is_dummy (const symbol *sym);
|
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.
|
** Consider the alias if needed.
|
||||||
** Return 0 if there is none (e.g., the symbol is only defined as
|
** Return 0 if there is none (e.g., the symbol is only defined as
|
||||||
** a string). */
|
** a string). */
|
||||||
|
|||||||
Reference in New Issue
Block a user