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:
Akim Demaille
2012-06-22 14:47:31 +02:00
parent 71da68b366
commit 6a0655d9cd
3 changed files with 37 additions and 30 deletions

View File

@@ -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
} }
} }

View File

@@ -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)

View File

@@ -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). */