[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] More information about the symbols.
From: |
Akim Demaille |
Subject: |
[PATCH] More information about the symbols. |
Date: |
Mon, 10 Nov 2008 11:01:21 -0000 |
* src/output.c (type_names_output): Document all the symbols,
including those that don't have a type-name.
(symbol_definitions_output): Define "is_token" and
"has_type_name".
* data/lalr1.cc (b4_type_action_): Skip symbols that have an empty
type-name, now that they are defined too in b4_type_names.
---
ChangeLog | 10 ++++++++++
data/lalr1.cc | 15 ++++++++++++++-
src/output.c | 36 ++++++++++++++++--------------------
3 files changed, 40 insertions(+), 21 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 380aa41..df7bde0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2008-11-10 Akim Demaille <address@hidden>
+ More information about the symbols.
+ * src/output.c (type_names_output): Document all the symbols,
+ including those that don't have a type-name.
+ (symbol_definitions_output): Define "is_token" and
+ "has_type_name".
+ * data/lalr1.cc (b4_type_action_): Skip symbols that have an empty
+ type-name, now that they are defined too in b4_type_names.
+
+2008-11-10 Akim Demaille <address@hidden>
+
Regen.
2008-11-10 Akim Demaille <address@hidden>
diff --git a/data/lalr1.cc b/data/lalr1.cc
index 24b011b..40cdde2 100644
--- a/data/lalr1.cc
+++ b/data/lalr1.cc
@@ -113,6 +113,17 @@ m4_define([b4_symbol],
[m4_indir([b4_symbol($1, $2)])])
+# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE)
+# -------------------------------------------
+# If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE.
+# Otherwise an error.
+m4_define([b4_symbol_if],
+[m4_case(b4_symbol([$1], [$2]),
+ [1], [$3],
+ [0], [$4],
+ [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)
@@ -143,14 +154,16 @@ m4_define([b4_symbol_case_],
# b4_type_action_(NUMS)
# ---------------------
# Run actions for the symbol NUMS that all have the same type-name.
+# Skip NUMS that have no type-name.
m4_define([b4_type_action_],
+[b4_symbol_if([$1], [has_type_name],
[m4_map([b4_symbol_case_], address@hidden)[]dnl
b4_dollar_dollar([b4_symbol([$1], [number])],
[b4_symbol([$1], [tag])],
[b4_symbol([$1], [type_name])]);
break;
-])
+])])
# b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS])
diff --git a/src/output.c b/src/output.c
index 5950b4f..a7003ed 100644
--- a/src/output.c
+++ b/src/output.c
@@ -320,28 +320,17 @@ static void
type_names_output (FILE *out)
{
int i;
- const char *isep = "";
symbol **syms = symbols_by_type_name ();
fputs ("m4_define([b4_type_names],\n[", out);
- for (i = 0; i < nsyms; )
- if (syms[i]->type_name)
- {
- int j;
- const char *jsep = "";
- fprintf (out, "%s[", isep);
- isep = ",\n";
- for (j = i; j < nsyms; ++j)
- {
- if (syms[i]->type_name != syms[j]->type_name)
- break;
- fprintf (out, "%s%d", jsep, syms[j]->number);
- jsep = ", ";
- }
- fputs ("]", out);
- i = j;
- }
- else
- ++i;
+ for (i = 0; i < nsyms; /* nothing */)
+ {
+ // The index of the first symbol of the current type-name.
+ int i0 = i;
+ fputs (i ? ",\n[" : "[", out);
+ for (; i < nsyms && syms[i]->type_name == syms[i0]->type_name; ++i)
+ fprintf (out, "%s%d", i != i0 ? ", " : "", syms[i]->number);
+ fputs ("]", out);
+ }
fputs ("])\n\n", out);
free (syms);
}
@@ -431,9 +420,16 @@ symbol_definitions_output (FILE *out)
SET_KEY("user_number");
MUSCLE_INSERT_INT (key, sym->user_token_number);
+ SET_KEY("is_token");
+ MUSCLE_INSERT_INT (key,
+ i < ntokens && sym != errtoken && sym != undeftoken);
+
SET_KEY("number");
MUSCLE_INSERT_INT (key, sym->number);
+ SET_KEY("has_type_name");
+ MUSCLE_INSERT_INT (key, !!sym->type_name);
+
SET_KEY("type_name");
MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");
--
1.6.0.2.588.g3102
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] More information about the symbols.,
Akim Demaille <=