From: Akim Demaille Date: Thu, 27 Nov 2008 20:47:11 +0000 (+0100) Subject: Use the symbol properties to output the printer/destructor for lalr1.cc. X-Git-Tag: v2.7.90~979 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/2bde91138d696cd5b05eeea61ebf709695ca695e?ds=sidebyside Use the symbol properties to output the printer/destructor for lalr1.cc. Instead of defining complex list of tuples to define various properties of the symbols, we now prefer to define symbols as "structs" in m4: using the symbol key (its number), and the property name, b4_symbol gives it value. Use this to handle destructors and printers. * src/output.c (CODE_PROP): New. (prepare_symbol_definitions): Use it to define the printer and destructor related attributes of the symbols. * data/lalr1.cc (b4_symbol_actions): Rename as... (b4_symbol_action): this. Use b4_symbol instead of 6 arguments. (b4_symbol_printer, b4_symbol_destructor): New. Use them instead of b4_symbol_actions. --- diff --git a/ChangeLog b/ChangeLog index 9890b5fa..bb18059c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2008-12-01 Akim Demaille + + Use the symbol properties to output the printer/destructor for lalr1.cc. + Instead of defining complex list of tuples to define various properties of + the symbols, we now prefer to define symbols as "structs" in m4: using the + symbol key (its number), and the property name, b4_symbol gives it value. + Use this to handle destructors and printers. + + * src/output.c (CODE_PROP): New. + (prepare_symbol_definitions): Use it to define the printer and + destructor related attributes of the symbols. + * data/lalr1.cc (b4_symbol_actions): Rename as... + (b4_symbol_action): this. + Use b4_symbol instead of 6 arguments. + (b4_symbol_printer, b4_symbol_destructor): New. + Use them instead of b4_symbol_actions. + 2008-12-01 Akim Demaille Avoid capturing variables too easily. diff --git a/data/lalr1.cc b/data/lalr1.cc index 0ccf2237..76a0bcf2 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -152,23 +152,33 @@ m4_define([b4_symbol_if], [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])]) -# b4_symbol_actions(FILENAME, LINENO, -# SYMBOL-TAG, SYMBOL-NUM, -# SYMBOL-ACTION, SYMBOL-TYPENAME) -# ------------------------------------------------- +# b4_symbol_action(SYMBOL-NUM, KIND) +# ---------------------------------- +# Run the action KIND (destructor or printer) for SYMBOL-NUM. # Same as in C, but using references instead of pointers. -m4_define([b4_symbol_actions], +m4_define([b4_symbol_action], +[b4_symbol_if([$1], [has_$2], [m4_pushdef([b4_dollar_dollar], - [b4_symbol_value_template([yysym.value], [$6])])dnl + [b4_symbol_value_template([yysym.value], + b4_symbol_if([$1], [has_type], + [b4_symbol([$1], [type])]))])dnl m4_pushdef([b4_at_dollar], [yysym.location])dnl - case $4: // $3 -b4_syncline([$2], [$1]) - $5; + case $1: // b4_symbol([$1], [tag]) +b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"]) + b4_symbol([$1], [$2]) b4_syncline([@oline@], [@ofile@]) break; + m4_popdef([b4_at_dollar])dnl m4_popdef([b4_dollar_dollar])dnl -]) +])]) + + +# b4_symbol_destructor(SYMBOL-NUM) +# b4_symbol_printer(SYMBOL-NUM) +# -------------------------------- +m4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])]) +m4_define([b4_symbol_printer], [b4_symbol_action([$1], [printer])]) # b4_symbol_case_(SYMBOL-NUM) @@ -1027,9 +1037,9 @@ b4_percent_code_get[]dnl // User destructor. switch (yytype) { -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ - default: - break; +]m4_map([b4_symbol_destructor], m4_defn([b4_symbol_numbers]))dnl +[ default: + break; }]b4_variant_if([ // Type destructor. @@ -1048,8 +1058,8 @@ b4_percent_code_get[]dnl << yysym.location << ": "])[; switch (yytype) { -]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))[ - default: +]m4_map([b4_symbol_printer], m4_defn([b4_symbol_numbers]))dnl +[ default: break; } yyo << ')'; diff --git a/src/output.c b/src/output.c index bcd71912..6fcff5ff 100644 --- a/src/output.c +++ b/src/output.c @@ -428,6 +428,28 @@ prepare_symbol_definitions (void) SET_KEY("type"); MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : ""); +#define CODE_PROP(PropName) \ + do { \ + code_props const *p = symbol_ ## PropName ## _get (sym); \ + SET_KEY("has_" #PropName); \ + MUSCLE_INSERT_INT (key, !!p->code); \ + \ + if (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); + CODE_PROP(printer); +#undef CODE_PROP #undef SET_KEY } }