[Restricted to bison-patches only] Hi Victor!
Good to hear from you! > Le 13 avr. 2020 à 12:54, Morales Cayuela, Victor (NSB - CN/Hangzhou) > <[email protected]> a écrit : > > Hello! > > First of all, I hope that all you and your relatives/friends are healthy, > this coronavirus is wreaking havoc. As far as I'm concerned, everybody around me is safe. Best of luck to everybody! > I have started working on the push parser in C++. Since I feel a bit > unconfident about how it should be done, I would like you to double-check > first if all this is going the correct direction. Sure! > I have just added a few things to transform it slowly from C to C++. I don't think this is the easiest path. It is good that you have a look at how push parsers are implemented in C, but do not try to morph the C push parsers into C++. Rather, once you understood what needs to be done, do it directly in lalr1.cc. Do not start a nice skeleton, just enhance the current one to support push parsers. I strongly recommend that you start from examples/c++/calc++, or whatever example you like, but in C++, using lalr1.cc. Do not start with something generated by yacc.c. I also recommend that you use git to follow your experiments. You could do that in your Bison repo for instance. The path should be roughly: - find what are the local variables of yyparse that should become member of the parser object - do it in your C++ parser. In C++ we don't need an equivalent for yypstate, because we already have it: that the parser object itself. - have your pull-parser (i.e., the good old yy::parser::parse()) work properly this way. Run tests. That's one of the reason I suggest using examples/c++/calc++ as a starting point: it already has tests, you can add more. That was step 1. - when this is done, look again at how push parsers are implemented in C to see what needs to change in yyparse so that the control is inverted: parse() will be *given* the tokens, instead of having to call yylex itself. When I say "look at C", I think your best option are (i) yacc.c (look for b4_push_if) and (ii) examples/c/bistromathic which is a push parser. - rename parse() as push_parse(symbol_type yyla) that takes the symbol as argument. That's the push parser we are looking for. - define a new parse() function which has the same signature as the usual pull-parser, that repeatedly calls the push_parse function. Something like this: int parse () { int status = 0; do { status = this->push_parse (yylex()); } while (status == YYPUSH_MORE); return status; } That's the end of step 2. When we agree on step 2, step 3 will start: implement these changes in lalr1.cc. I will help on this. > I have added namespace::yy and wrapped the public functions in a class. I > substituted "static const" for "constexpr. All that was easy and worked. Using constexpr in lalr1.cc would be nice, independently of push-parsers, but make sure to use #defines to be portable and fall back to static const for older versions of C++. Also, please, make sure to start from the latest version of master. There were quite a few changes in C++ too. You shall find it easier than before. Cheers! PS/ Please, send unified diffs (diff -u), not contextual ones. And always "old new", not "new old": old is the part with - line, new that with + lines.
