From 5d73144067d7b53112cbfd1bd5995f1b5063ef50 Mon Sep 17 00:00:00 2001 From: Akim Demaille <demaille@gostai.com> Date: Sat, 16 Aug 2008 20:32:37 +0200 Subject: [PATCH] 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. --- ChangeLog | 10 ++++++++++ data/lalr1.cc | 15 ++++++++++++++- src/output.c | 36 ++++++++++++++++-------------------- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 380aa416..df7bde07 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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> Regen. diff --git a/data/lalr1.cc b/data/lalr1.cc index 24b011bb..40cdde23 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_], [$@])[]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 5950b4f7..a7003edf 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 : ""); -- 2.47.2