Lemon update 2016-05-23 14:24:31 on branch trunk

— Fix comment typos and improve clarity of presention in Lemon. The output
should be identical. (user: drh)
This commit is contained in:
Marisa Heit 2016-10-13 22:09:13 -05:00
parent 0d67d107ab
commit 64bd551d20

View file

@ -245,6 +245,7 @@ struct action {
struct state *stp; /* The new state, if a shift */ struct state *stp; /* The new state, if a shift */
struct rule *rp; /* The rule, if a reduce */ struct rule *rp; /* The rule, if a reduce */
} x; } x;
struct symbol *spOpt; /* SHIFTREDUCE optimization to this symbol */
struct action *next; /* Next action for this state */ struct action *next; /* Next action for this state */
struct action *collide; /* Next action with the same hash */ struct action *collide; /* Next action with the same hash */
}; };
@ -435,6 +436,7 @@ void Action_add(
*app = newaction; *app = newaction;
newaction->type = type; newaction->type = type;
newaction->sp = sp; newaction->sp = sp;
newaction->spOpt = 0;
if( type==SHIFT ){ if( type==SHIFT ){
newaction->x.stp = (struct state *)arg; newaction->x.stp = (struct state *)arg;
}else{ }else{
@ -3160,6 +3162,9 @@ int PrintAction(
result = 0; result = 0;
break; break;
} }
if( result && ap->spOpt ){
fprintf(fp," /* because %s==%s */", ap->sp->name, ap->spOpt->name);
}
return result; return result;
} }
@ -4513,7 +4518,7 @@ void ReportHeader(struct lemon *lemp)
void CompressTables(struct lemon *lemp) void CompressTables(struct lemon *lemp)
{ {
struct state *stp; struct state *stp;
struct action *ap, *ap2; struct action *ap, *ap2, *nextap;
struct rule *rp, *rp2, *rbest; struct rule *rp, *rp2, *rbest;
int nbest, n; int nbest, n;
int i; int i;
@ -4590,6 +4595,36 @@ void CompressTables(struct lemon *lemp)
} }
} }
} }
/* If a SHIFTREDUCE action specifies a rule that has a single RHS term
** (meaning that the SHIFTREDUCE will land back in the state where it
** started) and if there is no C-code associated with the reduce action,
** then we can go ahead and convert the action to be the same as the
** action for the RHS of the rule.
*/
for(i=0; i<lemp->nstate; i++){
stp = lemp->sorted[i];
for(ap=stp->ap; ap; ap=nextap){
nextap = ap->next;
if( ap->type!=SHIFTREDUCE ) continue;
rp = ap->x.rp;
if( rp->noCode==0 ) continue;
if( rp->nrhs!=1 ) continue;
#if 1
/* Only apply this optimization to non-terminals. It would be OK to
** apply it to terminal symbols too, but that makes the parser tables
** larger. */
if( ap->sp->index<lemp->nterminal ) continue;
#endif
/* If we reach this point, it means the optimization can be applied */
nextap = ap;
for(ap2=stp->ap; ap2 && (ap2==ap || ap2->sp!=rp->lhs); ap2=ap2->next){}
assert( ap2!=0 );
ap->spOpt = ap2->sp;
ap->type = ap2->type;
ap->x = ap2->x;
}
}
} }