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:07:01 -05:00
parent 45d441f103
commit 0d67d107ab

View file

@ -192,6 +192,8 @@ struct rule {
const char *code; /* The code executed when this rule is reduced */ const char *code; /* The code executed when this rule is reduced */
const char *codePrefix; /* Setup code before code[] above */ const char *codePrefix; /* Setup code before code[] above */
const char *codeSuffix; /* Breakdown code after code[] above */ const char *codeSuffix; /* Breakdown code after code[] above */
int noCode; /* True if this rule has no associated C code */
int codeEmitted; /* True if the code has been emitted already */
struct symbol *precsym; /* Precedence symbol for this rule */ struct symbol *precsym; /* Precedence symbol for this rule */
int index; /* An index number for this rule */ int index; /* An index number for this rule */
int iRule; /* Rule number as used in the generated tables */ int iRule; /* Rule number as used in the generated tables */
@ -253,7 +255,7 @@ struct state {
struct config *bp; /* The basis configurations for this state */ struct config *bp; /* The basis configurations for this state */
struct config *cfp; /* All configurations in this set */ struct config *cfp; /* All configurations in this set */
int statenum; /* Sequential number for this state */ int statenum; /* Sequential number for this state */
struct action *ap; /* Array of actions for this state */ struct action *ap; /* List of actions for this state */
int nTknAct, nNtAct; /* Number of actions on terminals and nonterminals */ int nTknAct, nNtAct; /* Number of actions on terminals and nonterminals */
int iTknOfst, iNtOfst; /* yy_action[] offset for terminals and nonterms */ int iTknOfst, iNtOfst; /* yy_action[] offset for terminals and nonterms */
int iDfltReduce; /* Default action is to REDUCE by this rule */ int iDfltReduce; /* Default action is to REDUCE by this rule */
@ -1483,7 +1485,7 @@ static void handle_C_option(char *z){
} }
} }
/* Merge together to lists of rules order by rule.iRule */ /* Merge together to lists of rules ordered by rule.iRule */
static struct rule *Rule_merge(struct rule *pA, struct rule *pB){ static struct rule *Rule_merge(struct rule *pA, struct rule *pB){
struct rule *pFirst = 0; struct rule *pFirst = 0;
struct rule **ppPrev = &pFirst; struct rule **ppPrev = &pFirst;
@ -1627,7 +1629,10 @@ int main(int argc, char **argv)
for(i=1; ISUPPER(lem.symbols[i]->name[0]); i++); for(i=1; ISUPPER(lem.symbols[i]->name[0]); i++);
lem.nterminal = i; lem.nterminal = i;
/* Assign sequential rule numbers */ /* Assign sequential rule numbers. Start with 0. Put rules that have no
** reduce action C-code associated with them last, so that the switch()
** statement that selects reduction actions will have a smaller jump table.
*/
for(i=0, rp=lem.rule; rp; rp=rp->next){ for(i=0, rp=lem.rule; rp; rp=rp->next){
rp->iRule = rp->code ? i++ : -1; rp->iRule = rp->code ? i++ : -1;
} }
@ -2179,7 +2184,7 @@ static void parseonetoken(struct pstate *psp)
"There is no prior rule upon which to attach the code \ "There is no prior rule upon which to attach the code \
fragment which begins on this line."); fragment which begins on this line.");
psp->errorcnt++; psp->errorcnt++;
}else if( psp->prevrule->code!=0 ){ }else if( psp->prevrule->code!=0 ){
ErrorMsg(psp->filename,psp->tokenlineno, ErrorMsg(psp->filename,psp->tokenlineno,
"Code fragment beginning on this line is not the first \ "Code fragment beginning on this line is not the first \
to follow the previous rule."); to follow the previous rule.");
@ -2187,7 +2192,8 @@ to follow the previous rule.");
}else{ }else{
psp->prevrule->line = psp->tokenlineno; psp->prevrule->line = psp->tokenlineno;
psp->prevrule->code = &x[1]; psp->prevrule->code = &x[1];
} psp->prevrule->noCode = 0;
}
}else if( x[0]=='[' ){ }else if( x[0]=='[' ){
psp->state = PRECEDENCE_MARK_1; psp->state = PRECEDENCE_MARK_1;
}else{ }else{
@ -2293,6 +2299,7 @@ to follow the previous rule.");
rp->lhsalias = psp->lhsalias; rp->lhsalias = psp->lhsalias;
rp->nrhs = psp->nrhs; rp->nrhs = psp->nrhs;
rp->code = 0; rp->code = 0;
rp->noCode = 1;
rp->precsym = 0; rp->precsym = 0;
rp->index = psp->gp->nrule++; rp->index = psp->gp->nrule++;
rp->nextlhs = rp->lhs->rule; rp->nextlhs = rp->lhs->rule;
@ -3531,9 +3538,8 @@ PRIVATE char *append_str(const char *zText, int n, int p1, int p2, int bNoSubst)
} }
/* /*
** zCode is a string that is the action associated with a rule. Expand ** Write and transform the rp->code string so that symbols are expanded.
** the symbols in this string so that the refer to elements of the parser ** Populate the rp->codePrefix and rp->codeSuffix strings, as appropriate.
** stack.
** **
** Return 1 if the expanded code requires that "yylhsminor" local variable ** Return 1 if the expanded code requires that "yylhsminor" local variable
** to be defined. ** to be defined.
@ -3557,6 +3563,9 @@ PRIVATE int translate_code(struct lemon *lemp, struct rule *rp){
static char newlinestr[2] = { '\n', '\0' }; static char newlinestr[2] = { '\n', '\0' };
rp->code = newlinestr; rp->code = newlinestr;
rp->line = rp->ruleline; rp->line = rp->ruleline;
rp->noCode = 1;
}else{
rp->noCode = 0;
} }
if( rp->nrhs==0 ){ if( rp->nrhs==0 ){
@ -3571,6 +3580,7 @@ PRIVATE int translate_code(struct lemon *lemp, struct rule *rp){
append_str(" yy_destructor(yypParser,%d,&yymsp[%d].minor);\n", 0, append_str(" yy_destructor(yypParser,%d,&yymsp[%d].minor);\n", 0,
rp->rhs[0]->index,1-rp->nrhs,0); rp->rhs[0]->index,1-rp->nrhs,0);
rp->codePrefix = Strsafe(append_str(0,0,0,0,0)); rp->codePrefix = Strsafe(append_str(0,0,0,0,0));
rp->noCode = 0;
} }
}else if( rp->lhsalias==0 ){ }else if( rp->lhsalias==0 ){
/* There is no LHS value symbol. */ /* There is no LHS value symbol. */
@ -3717,7 +3727,10 @@ PRIVATE int translate_code(struct lemon *lemp, struct rule *rp){
/* Suffix code generation complete */ /* Suffix code generation complete */
cp = append_str(0,0,0,0,0); cp = append_str(0,0,0,0,0);
if( cp && cp[0] ) rp->codeSuffix = Strsafe(cp); if( cp && cp[0] ){
rp->codeSuffix = Strsafe(cp);
rp->noCode = 0;
}
return rc; return rc;
} }
@ -4398,13 +4411,9 @@ void ReportTable(
/* First output rules other than the default: rule */ /* First output rules other than the default: rule */
for(rp=lemp->rule; rp; rp=rp->next){ for(rp=lemp->rule; rp; rp=rp->next){
struct rule *rp2; /* Other rules with the same action */ struct rule *rp2; /* Other rules with the same action */
if( rp->code==0 ) continue; if( rp->codeEmitted ) continue;
if( rp->code[0]=='\n' if( rp->noCode ){
&& rp->code[1]==0 /* No C code actions, so this will be part of the "default:" rule */
&& rp->codePrefix==0
&& rp->codeSuffix==0
){
/* No actions, so this will be part of the "default:" rule */
continue; continue;
} }
fprintf(out," case %d: /* ",rp->iRule); fprintf(out," case %d: /* ",rp->iRule);
@ -4416,21 +4425,19 @@ void ReportTable(
fprintf(out," case %d: /*",rp2->iRule); fprintf(out," case %d: /*",rp2->iRule);
writeRuleText(out, rp2); writeRuleText(out, rp2);
fprintf(out, " */ yytestcase(yyruleno==%d);\n", rp2->iRule); lineno++; fprintf(out, " */ yytestcase(yyruleno==%d);\n", rp2->iRule); lineno++;
rp2->code = 0; rp2->codeEmitted = 1;
} }
} }
emit_code(out,rp,lemp,&lineno); emit_code(out,rp,lemp,&lineno);
fprintf(out," break;\n"); lineno++; fprintf(out," break;\n"); lineno++;
rp->code = 0; rp->codeEmitted = 1;
} }
/* Finally, output the default: rule. We choose as the default: all /* Finally, output the default: rule. We choose as the default: all
** empty actions. */ ** empty actions. */
fprintf(out," default:\n"); lineno++; fprintf(out," default:\n"); lineno++;
for(rp=lemp->rule; rp; rp=rp->next){ for(rp=lemp->rule; rp; rp=rp->next){
if( rp->code==0 ) continue; if( rp->codeEmitted ) continue;
assert( rp->code[0]=='\n' && rp->code[1]==0 ); assert( rp->noCode );
assert( rp->codePrefix==0 );
assert( rp->codeSuffix==0 );
fprintf(out," /* (%d) ", rp->iRule); fprintf(out," /* (%d) ", rp->iRule);
writeRuleText(out, rp); writeRuleText(out, rp);
fprintf(out," */ yytestcase(yyruleno==%d);\n", rp->iRule); lineno++; fprintf(out," */ yytestcase(yyruleno==%d);\n", rp->iRule); lineno++;