From 90462b8dd909d36e8c0b7d672238e9e385a3ba8d Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 20 Apr 2009 23:38:07 +0200 Subject: [PATCH] bison: factoring. * src/output.c (token_definitions_output): Use symbol_id_get instead of duplicating its logic. * TODO (YYERRCODE): Extend. --- ChangeLog | 7 +++++++ TODO | 16 ++++++++++++++++ src/output.c | 33 ++++++++------------------------- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index a90249b4..04cff9e7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-04-20 Akim Demaille + + bison: factoring. + * src/output.c (token_definitions_output): Use symbol_id_get + instead of duplicating its logic. + * TODO (YYERRCODE): Extend. + 2009-04-20 Akim Demaille variables: prefer error-verbose to error_verbose. diff --git a/TODO b/TODO index 4bcb3a65..376ec1d7 100644 --- a/TODO +++ b/TODO @@ -54,6 +54,22 @@ number for the error token, which POSIX wants to be 256, but which Bison might renumber if the user used number 256. Keep fix and doc? Throw away? +Also, why don't we output the token name of the error token in the +output? It is explicitly skipped: + + /* Skip error token and tokens without identifier. */ + if (sym != errtoken && id) + +Of course there are issues with name spaces, but if we disable we have +something which seems to be more simpler and more consistent instead +of the special case YYERRCODE. + + enum yytokentype { + error = 256, + // ... + }; + + We could (should?) also treat the case of the undef_token, which is numbered 257 for yylex, and 2 internal. Both appear for instance in toknum: diff --git a/src/output.c b/src/output.c index 0a08fc45..c5e9aab9 100644 --- a/src/output.c +++ b/src/output.c @@ -469,37 +469,20 @@ token_definitions_output (FILE *out) { symbol *sym = symbols[i]; int number = sym->user_token_number; + uniqstr id = symbol_id_get (sym); /* At this stage, if there are literal aliases, they are part of SYMBOLS, so we should not find symbols which are the aliases here. */ aver (number != USER_NUMBER_ALIAS); - /* Skip error token. */ - if (sym == errtoken) - continue; - - /* If this string has an alias, then it is necessarily the alias - which is to be output. */ - if (sym->alias) - sym = sym->alias; - - /* Don't output literal chars or strings (when defined only as a - string). Note that must be done after the alias resolution: - think about `%token 'f' "f"'. */ - if (sym->tag[0] == '\'' || sym->tag[0] == '\"') - continue; - - /* Don't #define nonliteral tokens whose names contain periods, - dashes or '$' (as does the default value of the EOF token). */ - if (strchr (sym->tag, '.') - || strchr (sym->tag, '-') - || strchr (sym->tag, '$')) - continue; - - fprintf (out, "%s[[[%s]], %d]", - sep, sym->tag, number); - sep = ",\n"; + /* Skip error token and tokens without identifier. */ + if (sym != errtoken && id) + { + fprintf (out, "%s[[[%s]], %d]", + sep, id, number); + sep = ",\n"; + } } fputs ("])\n\n", out); } -- 2.45.2