X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/df72984aa586c427c5f2acb2c8aade92c291a419..2bde91138d696cd5b05eeea61ebf709695ca695e:/TODO?ds=inline diff --git a/TODO b/TODO index ae0ddb66..a9ec3083 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,169 @@ -*- outline -*- +* Short term +** Use b4_symbol in all the skeleton +Then remove the older system, including the tables generated by +output.c + +** Update the documentation on gnu.org + +** Get rid of fake #lines [Bison: ...] +Possibly as simple as checking whether the column number is nonnegative. + +I have seen messages like the following from GCC. + +:0: fatal error: opening dependency file .deps/libltdl/argz.Tpo: No such file or directory + + +** Document %define assert + +** Discuss about %printer/%destroy in the case of C++. +It would be very nice to provide the symbol classes with an operator<< +and a destructor. Unfortunately the syntax we have chosen for +%destroy and %printer make them hard to reuse. For instance, the user +is invited to write something like + + %printer { debug_stream() << $$; } ; + +which is hard to reuse elsewhere since it wants to use +"debug_stream()" to find the stream to use. The same applies to +%destroy: we told the user she could use the members of the Parser +class in the printers/destructors, which is not good for an operator<< +since it is no longer bound to a particular parser, it's just a +(standalone symbol). + +** Rename LR0.cc +as lr0.cc, why upper case? + +** bench several bisons. +Enhance bench.pl with %b to run different bisons. + +** Use b4_symbol everywhere. +Move its definition in the more standard places and deploy it in other +skeletons. + +* Various +** YYPRINT +glr.c inherits its symbol_print function from c.m4, which supports +YYPRINT. But to use YYPRINT yytoknum is needed, which not defined by +glr.c. + +Anyway, IMHO YYPRINT is obsolete and should be restricted to yacc.c. + +** YYERRCODE +Defined to 256, but not used, not documented. Probably the token +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? + +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: + + const unsigned short int + parser::yytoken_number_[] = + { + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + +while here + + enum yytokentype { + TOK_EOF = 0, + TOK_EQ = 258, + +so both 256 and 257 are "mysterious". + + const char* + const parser::yytname_[] = + { + "\"end of command\"", "error", "$undefined", "\"=\"", "\"break\"", + + +** YYFAIL +It is seems to be *really* obsolete now, shall we remove it? + +** YYBACKUP +There is no test about it, no examples in the doc, and I'm not sure +what it should look like. For instance what follows crashes. + + %error-verbose + %debug + %pure-parser + %code { + # include + # include + # include + + static void yyerror (const char *msg); + static int yylex (YYSTYPE *yylval); + } + %% + exp: + 'a' { printf ("a: %d\n", $1); } + | 'b' { YYBACKUP('a', 123); } + ; + %% + static int + yylex (YYSTYPE *yylval) + { + static char const input[] = "b"; + static size_t toknum; + assert (toknum < sizeof input); + *yylval = (toknum + 1) * 10; + return input[toknum++]; + } + + static void + yyerror (const char *msg) + { + fprintf (stderr, "%s\n", msg); + } + + int + main (void) + { + yydebug = !!getenv("YYDEBUG"); + return yyparse (); + } + +** yychar == yyempty_ +The code in yyerrlab reads: + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + +There are only two yychar that can be <= YYEOF: YYEMPTY and YYEOF. +But I can't produce the situation where yychar is YYEMPTY here, is it +really possible? The test suite does not exercise this case. + +This shows that it would be interesting to manage to install skeleton +coverage analysis to the test suite. + +** Table definitions +It should be very easy to factor the definition of the various tables, +including the separation bw declaration and definition. See for +instance b4_table_define in lalr1.cc. This way, we could even factor +C vs. C++ definitions. + +* From lalr1.cc to yacc.c +** Single stack +Merging the three stacks in lalr1.cc simplified the code, prompted for +other improvements and also made it faster (probably because memory +management is performed once instead of three times). I suggest that +we do the same in yacc.c. + +** yysyntax_error +In lalr1.cc we invoke it with the translated lookahead (yytoken), and +yacc.c uses yychar. I don't see why. + +** yysyntax_error +The use of switch to select yyfmt in lalr1.cc seems simpler than +what's done in yacc.c. + * Header guards From Franc,ois: should we keep the directory part in the CPP guard? @@ -18,10 +182,6 @@ find something clean (not like YYLSP_NEEDED...). Before releasing, make sure the documentation ("Understanding your parser") refers to the current `output' format. -* lalr1.cc -** I18n -Catch up with yacc.c. - * Report ** GLR @@ -96,9 +256,6 @@ must be in the scanner: we must not parse what is in a switched off part of %if. Akim Demaille thinks it should be in the parser, so as to avoid falling into another CPP mistake. -** -D, --define-muscle NAME=VALUE -To define muscles via cli. Or maybe support directly NAME=VALUE? - ** XML Output There are couple of available extensions of Bison targeting some XML output. Some day we should consider including them. One issue is @@ -199,15 +356,6 @@ It is unfortunate that there is a total order for precedence. It makes it impossible to have modular precedence information. We should move to partial orders (sounds like series/parallel orders to me). -** Correlation b/w precedence and associativity -Also, I fail to understand why we have to assign the same -associativity to operators with the same precedence. For instance, -why can't I decide that the precedence of * and / is the same, but the -latter is nonassoc? - -If there is really no profound motivation, we should find a new syntax -to allow specifying this. - ** RR conflicts See if we can use precedence between rules to solve RR conflicts. See what POSIX says.