| * Soon | |
| ** yyerror_range in GLR | |
| It seems useless that it is based on glr_stack_item, it should be doable | |
| with location only. | |
| ** scan-code | |
| The default case is scanning char-per-char. | |
| /* By default, grow the string obstack with the input. */ | |
| .|\n STRING_GROW (); | |
| make it more eager? | |
| ** Missing tests | |
| commit 2c294c132528ede23d8ae4959783a67e9ff05ac5 | |
| Author: Vincent Imbimbo <vmi6@cornell.edu> | |
| Date: Sat Jan 23 13:25:18 2021 -0500 | |
| cex: fix state-item pruning | |
| See https://lists.gnu.org/r/bug-bison/2021-01/msg00002.html | |
| ** pos_set_set | |
| The current approach is correct, but with poor performances. Bitsets need | |
| to support 'assign' and 'shift'. And instead of extending POS_SET just for | |
| the out-of-range new values, we need something like doubling the size. | |
| ** glr | |
| There is no test with "Parse on stack %ld rejected by rule %d" in it. | |
| ** yyrline etc. | |
| Clarify that rule numbers in the skeletons are 1-based. | |
| ** Macros in C++ | |
| There are many macros that should obey api.prefix: YY_CPLUSPLUS, YY_MOVE, | |
| etc. | |
| ** yyerrok in Java | |
| And add tests in calc.at, to prepare work for D. | |
| ** YYERROR and yynerrs | |
| We are missing some cases. Write a test case, and check all the skeletons. | |
| ** Cex | |
| *** Improve gnulib | |
| Don't do this (counterexample.c): | |
| // This is the fastest way to get the tail node from the gl_list API. | |
| gl_list_node_t | |
| list_get_end (gl_list_t list) | |
| { | |
| gl_list_node_t sentinel = gl_list_add_last (list, NULL); | |
| gl_list_node_t res = gl_list_previous_node (list, sentinel); | |
| gl_list_remove_node (list, sentinel); | |
| return res; | |
| } | |
| *** Ambiguous rewriting | |
| If the user is stupid enough to have equal rules, then the derivations are | |
| harder to read: | |
| Reduce/reduce conflict on tokens $end, "+", "⊕": | |
| 2 exp: exp "+" exp . | |
| 3 exp: exp "+" exp . | |
| Example exp "+" exp • | |
| First derivation exp ::=[ exp "+" exp • ] | |
| Example exp "+" exp • | |
| Second derivation exp ::=[ exp "+" exp • ] | |
| Do we care about this? In color, we use twice the same color here, but we | |
| could try to use the same color for the same rule. | |
| *** XML reports | |
| Show the counterexamples. This is going to be really hard and/or painful. | |
| Unless we play it dumb (little structure). | |
| ** Bistromathic | |
| - How about not evaluating incomplete lines when the text is not finished | |
| (as shells do). | |
| ** Questions | |
| *** Java | |
| - Should i18n be part of the Lexer? Currently it's a static method of | |
| Lexer. | |
| - is there a migration path that would allow to use TokenKinds in | |
| yylex? | |
| - define the tokens as an enum too. | |
| - promote YYEOF rather than EOF. | |
| ** YYerror | |
| https://git.savannah.gnu.org/gitweb/?p=gettext.git;a=blob;f=gettext-runtime/intl/plural.y;h=a712255af4f2f739c93336d4ff6556d932a426a5;hb=HEAD | |
| should be updated to not use YYERRCODE. Returning an undef token is good | |
| enough. | |
| ** Java | |
| *** calc.at | |
| Stop hard-coding "Calc". Adjust local.at (look for FIXME). | |
| ** doc | |
| I feel it's ugly to use the GNU style to declare functions in the doc. It | |
| generates tons of white space in the page, and may contribute to bad page | |
| breaks. | |
| ** consistency | |
| token vs terminal. | |
| ** api.token.raw | |
| The YYUNDEFTOK could be assigned a semantic value so that yyerror could be | |
| used to report invalid lexemes. | |
| ** push parsers | |
| Consider deprecating impure push parsers. They add a lot of complexity, for | |
| a bad feature. On the other hand, that would make it much harder to sit | |
| push parsers on top of pull parser. Which is currently not relevant, since | |
| push parsers are measurably slower. | |
| ** %define parse.error formatted | |
| How about pushing Bistromathic's yyreport_syntax_error as another standard | |
| way to generate the error message, and leave to the user the task of | |
| providing the message formats? Currently in bistro, it reads: | |
| const char * | |
| error_format_string (int argc) | |
| { | |
| switch (argc) | |
| { | |
| default: /* Avoid compiler warnings. */ | |
| case 0: return _("%@: syntax error"); | |
| case 1: return _("%@: syntax error: unexpected %u"); | |
| // TRANSLATORS: '%@' is a location in a file, '%u' is an | |
| // "unexpected token", and '%0e', '%1e'... are expected tokens | |
| // at this point. | |
| // | |
| // For instance on the expression "1 + * 2", you'd get | |
| // | |
| // 1.5: syntax error: expected - or ( or number or function or variable before * | |
| case 2: return _("%@: syntax error: expected %0e before %u"); | |
| case 3: return _("%@: syntax error: expected %0e or %1e before %u"); | |
| case 4: return _("%@: syntax error: expected %0e or %1e or %2e before %u"); | |
| case 5: return _("%@: syntax error: expected %0e or %1e or %2e or %3e before %u"); | |
| case 6: return _("%@: syntax error: expected %0e or %1e or %2e or %3e or %4e before %u"); | |
| case 7: return _("%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e before %u"); | |
| case 8: return _("%@: syntax error: expected %0e or %1e or %2e or %3e or %4e or %5e or %6e before %u"); | |
| } | |
| } | |
| The message would have to be generated in a string, and pushed to yyerror. | |
| Which will be a pain in the neck in yacc.c. | |
| If we want to do that, we should think very carefully about the syntax of | |
| the format string. | |
| ** yyclearin does not invoke the lookahead token's %destructor | |
| https://lists.gnu.org/r/bug-bison/2018-02/msg00000.html | |
| Rici: | |
| > Modifying yyclearin so that it calls yydestruct seems like the simplest | |
| > solution to this issue, but it is conceivable that such a change would | |
| > break programs which already perform some kind of workaround in order to | |
| > destruct the lookahead symbol. So it might be necessary to use some kind of | |
| > compatibility %define, or to create a new replacement macro with a | |
| > different name such as yydiscardin. | |
| > | |
| > At a minimum, the fact that yyclearin does not invoke the %destructor | |
| > should be highlighted in the documentation, since it is not at all obvious. | |
| ** Issues in i18n | |
| Les catégories d'avertissements incluent : | |
| conflicts-sr conflits S/R (activé par défaut) | |
| conflicts-rr conflits R/R (activé par défaut) | |
| dangling-alias l'alias chaîne n'est pas attaché à un symbole | |
| deprecated construction obsolète | |
| empty-rule règle vide sans %empty | |
| midrule-values valeurs de règle intermédiaire non définies ou inutilisées | |
| precedence priorité et associativité inutiles | |
| yacc incompatibilités avec POSIX Yacc | |
| other tous les autres avertissements (activé par défaut) | |
| all tous les avertissements sauf « dangling-alias » et « yacc » | |
| no-CATEGORY désactiver les avertissements dans CATEGORIE | |
| none désactiver tous les avertissements | |
| error[=CATEGORY] traiter les avertissements comme des erreurs | |
| Line -1 and -3 should mention CATEGORIE, not CATEGORY. | |
| * Bison 3.9 | |
| ** Rewrite glr.cc (currently glr2.cc) | |
| *** custom error messages | |
| *** Remove jumps | |
| We can probably replace setjmp/longjmp with exceptions. That would help | |
| tremendously other languages such as D and Java that probably have no | |
| similar feature. If we remove jumps, we probably no longer need _Noreturn, | |
| so simplify `b4_attribute_define([noreturn])` into `b4_attribute_define`. | |
| After discussing with Valentin, it was decided that it's better to stay with | |
| jumps, since in some places exceptions are ruled out from C++. | |
| *** Coding style | |
| Move to our coding conventions. In particular names such as yy_glr_stack, | |
| not yyGLRStack. | |
| *** yydebug | |
| It should be a member of the parser object, see lalr1.cc. Let the parser | |
| object decide what the debug stream is, rather than open coding std::cerr. | |
| *** Avoid pointers | |
| There are many places where pointers should be replaced with references. | |
| Some occurrences were fixed, but now some have improper names: | |
| -yygetToken (int *yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser][]b4_pure_if([, glr_stack* yystackp])[]b4_user_formals[) | |
| +yygetToken (int& yycharp, ]b4_namespace_ref[::]b4_parser_class[& yyparser][]b4_pure_if([, glr_stack* yystackp])[]b4_user_formals[) | |
| yycharp is no longer a Pointer. And yystackp should probably also be a reference. | |
| *** parse.assert | |
| Currently all the assertions are enabled. Once we are confident in glr2.cc, | |
| let parse.assert use the same approach as in lalr1.cc. | |
| *** debug_stream | |
| Stop using std::cerr everywhere. | |
| *** glr.c | |
| When glr2.cc fully replaces glr.cc, get rid of the glr.cc scaffolding in | |
| glr.c. | |
| * Chains | |
| ** Unit rules / Injection rules (Akim Demaille) | |
| Maybe we could expand unit rules (or "injections", see | |
| https://homepages.cwi.nl/~daybuild/daily-books/syntax/2-sdf/sdf.html), i.e., | |
| transform | |
| exp: arith | bool; | |
| arith: exp '+' exp; | |
| bool: exp '&' exp; | |
| into | |
| exp: exp '+' exp | exp '&' exp; | |
| when there are no actions. This can significantly speed up some grammars. | |
| I can't find the papers. In particular the book 'LR parsing: Theory and | |
| Practice' is impossible to find, but according to 'Parsing Techniques: a | |
| Practical Guide', it includes information about this issue. Does anybody | |
| have it? | |
| ** clean up (Akim Demaille) | |
| Do not work on these items now, as I (Akim) have branches with a lot of | |
| changes in this area (hitting several files), and no desire to have to fix | |
| conflicts. Addressing these items will happen after my branches have been | |
| merged. | |
| *** lalr.c | |
| Introduce a goto struct, and use it in place of from_state/to_state. | |
| Rename states1 as path, length as pathlen. | |
| Introduce inline functions for things such as nullable[*rp - ntokens] | |
| where we need to map from symbol number to nterm number. | |
| There are probably a significant part of the relations management that | |
| should be migrated on top of a bitsetv. | |
| *** closure | |
| It should probably take a "state*" instead of two arguments. | |
| *** traces | |
| The "automaton" and "set" categories are not so useful. We should probably | |
| introduce lr(0) and lalr, just the way we have ielr categories. The | |
| "closure" function is too verbose, it should probably have its own category. | |
| "set" can still be used for summarizing the important sets. That would make | |
| tests easy to maintain. | |
| *** complain.* | |
| Rename these guys as "diagnostics.*" (or "diagnose.*"), since that's the | |
| name they have in GCC, clang, etc. Likewise for the complain_* series of | |
| functions. | |
| *** ritem | |
| states/nstates, rules/nrules, ..., ritem/nritems | |
| Fix the latter. | |
| *** m4: slot, type, type_tag | |
| The meaning of type_tag varies depending on api.value.type. We should avoid | |
| that and using clear definitions with stable semantics. | |
| * D programming language | |
| There's a number of features that are missing, here sorted in _suggested_ | |
| order of implementation. | |
| When copying code from other skeletons, keep the comments exactly as they | |
| are. Keep the same variable names. If you change the wording in one place, | |
| do it in the others too. In other words: make sure to keep the | |
| maintenance *simple* by avoiding any gratuitous difference. | |
| ** CI | |
| Check when gdc and ldc. | |
| ** GLR Parser | |
| This is very ambitious. That's the final boss. There are currently no | |
| "clean" implementation to get inspiration from. | |
| glr.c is very clean but: | |
| - is low-level C | |
| - is a different skeleton from yacc.c | |
| glr.cc is (currently) an ugly hack: a C++ shell around glr.c. Valentin | |
| Tolmer is currently rewriting glr.cc to be clean C++, but he is not | |
| finished. There will be a lot a common code between lalr1.cc and glr.cc, so | |
| eventually I would like them to be fused into a single skeleton, supporting | |
| both deterministic and generalized parsing. | |
| It would be great for D to also support this. | |
| The basic ideas of GLR are explained here: | |
| https://www.codeproject.com/Articles/5259825/GLR-Parsing-in-Csharp-How-to-Use-The-Most-Powerful | |
| * Better error messages | |
| The users are not provided with enough tools to forge their error messages. | |
| See for instance "Is there an option to change the message produced by | |
| YYERROR_VERBOSE?" by Simon Sobisch, on bison-help. | |
| See also | |
| https://www.cs.tufts.edu/~nr/cs257/archive/clinton-jefferey/lr-error-messages.pdf | |
| https://research.swtch.com/yyerror | |
| http://gallium.inria.fr/~fpottier/publis/fpottier-reachability-cc2016.pdf | |
| * Modernization | |
| Fix data/skeletons/yacc.c so that it defines YYPTRDIFF_T properly for modern | |
| and older C++ compilers. Currently the code defaults to defining it to | |
| 'long' for non-GCC compilers, but it should use the proper C++ magic to | |
| define it to the same type as the C ptrdiff_t type. | |
| * Completion | |
| Several features are not available in all the back-ends. | |
| - push parsers: glr.c, glr.cc, lalr1.cc (not very difficult) | |
| - token constructors: Java, C, D (a bit difficult) | |
| - glr: D, Java (super difficult) | |
| * Bugs | |
| ** Autotest has quotation issues | |
| tests/input.at:1730:AT_SETUP([%define errors]) | |
| -> | |
| $ ./tests/testsuite -l | grep errors | sed q | |
| 38: input.at:1730 errors | |
| * Short term | |
| ** Better design for diagnostics | |
| The current implementation of diagnostics is ad hoc, it grew organically. | |
| It works as a series of calls to several functions, with dependency of the | |
| latter calls on the former. For instance: | |
| complain (&sym->location, | |
| sym->content->status == needed ? complaint : Wother, | |
| _("symbol %s is used, but is not defined as a token" | |
| " and has no rules; did you mean %s?"), | |
| quote_n (0, sym->tag), | |
| quote_n (1, best->tag)); | |
| if (feature_flag & feature_caret) | |
| location_caret_suggestion (sym->location, best->tag, stderr); | |
| We should rewrite this in a more FP way: | |
| 1. build a rich structure that denotes the (complete) diagnostic. | |
| "Complete" in the sense that it also contains the suggestions, the list | |
| of possible matches, etc. | |
| 2. send this to the pretty-printing routine. The diagnostic structure | |
| should be sufficient so that we can generate all the 'format' of | |
| diagnostics, including the fixits. | |
| If properly done, this diagnostic module can be detached from Bison and be | |
| put in gnulib. It could be used, for instance, for errors caught by | |
| xgettext. | |
| There's certainly already something alike in GCC. At least that's the | |
| impression I get from reading the "-fdiagnostics-format=FORMAT" part of this | |
| page: | |
| https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Message-Formatting-Options.html | |
| ** Graphviz display code thoughts | |
| The code for the --graph option is over two files: print_graph, and | |
| graphviz. This is because Bison used to also produce VCG graphs, but since | |
| this is no longer true, maybe we could consider these files for fusion. | |
| An other consideration worth noting is that print_graph.c (correct me if I | |
| am wrong) should contain generic functions, whereas graphviz.c and other | |
| potential files should contain just the specific code for that output | |
| format. It will probably prove difficult to tell if the implementation is | |
| actually generic whilst only having support for a single format, but it | |
| would be nice to keep stuff a bit tidier: right now, the construction of the | |
| bitset used to show reductions is in the graphviz-specific code, and on the | |
| opposite side we have some use of \l, which is graphviz-specific, in what | |
| should be generic code. | |
| Little effort seems to have been given to factoring these files and their | |
| print{,-xml} counterpart. We would very much like to re-use the pretty format | |
| of states from .output for the graphs, etc. | |
| Since graphviz dies on medium-to-big grammars, maybe consider an other tool? | |
| ** push-parser | |
| Check it too when checking the different kinds of parsers. And be | |
| sure to check that the initial-action is performed once per parsing. | |
| ** m4 names | |
| b4_shared_declarations is no longer what it is. Make it | |
| b4_parser_declaration for instance. | |
| ** yychar in lalr1.cc | |
| There is a large difference bw maint and master on the handling of | |
| yychar (which was removed in lalr1.cc). See what needs to be | |
| back-ported. | |
| /* User semantic actions sometimes alter yychar, and that requires | |
| that yytoken be updated with the new translation. We take the | |
| approach of translating immediately before every use of yytoken. | |
| One alternative is translating here after every semantic action, | |
| but that translation would be missed if the semantic action | |
| invokes YYABORT, YYACCEPT, or YYERROR immediately after altering | |
| yychar. In the case of YYABORT or YYACCEPT, an incorrect | |
| destructor might then be invoked immediately. In the case of | |
| YYERROR, subsequent parser actions might lead to an incorrect | |
| destructor call or verbose syntax error message before the | |
| lookahead is translated. */ | |
| /* Make sure we have latest lookahead translation. See comments at | |
| user semantic actions for why this is necessary. */ | |
| yytoken = yytranslate_ (yychar); | |
| ** 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. | |
| <built-in>:0: fatal error: opening dependency file .deps/libltdl/argz.Tpo: No such file or directory | |
| ** 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() << $$; } <my_type>; | |
| 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). | |
| * Various | |
| ** Rewrite glr.cc in C++ (Valentin Tolmer) | |
| As a matter of fact, it would be very interesting to see how much we can | |
| share between lalr1.cc and glr.cc. Most of the skeletons should be common. | |
| It would be a very nice source of inspiration for the other languages. | |
| Valentin Tolmer is working on this. | |
| * 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. | |
| (Some time later): it's also very nice to have three stacks: it's more dense | |
| as we don't lose bits to padding. For instance the typical stack for states | |
| will use 8 bits, while it is likely to consume 32 bits in a struct. | |
| We need trustworthy benchmarks for Bison, for all our backends. Akim has a | |
| few things scattered around; we need to put them in the repo, and make them | |
| more useful. | |
| * Report | |
| ** Figures | |
| Some statistics about the grammar and the parser would be useful, | |
| especially when asking the user to send some information about the | |
| grammars she is working on. We should probably also include some | |
| information about the variables (I'm not sure for instance we even | |
| specify what LR variant was used). | |
| ** GLR | |
| How would Paul like to display the conflicted actions? In particular, | |
| what when two reductions are possible on a given lookahead token, but one is | |
| part of $default. Should we make the two reductions explicit, or just | |
| keep $default? See the following point. | |
| ** Disabled Reductions | |
| See 'tests/conflicts.at (Defaulted Conflicted Reduction)', and decide | |
| what we want to do. | |
| ** Documentation | |
| Extend with error productions. The hard part will probably be finding | |
| the right rule so that a single state does not exhibit too many yet | |
| undocumented ''features''. Maybe an empty action ought to be | |
| presented too. Shall we try to make a single grammar with all these | |
| features, or should we have several very small grammars? | |
| * Extensions | |
| ** More languages? | |
| Well, only if there is really some demand for it. | |
| *** PHP | |
| https://github.com/scfc/bison-php/blob/master/data/lalr1.php | |
| *** Python | |
| https://lists.gnu.org/r/bison-patches/2013-09/msg00000.html and following | |
| ** Multiple start symbols | |
| Revert a70e75b8a41755ab96ab211a0ea111ac68a4aadd. | |
| Revert tests: disable "Multistart reports". | |
| Would be very useful when parsing closely related languages. The idea is to | |
| declare several start symbols, for instance | |
| %start stmt expr | |
| %% | |
| stmt: ... | |
| expr: ... | |
| and to generate parse(), parse_stmt() and parse_expr(). Technically, the | |
| above grammar would be transformed into | |
| %start yy_start | |
| %token YY_START_STMT YY_START_EXPR | |
| %% | |
| yy_start: YY_START_STMT stmt | YY_START_EXPR expr | |
| so that there are no new conflicts in the grammar (as would undoubtedly | |
| happen with yy_start: stmt | expr). Then adjust the skeletons so that this | |
| initial token (YY_START_STMT, YY_START_EXPR) be shifted first in the | |
| corresponding parse function. | |
| *** Number of useless symbols | |
| AT_TEST( | |
| [[%start exp; | |
| exp: exp;]], | |
| [[input.y: warning: 2 nonterminals useless in grammar [-Wother] | |
| input.y: warning: 2 rules useless in grammar [-Wother] | |
| input.y:2.8-10: error: start symbol exp does not derive any sentence]]) | |
| We should say "1 nonterminal": the other one is $accept, which should not | |
| participate in the count. | |
| *** Tokens | |
| Do we want to disallow terminal start symbols? The limitation is not | |
| technical. Can it be useful to someone to "parse" a token? | |
| ** %include | |
| This is a popular demand. We already made many changes in the parser that | |
| should make this reasonably easy to implement. | |
| Bruce Mardle <marblypup@yahoo.co.uk> | |
| https://lists.gnu.org/r/bison-patches/2015-09/msg00000.html | |
| However, there are many other things to do before having such a feature, | |
| because I don't want a % equivalent to #include (which we all learned to | |
| hate). I want something that builds "modules" of grammars, and assembles | |
| them together, paying attention to keep separate bits separated, in pseudo | |
| name spaces. | |
| ** Push parsers | |
| There is demand for push parsers in C++. | |
| ** Generate code instead of tables | |
| This is certainly quite a lot of work. See | |
| https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.4539. | |
| ** $-1 | |
| We should find a means to provide an access to values deep in the | |
| stack. For instance, instead of | |
| baz: qux { $$ = $<foo>-1 + $<bar>0 + $1; } | |
| we should be able to have: | |
| foo($foo) bar($bar) baz($bar): qux($qux) { $baz = $foo + $bar + $qux; } | |
| Or something like this. | |
| ** %if and the like | |
| It should be possible to have %if/%else/%endif. The implementation is | |
| not clear: should it be lexical or syntactic. Vadim Maslow thinks it | |
| 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. | |
| (Later): I'm sure there's actually good case for this. People who need that | |
| feature can use m4/cpp on top of Bison. I don't think it is worth the | |
| trouble in Bison itself. | |
| ** XML Output | |
| There are couple of available extensions of Bison targeting some XML | |
| output. Some day we should consider including them. One issue is | |
| that they seem to be quite orthogonal to the parsing technique, and | |
| seem to depend mostly on the possibility to have some code triggered | |
| for each reduction. As a matter of fact, such hooks could also be | |
| used to generate the yydebug traces. Some generic scheme probably | |
| exists in there. | |
| XML output for GNU Bison and gcc | |
| http://www.cs.may.ie/~jpower/Research/bisonXML/ | |
| XML output for GNU Bison | |
| http://yaxx.sourceforge.net/ | |
| * Coding system independence | |
| Paul notes: | |
| Currently Bison assumes 8-bit bytes (i.e. that UCHAR_MAX is | |
| 255). It also assumes that the 8-bit character encoding is | |
| the same for the invocation of 'bison' as it is for the | |
| invocation of 'cc', but this is not necessarily true when | |
| people run bison on an ASCII host and then use cc on an EBCDIC | |
| host. I don't think these topics are worth our time | |
| addressing (unless we find a gung-ho volunteer for EBCDIC or | |
| PDP-10 ports :-) but they should probably be documented | |
| somewhere. | |
| More importantly, Bison does not currently allow NUL bytes in | |
| tokens, either via escapes (e.g., "x\0y") or via a NUL byte in | |
| the source code. This should get fixed. | |
| * Broken options? | |
| ** %token-table | |
| ** Skeleton strategy | |
| Must we keep %token-table? | |
| * Precedence | |
| ** Partial order | |
| 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). | |
| This is a prerequisite for modules. | |
| * Pre and post actions. | |
| From: Florian Krohm <florian@edamail.fishkill.ibm.com> | |
| Subject: YYACT_EPILOGUE | |
| To: bug-bison@gnu.org | |
| X-Sent: 1 week, 4 days, 14 hours, 38 minutes, 11 seconds ago | |
| The other day I had the need for explicitly building the parse tree. I | |
| used %locations for that and defined YYLLOC_DEFAULT to call a function | |
| that returns the tree node for the production. Easy. But I also needed | |
| to assign the S-attribute to the tree node. That cannot be done in | |
| YYLLOC_DEFAULT, because it is invoked before the action is executed. | |
| The way I solved this was to define a macro YYACT_EPILOGUE that would | |
| be invoked after the action. For reasons of symmetry I also added | |
| YYACT_PROLOGUE. Although I had no use for that I can envision how it | |
| might come in handy for debugging purposes. | |
| All is needed is to add | |
| #if YYLSP_NEEDED | |
| YYACT_EPILOGUE (yyval, (yyvsp - yylen), yylen, yyloc, (yylsp - yylen)); | |
| #else | |
| YYACT_EPILOGUE (yyval, (yyvsp - yylen), yylen); | |
| #endif | |
| at the proper place to bison.simple. Ditto for YYACT_PROLOGUE. | |
| I was wondering what you think about adding YYACT_PROLOGUE/EPILOGUE | |
| to bison. If you're interested, I'll work on a patch. | |
| * Better graphics | |
| Equip the parser with a means to create the (visual) parse tree. | |
| ----- | |
| # LocalWords: Cex gnulib gl Bistromathic TokenKinds yylex enum YYEOF EOF | |
| # LocalWords: YYerror gettext af hb YYERRCODE undef calc FIXME dev yyerror | |
| # LocalWords: Autoconf YYUNDEFTOK lexemes parsers Bistromathic's yyreport | |
| # LocalWords: const argc yacc yyclearin lookahead destructor Rici incluent | |
| # LocalWords: yydestruct yydiscardin catégories d'avertissements sr activé | |
| # LocalWords: conflits défaut rr l'alias chaîne n'est attaché un symbole | |
| # LocalWords: obsolète règle vide midrule valeurs de intermédiaire ou avec | |
| # LocalWords: définies inutilisées priorité associativité inutiles POSIX | |
| # LocalWords: incompatibilités tous les autres avertissements sauf dans rp | |
| # LocalWords: désactiver CATEGORIE traiter comme des erreurs glr Akim bool | |
| # LocalWords: Demaille arith lalr goto struct pathlen nullable ntokens lr | |
| # LocalWords: nterm bitsetv ielr ritem nstates nrules nritems yysymbol EQ | |
| # LocalWords: SymbolKind YYEMPTY YYUNDEF YYTNAME NUM yyntokens yytname sed | |
| # LocalWords: nonterminals yykind yycode YYNAMES yynames init getName conv | |
| # LocalWords: TokenKind ival yychar yylval yylexer Tolmer hoc | |
| # LocalWords: Sobisch YYPTRDIFF ptrdiff Autotest toknum yytoknum | |
| # LocalWords: sym Wother stderr FP fixits xgettext fdiagnostics Graphviz | |
| # LocalWords: graphviz VCG bitset xml bw maint yytoken YYABORT deps | |
| # LocalWords: YYACCEPT yytranslate nonnegative destructors yyerrlab repo | |
| # LocalWords: backends stmt expr yy Mardle baz qux Vadim Maslow CPP cpp | |
| # LocalWords: yydebug gcc UCHAR EBCDIC gung PDP NUL Pre Florian Krohm utf | |
| # LocalWords: YYACT YYLLOC YYLSP yyval yyvsp yylen yyloc yylsp endif | |
| # LocalWords: ispell american | |
| Local Variables: | |
| mode: outline | |
| coding: utf-8 | |
| fill-column: 76 | |
| ispell-dictionary: "american" | |
| End: | |
| Copyright (C) 2001-2004, 2006, 2008-2015, 2018-2022, 2025-2026 Free | |
| Software Foundation, Inc. | |
| This file is part of Bison, the GNU Compiler Compiler. | |
| Permission is granted to copy, distribute and/or modify this document | |
| under the terms of the GNU Free Documentation License, Version 1.3 or | |
| any later version published by the Free Software Foundation; with no | |
| Invariant Sections, with no Front-Cover Texts, and with no Back-Cover | |
| Texts. A copy of the license is included in the "GNU Free | |
| Documentation License" file as part of this distribution. |