Hi,
Transitions on declared, but unused tokens are not included into state
transitions. You normally would get $default transitions, but byacc
insists on specifying all tokens. This leads to wrong
results because a syntax-error is generated on a perfectly legal input.
Try this source, once without the tNL rule, and once with. A syntax
error is generated if the rule is not implemented. When the rule is
there, then the proper result is printed.
Version of byacc:
yysccsid[] = \"@(#)yaccpar 1.9 (Berkeley) 02/21/93\";"
The bug was also submitted to www.freebsd.org.
To compile (use attached source below):
$ byacc byacc-bug.y
$ gcc -o byacc-bug y.tab.c
$ ./byacc-bug
---- file byacc-bug.y ----
%{
#include <stdio.h>
#include <stdlib.h>
%}
%token tTOK tNUM tNL
%left '+'
%%
lines : line
| lines line
;
line : tTOK xpr ',' xpr {
if(yychar == tNL)
printf("Success: Got tNL\n");
}
/* Declare NON-terminal as used */
/* | tNL */
;
xpr : xpr '+' xpr
| tNUM
;
%%
int yylex(void)
{
static int tok[] = {tTOK, tNUM, ',', tNUM, tNL, 0};
static int idx = 0;
#define NTOK (sizeof(tok)/sizeof(tok[0]))
if(idx < NTOK)
return tok[idx++];
return 0;
}
void yyerror(char *s)
{
printf("yyerror: %s\n", s);
exit(1);
}
int main(void)
{
return yyparse();
}
----------------Cut here------------------
Possible work-arround:
You have to define a rule that captures all non-terminal tokens (i.e.
all tokens in %token, %left and %right declarations that are otherwise
unused). This can be tricky if such a rule has grammatical side-effects.
A real fix requires a patch in byacc (but I am not familiar with its
internals).
Greetings Bertho