aboutsummaryrefslogtreecommitdiff
path: root/tool/lemon.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2016-02-17 04:33:10 +0000
committerdrh <drh@noemail.net>2016-02-17 04:33:10 +0000
commitcf82f0d3d2606af4caff3845240dceb4c7c4d25c (patch)
tree6cf8c7f89f05cd5042e3c1d5370d6094ccce0c15 /tool/lemon.c
parentdabd04c656f37ef45786c25cb73bf8b517303eda (diff)
downloadsqlite-cf82f0d3d2606af4caff3845240dceb4c7c4d25c.tar.gz
sqlite-cf82f0d3d2606af4caff3845240dceb4c7c4d25c.zip
Enhance Lemon so that if reduce code contains a comment of the form
"/*A-overwrites-X*/" then a LHS label A is allowed to overwrite the RHS label X. FossilOrigin-Name: 5cfe9545d478a2c500083613dd20e14b2ffce645
Diffstat (limited to 'tool/lemon.c')
-rw-r--r--tool/lemon.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/tool/lemon.c b/tool/lemon.c
index 1f81717c7..1058d14ae 100644
--- a/tool/lemon.c
+++ b/tool/lemon.c
@@ -3476,11 +3476,13 @@ PRIVATE char *append_str(const char *zText, int n, int p1, int p2){
PRIVATE int translate_code(struct lemon *lemp, struct rule *rp){
char *cp, *xp;
int i;
- int rc = 0; /* True if yylhsminor is used */
- char lhsused = 0; /* True if the LHS element has been used */
- char lhsdirect; /* True if LHS writes directly into stack */
- char used[MAXRHS]; /* True for each RHS element which is used */
- char zLhs[50]; /* Convert the LHS symbol into this string */
+ int rc = 0; /* True if yylhsminor is used */
+ const char *zSkip = 0; /* The zOvwrt comment within rp->code, or NULL */
+ char lhsused = 0; /* True if the LHS element has been used */
+ char lhsdirect; /* True if LHS writes directly into stack */
+ char used[MAXRHS]; /* True for each RHS element which is used */
+ char zLhs[50]; /* Convert the LHS symbol into this string */
+ char zOvwrt[900]; /* Comment that to allow LHS to overwrite RHS */
for(i=0; i<rp->nrhs; i++) used[i] = 0;
lhsused = 0;
@@ -3522,7 +3524,16 @@ PRIVATE int translate_code(struct lemon *lemp, struct rule *rp){
lemp->errorcnt++;
}
}else{
- lhsdirect = 0;
+ lemon_sprintf(zOvwrt, "/*%s-overwrites-%s*/",
+ rp->lhsalias, rp->rhsalias[0]);
+ zSkip = strstr(rp->code, zOvwrt);
+ if( zSkip!=0 ){
+ /* The code contains a special comment that indicates that it is safe
+ ** for the LHS label to overwrite left-most RHS label. */
+ lhsdirect = 1;
+ }else{
+ lhsdirect = 0;
+ }
}
if( lhsdirect ){
sprintf(zLhs, "yymsp[%d].minor.yy%d",1-rp->nrhs,rp->lhs->dtnum);
@@ -3535,6 +3546,11 @@ PRIVATE int translate_code(struct lemon *lemp, struct rule *rp){
/* This const cast is wrong but harmless, if we're careful. */
for(cp=(char *)rp->code; *cp; cp++){
+ if( cp==zSkip ){
+ append_str(zOvwrt,0,0,0);
+ cp += lemonStrlen(zOvwrt)-1;
+ continue;
+ }
if( ISALPHA(*cp) && (cp==rp->code || (!ISALNUM(cp[-1]) && cp[-1]!='_')) ){
char saved;
for(xp= &cp[1]; ISALNUM(*xp) || *xp=='_'; xp++);