mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 04:13:03 +00:00
todo: update for YYERRCODE
This commit is contained in:
112
TODO
112
TODO
@@ -18,6 +18,118 @@
|
||||
- YYERRCODE, YYUNDEF, YYEOF
|
||||
- YYERRCODE and translation
|
||||
|
||||
** yypcontext_expected_tokens
|
||||
Beware that returning 0 is unclear: does it mean there are no possible
|
||||
lookahead, or that there are too many?
|
||||
|
||||
** YYERRCODE
|
||||
How about using "return YYERRCODE" to tell the parser to enter
|
||||
error-recovery, but not emit an error message? I have frequently felt the
|
||||
need for the scanner to be able to do that. In C++ we can, thanks to throw
|
||||
syntax_error.
|
||||
|
||||
Some people seem to be aware that return YYERRCODE is possible...
|
||||
https://github.com/search?q=%22return+YYERRCODE%22&type=Code
|
||||
|
||||
*** unixODBC
|
||||
There are tons of copies on GitHub, I don't know where the original is.
|
||||
|
||||
https://github.com/faiz-akhtar/Calico/blob/01b49089a3eb535380877bbdc6c641b8b4e7ca6f/Drivers/nn/yylex.c
|
||||
|
||||
But they define YYERRCODE themselves! They are stepping on "our" namespace.
|
||||
|
||||
```
|
||||
# define YYERRCODE 256
|
||||
```
|
||||
|
||||
Besides, what they do is super-weird: they use YYERRCODE is several places
|
||||
for their own error tracking.
|
||||
|
||||
```
|
||||
int nnsql_yylex(YYSTYPE* pyylval, yyenv_t* penv)
|
||||
{
|
||||
[...]
|
||||
len = getname(penv->texts_bufptr, -1, penv);
|
||||
|
||||
if( len == YYERRCODE )
|
||||
return len;
|
||||
```
|
||||
|
||||
*** avrdude-6.3
|
||||
|
||||
Latest version: http://svn.savannah.gnu.org/viewvc/avrdude/trunk/avrdude/lexer.l?view=markup
|
||||
|
||||
We can certainly talk to them about their use of YYERRCODE.
|
||||
|
||||
Replicas on GitHub:
|
||||
|
||||
https://github.com/tam1035/Phys605-March27/blob/0f856baf20877b6f333f91ed17860bd752c7d68e/AVR/avrdude-6.3/lexer.l
|
||||
|
||||
They emit error messages from the scanner and force error recovery. But
|
||||
then, they get two error messages.
|
||||
|
||||
```
|
||||
c: { yyerror("possible old-style config file entry\n"
|
||||
" Update your config file (see " CONFIG_DIR
|
||||
"/avrdude.conf.sample for a sample)");
|
||||
return YYERRCODE; }
|
||||
```
|
||||
|
||||
Unfortunately they also expect the error message at some places. Here,
|
||||
return YYUNDEFTOK (or just return yytext[0]) would have been better.
|
||||
|
||||
```
|
||||
. { return YYERRCODE; }
|
||||
```
|
||||
|
||||
*** Casacore A suite of C++ libraries for radio astronomy data processing.
|
||||
|
||||
https://github.com/casacore/casacore/blob/110bf435c3fe292ee0c3e4bdd039853d257c9536/ms/MSSel/MSAntennaGram.ll
|
||||
|
||||
```
|
||||
/* Any other character is invalid */
|
||||
. { return YYERRCODE; }
|
||||
```
|
||||
|
||||
A pattern they used several times.
|
||||
https://github.com/casacore/casacore/search?q=YYERRCODE&unscoped_q=YYERRCODE
|
||||
|
||||
I don't understand how this works: AFAICT, we only define YYERRCODE in
|
||||
y.tab.c, not y.tab.h. That's the case in Apple's Bison 2.3 for instance.
|
||||
Flex does not generate it either.
|
||||
|
||||
*** Some shell
|
||||
Seems to be old versions of busybox.
|
||||
|
||||
https://github.com/luotao717/arsdk/blob/9f9004157afcd26b915125576a815f6b3e0cd715/apps/busybox-1.01/shell/msh.c
|
||||
|
||||
|
||||
```
|
||||
#define YYERRCODE 300
|
||||
```
|
||||
|
||||
Used only in one function (collect)
|
||||
|
||||
But today the parser is written by hand.
|
||||
|
||||
https://github.com/mirror/busybox/blob/master/shell/ash.c#L11527
|
||||
|
||||
*** glibc's intl
|
||||
|
||||
https://sourceware.org/git/?p=glibc.git;a=blob;f=intl/plural.y;h=f69fba7c602e9f890f8e5c3b2cd7fe1c487714ea;hb=HEAD
|
||||
|
||||
Their yylex returns YYERRCODE, but they don't want any error message.
|
||||
|
||||
```
|
||||
379 static void
|
||||
380 yyerror (struct parse_args *arg, const char *str)
|
||||
381 {
|
||||
382 /* Do nothing. We don't print error messages here. */
|
||||
383 }
|
||||
```
|
||||
|
||||
This code was not updated in years.
|
||||
|
||||
** Java
|
||||
*** Examples
|
||||
Have an example with a push parser. Use autocompletion in that case.
|
||||
|
||||
Reference in New Issue
Block a user