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.
This commit is contained in:
Akim Demaille
2008-08-16 20:32:37 +02:00
parent 21db118b64
commit 5d73144067
3 changed files with 40 additions and 21 deletions

View File

@@ -1,3 +1,13 @@
2008-11-10 Akim Demaille <demaille@gostai.com>
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 <demaille@gostai.com> 2008-11-10 Akim Demaille <demaille@gostai.com>
Regen. Regen.

View File

@@ -113,6 +113,17 @@ m4_define([b4_symbol],
[m4_indir([b4_symbol($1, $2)])]) [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, # b4_symbol_actions(FILENAME, LINENO,
# SYMBOL-TAG, SYMBOL-NUM, # SYMBOL-TAG, SYMBOL-NUM,
# SYMBOL-ACTION, SYMBOL-TYPENAME) # SYMBOL-ACTION, SYMBOL-TYPENAME)
@@ -143,14 +154,16 @@ m4_define([b4_symbol_case_],
# b4_type_action_(NUMS) # b4_type_action_(NUMS)
# --------------------- # ---------------------
# Run actions for the symbol NUMS that all have the same type-name. # 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_], m4_define([b4_type_action_],
[b4_symbol_if([$1], [has_type_name],
[m4_map([b4_symbol_case_], [$@])[]dnl [m4_map([b4_symbol_case_], [$@])[]dnl
b4_dollar_dollar([b4_symbol([$1], [number])], b4_dollar_dollar([b4_symbol([$1], [number])],
[b4_symbol([$1], [tag])], [b4_symbol([$1], [tag])],
[b4_symbol([$1], [type_name])]); [b4_symbol([$1], [type_name])]);
break; break;
]) ])])
# b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS]) # b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS])

View File

@@ -320,28 +320,17 @@ static void
type_names_output (FILE *out) type_names_output (FILE *out)
{ {
int i; int i;
const char *isep = "";
symbol **syms = symbols_by_type_name (); symbol **syms = symbols_by_type_name ();
fputs ("m4_define([b4_type_names],\n[", out); fputs ("m4_define([b4_type_names],\n[", out);
for (i = 0; i < nsyms; ) for (i = 0; i < nsyms; /* nothing */)
if (syms[i]->type_name) {
{ // The index of the first symbol of the current type-name.
int j; int i0 = i;
const char *jsep = ""; fputs (i ? ",\n[" : "[", out);
fprintf (out, "%s[", isep); for (; i < nsyms && syms[i]->type_name == syms[i0]->type_name; ++i)
isep = ",\n"; fprintf (out, "%s%d", i != i0 ? ", " : "", syms[i]->number);
for (j = i; j < nsyms; ++j) fputs ("]", out);
{ }
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;
fputs ("])\n\n", out); fputs ("])\n\n", out);
free (syms); free (syms);
} }
@@ -431,9 +420,16 @@ symbol_definitions_output (FILE *out)
SET_KEY("user_number"); SET_KEY("user_number");
MUSCLE_INSERT_INT (key, sym->user_token_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"); SET_KEY("number");
MUSCLE_INSERT_INT (key, sym->number); MUSCLE_INSERT_INT (key, sym->number);
SET_KEY("has_type_name");
MUSCLE_INSERT_INT (key, !!sym->type_name);
SET_KEY("type_name"); SET_KEY("type_name");
MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : ""); MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");