Increase the size of the yy_lookahead table so that it is never necessary to
down bounds checking on the index.
FossilOrigin-Name: bafd872398e58766e996963372c7acc03a1e20a6d39a3867ca45d3ea0ed2ac1d
diff --git a/tool/lemon.c b/tool/lemon.c
index 4416f67..3daa6d3 100644
--- a/tool/lemon.c
+++ b/tool/lemon.c
@@ -4153,6 +4153,7 @@
struct rule *rp;
struct acttab *pActtab;
int i, j, n, sz;
+ int nLookAhead;
int szActionType; /* sizeof(YYACTIONTYPE) */
int szCodeType; /* sizeof(YYCODETYPE) */
const char *name;
@@ -4403,13 +4404,29 @@
if( la<0 ) la = lemp->nsymbol;
if( j==0 ) fprintf(out," /* %5d */ ", i);
fprintf(out, " %4d,", la);
- if( j==9 || i==n-1 ){
+ if( j==9 ){
fprintf(out, "\n"); lineno++;
j = 0;
}else{
j++;
}
}
+ /* Add extra entries to the end of the yy_lookahead[] table so that
+ ** yy_shift_ofst[]+iToken will always be a valid index into the array,
+ ** even for the largest possible value of yy_shift_ofst[] and iToken. */
+ nLookAhead = lemp->nterminal + lemp->nactiontab;
+ while( i<nLookAhead ){
+ if( j==0 ) fprintf(out," /* %5d */ ", i);
+ fprintf(out, " %4d,", lemp->nterminal);
+ if( j==9 ){
+ fprintf(out, "\n"); lineno++;
+ j = 0;
+ }else{
+ j++;
+ }
+ i++;
+ }
+ if( j>0 ) fprintf(out, "\n"); lineno++;
fprintf(out, "};\n"); lineno++;
/* Output the yy_shift_ofst[] table */