diff --git a/TODO b/TODO index f314682a..e417fdb3 100644 --- a/TODO +++ b/TODO @@ -53,6 +53,22 @@ would actually also make the following point gracefully handled (status of YYERRCODE, YYUNDEFTOK, etc.). Possibly we could also define YYEMPTY (twice: as a token and as a symbol). And YYEOF. +It seems to work well. Yet we have a weird case: the "error" token: + +enum yysymbol_type_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, + YYSYMBOL_error = 1, + YYSYMBOL_YYUNDEF = 2, + YYSYMBOL_YYACCEPT = 61, + ... + +YYSYMBOL_error looks weird. We should maybe rename this as +"YYSYMBOL_YYERROR", even though it should not be confonded with the YYERROR +macro. + + ** Consistency YYUNDEFTOK is an internal symbol number, as YYTERROR. But YYERRCODE is an external token number. diff --git a/data/skeletons/bison.m4 b/data/skeletons/bison.m4 index ab4fb720..20de1b7e 100644 --- a/data/skeletons/bison.m4 +++ b/data/skeletons/bison.m4 @@ -411,6 +411,7 @@ m4_define([_b4_symbol], # if that would produce an invalid symbol. m4_define([b4_symbol_sid], [m4_case([$1], + [-2], [[YYSYMBOL_YYEMPTY]], [0], [[YYSYMBOL_YYEOF]], [m4_bmatch(m4_quote(b4_symbol([$1], [tag])), [^\$accept$], [[YYSYMBOL_YYACCEPT]], diff --git a/data/skeletons/c.m4 b/data/skeletons/c.m4 index 721c66ea..d0aade36 100644 --- a/data/skeletons/c.m4 +++ b/data/skeletons/c.m4 @@ -504,12 +504,15 @@ m4_define([b4_symbol_enum], # b4_declare_symbol_enum # ---------------------- # The definition of the symbol internal numbers as an enum. +# Defining YYEMPTY here is important: it forces the compiler +# to use a signed type, which matters for yytoken. m4_define([b4_declare_symbol_enum], [[/* Symbol type. */ enum yysymbol_type_t { ]m4_join([, ], + ]b4_symbol_sid([-2])[ = -2, b4_symbol_map([b4_symbol_enum]))[ }; typedef enum yysymbol_type_t yysymbol_type_t; diff --git a/data/skeletons/yacc.c b/data/skeletons/yacc.c index 348c1634..5c5a3964 100644 --- a/data/skeletons/yacc.c +++ b/data/skeletons/yacc.c @@ -1348,7 +1348,7 @@ yysyntax_error_arguments (const yyparse_context_t *yyctx, one exception: it will still contain any token that will not be accepted due to an error action in a later state.]])[ */ - if (yyctx->yytoken != YYEMPTY) + if (yyctx->yytoken != YYSYMBOL_YYEMPTY) { int yyn;]b4_lac_if([[ YYDPRINTF ((stderr, "Constructing syntax error message\n"));]])[ @@ -1576,7 +1576,7 @@ yyparse (]m4_ifset([b4_parse_param], [b4_formals(b4_parse_param)], [void])[)]])[ /* The return value of yyparse. */ int yyresult; /* Lookahead token as an internal (translated) token number. */ - yysymbol_type_t yytoken = 0; + yysymbol_type_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval;]b4_locations_if([[ @@ -1889,7 +1889,7 @@ yyreduce: yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ - yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) diff --git a/src/parse-gram.y b/src/parse-gram.y index 40f8a0c4..0523348e 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -808,7 +808,7 @@ yyreport_syntax_error (const yyparse_context_t *ctx) const char *argv[ARGS_MAX]; int argc = 0; yysymbol_type_t unexpected = yyparse_context_token (ctx); - if (unexpected != YYEMPTY) + if (unexpected != YYSYMBOL_YYEMPTY) { argv[argc++] = yysymbol_name (unexpected); yysymbol_type_t expected[ARGS_MAX - 1]; diff --git a/tests/regression.at b/tests/regression.at index cd79b507..fa059248 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -665,7 +665,7 @@ AT_BISON_CHECK([-v -o input.c input.y]) [sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c] AT_CHECK([[cat tables.c]], 0, -[[static const yytype_int8 yytranslate[] = +[[static const yysymbol_type_t yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,