[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] Use the symbol properties to output the printer/destructor for l
From: |
Akim Demaille |
Subject: |
[PATCH] Use the symbol properties to output the printer/destructor for lalr1.cc. |
Date: |
Thu, 27 Nov 2008 21:47:11 +0100 |
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.
---
ChangeLog | 17 +++++++++++++++++
data/lalr1.cc | 40 +++++++++++++++++++++++++---------------
src/output.c | 22 ++++++++++++++++++++++
3 files changed, 64 insertions(+), 15 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 9890b5f..bb18059 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
2008-12-01 Akim Demaille <address@hidden>
+ 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 <address@hidden>
+
Avoid capturing variables too easily.
* src/muscle_tab.h (MUSCLE_INSERT_BOOL, MUSCLE_OBSTACK_SGROW): Use
v__ and p__ instead of v and p.
diff --git a/data/lalr1.cc b/data/lalr1.cc
index 0ccf223..76a0bcf 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(address@hidden@], address@hidden@])
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 bcd7191..6fcff5f 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
}
}
--
1.6.0.4.790.gaa14a
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] Use the symbol properties to output the printer/destructor for lalr1.cc.,
Akim Demaille <=