bison: factoring.

* src/output.c (token_definitions_output): Use symbol_id_get
	instead of duplicating its logic.
	* TODO (YYERRCODE): Extend.
This commit is contained in:
Akim Demaille
2009-04-20 23:38:07 +02:00
parent 71b00ed874
commit 90462b8dd9
3 changed files with 31 additions and 25 deletions

View File

@@ -1,3 +1,10 @@
2009-04-20 Akim Demaille <demaille@gostai.com>
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 <demaille@gostai.com>
variables: prefer error-verbose to error_verbose.

16
TODO
View File

@@ -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:

View File

@@ -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);
}