]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In the "parse.out" output file from Lemon, show addition the complete text
authordrh <drh@noemail.net>
Mon, 7 Sep 2015 14:22:24 +0000 (14:22 +0000)
committerdrh <drh@noemail.net>
Mon, 7 Sep 2015 14:22:24 +0000 (14:22 +0000)
of rules on reduce actions.

FossilOrigin-Name: b6ffb7e471e51ff69668154ad2c8790e466c9d37

main.mk
manifest
manifest.uuid
tool/lemon.c

diff --git a/main.mk b/main.mk
index d07e473be6a70e0cb776b94d82ecd43be79a7a78..3668c84321e4faef05c23597d7d8bb2c16f53043 100644 (file)
--- a/main.mk
+++ b/main.mk
@@ -582,7 +582,7 @@ parse.h:    parse.c
 parse.c:       $(TOP)/src/parse.y lemon $(TOP)/addopcodes.awk
        cp $(TOP)/src/parse.y .
        rm -f parse.h
-       ./lemon $(OPTS) parse.y
+       ./lemon -s $(OPTS) parse.y
        mv parse.h parse.h.temp
        $(NAWK) -f $(TOP)/addopcodes.awk parse.h.temp >parse.h
 
index f8137c54e5894e8b05bd7edd4140cd02f2188798..28359665c7ff0b6e611ceb2134cd894449d4754a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Improved\s"Parser\sStatistics"\soutput\s(the\s-s\soption)\sfor\sthe\sLemon\sparser\ngenerator.
-D 2015-09-07T02:23:02.396
+C In\sthe\s"parse.out"\soutput\sfile\sfrom\sLemon,\sshow\saddition\sthe\scomplete\stext\nof\srules\son\sreduce\sactions.
+D 2015-09-07T14:22:24.531
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -260,7 +260,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e
 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
 F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
-F main.mk 61821e43596648bfacce2d6283377bee35986131
+F main.mk 58eb74de702467c3b71cdf06f213cefe7f5ce544
 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea
 F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a
 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
@@ -1338,7 +1338,7 @@ F tool/fuzzershell.c f2fc86dd22df654b28851b85019d3bd007361751
 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4
 F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5
 F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce
-F tool/lemon.c cc515b02a6610ed76c93d49bd01fdb219356d7ac
+F tool/lemon.c a110c3850af6b91a553e153141186c32dee58f0d
 F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc
 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862
 F tool/logest.c eef612f8adf4d0993dafed0416064cf50d5d33c6
@@ -1383,7 +1383,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 47dc24bd1e8f76eb17ba53a883b8984b3e1b2934
-R d6df305b5709e894bdfc542577063f51
+P 809503e4efcdb498d176e8c0794a5ba0882adef2
+R fba651a02e6066be297178ded140cace
 U drh
-Z 643bd9ba035c2e0820f3e9522cf3c1e3
+Z 5f03c60d31dd0f570ea326a36f822715
index f1edfd5794adb0ba8d11479bd958182f3375f17a..31a753835530d9db76175a4f3a4e24012c98d8ac 100644 (file)
@@ -1 +1 @@
-809503e4efcdb498d176e8c0794a5ba0882adef2
\ No newline at end of file
+b6ffb7e471e51ff69668154ad2c8790e466c9d37
\ No newline at end of file
index f27fe4d24a7bfb0a60e77cc4f640fdf942d74396..1f9ef7b84dee117e685c5afc35f7abdba1a6c33a 100644 (file)
@@ -340,7 +340,7 @@ struct state {
   struct action *ap;       /* Array of actions for this state */
   int nTknAct, nNtAct;     /* Number of actions on terminals and nonterminals */
   int iTknOfst, iNtOfst;   /* yy_action[] offset for terminals and nonterms */
-  int iDflt;               /* Default action */
+  int iDflt;               /* Default action is reduce by this rule */
 };
 #define NO_OFFSET (-2147483647)
 
@@ -2960,15 +2960,14 @@ void Reprint(struct lemon *lemp)
   }
 }
 
-void ConfigPrint(FILE *fp, struct config *cfp)
-{
-  struct rule *rp;
+/* Print a single rule.
+*/
+void RulePrint(FILE *fp, struct rule *rp, int iCursor){
   struct symbol *sp;
   int i, j;
-  rp = cfp->rp;
   fprintf(fp,"%s ::=",rp->lhs->name);
   for(i=0; i<=rp->nrhs; i++){
-    if( i==cfp->dot ) fprintf(fp," *");
+    if( i==iCursor ) fprintf(fp," *");
     if( i==rp->nrhs ) break;
     sp = rp->rhs[i];
     if( sp->type==MULTITERMINAL ){
@@ -2982,6 +2981,12 @@ void ConfigPrint(FILE *fp, struct config *cfp)
   }
 }
 
+/* Print the rule for a configuration.
+*/
+void ConfigPrint(FILE *fp, struct config *cfp){
+  RulePrint(fp, cfp->rp, cfp->dot);
+}
+
 /* #define TEST */
 #if 0
 /* Print a set */
@@ -3021,15 +3026,29 @@ char *tag;
 /* Print an action to the given file descriptor.  Return FALSE if
 ** nothing was actually printed.
 */
-int PrintAction(struct action *ap, FILE *fp, int indent){
+int PrintAction(
+  struct action *ap,          /* The action to print */
+  FILE *fp,                   /* Print the action here */
+  int indent,                 /* Indent by this amount */
+  struct rule **apRule        /* All rules by index */
+){
   int result = 1;
   switch( ap->type ){
-    case SHIFT:
-      fprintf(fp,"%*s shift  %d",indent,ap->sp->name,ap->x.stp->statenum);
+    case SHIFT: {
+      struct state *stp = ap->x.stp;
+      fprintf(fp,"%*s shift  %-7d",indent,ap->sp->name,stp->statenum);
+      if( stp->nTknAct==0 && stp->nNtAct==0 && apRule ){
+        fprintf(fp,"then reduce %d: ", stp->iDflt);
+        RulePrint(fp, apRule[stp->iDflt], -1);
+      }
       break;
-    case REDUCE:
-      fprintf(fp,"%*s reduce %d",indent,ap->sp->name,ap->x.rp->index);
+    }
+    case REDUCE: {
+      struct rule *rp = ap->x.rp;
+      fprintf(fp,"%*s reduce %-7d",indent,ap->sp->name,rp->index);
+      if( apRule ) RulePrint(fp, apRule[rp->index], -1);
       break;
+    }
     case ACCEPT:
       fprintf(fp,"%*s accept",indent,ap->sp->name);
       break;
@@ -3038,16 +3057,16 @@ int PrintAction(struct action *ap, FILE *fp, int indent){
       break;
     case SRCONFLICT:
     case RRCONFLICT:
-      fprintf(fp,"%*s reduce %-3d ** Parsing conflict **",
+      fprintf(fp,"%*s reduce %-7d ** Parsing conflict **",
         indent,ap->sp->name,ap->x.rp->index);
       break;
     case SSCONFLICT:
-      fprintf(fp,"%*s shift  %-3d ** Parsing conflict **", 
+      fprintf(fp,"%*s shift  %-7d ** Parsing conflict **", 
         indent,ap->sp->name,ap->x.stp->statenum);
       break;
     case SH_RESOLVED:
       if( showPrecedenceConflict ){
-        fprintf(fp,"%*s shift  %-3d -- dropped by precedence",
+        fprintf(fp,"%*s shift  %-7d -- dropped by precedence",
                 indent,ap->sp->name,ap->x.stp->statenum);
       }else{
         result = 0;
@@ -3055,7 +3074,7 @@ int PrintAction(struct action *ap, FILE *fp, int indent){
       break;
     case RD_RESOLVED:
       if( showPrecedenceConflict ){
-        fprintf(fp,"%*s reduce %-3d -- dropped by precedence",
+        fprintf(fp,"%*s reduce %-7d -- dropped by precedence",
                 indent,ap->sp->name,ap->x.rp->index);
       }else{
         result = 0;
@@ -3076,7 +3095,17 @@ void ReportOutput(struct lemon *lemp)
   struct config *cfp;
   struct action *ap;
   FILE *fp;
-
+  struct rule **apRule;
+
+  apRule = malloc( sizeof(apRule[0])*(lemp->nrule+1) );
+  if( apRule ){
+    struct rule *x;
+    memset(apRule, 0, sizeof(apRule[0])*(lemp->nrule+1) );
+    for(x=lemp->rule; x; x=x->next){
+      assert( x->index>=0 && x->index<(lemp->nrule+1) );
+      apRule[x->index] = x;
+    }
+  }
   fp = file_open(lemp,".out","wb");
   if( fp==0 ) return;
   for(i=0; i<lemp->nstate; i++){
@@ -3104,7 +3133,7 @@ void ReportOutput(struct lemon *lemp)
     }
     fprintf(fp,"\n");
     for(ap=stp->ap; ap; ap=ap->next){
-      if( PrintAction(ap,fp,30) ) fprintf(fp,"\n");
+      if( PrintAction(ap,fp,30,apRule) ) fprintf(fp,"\n");
     }
     fprintf(fp,"\n");
   }
@@ -3130,6 +3159,7 @@ void ReportOutput(struct lemon *lemp)
     fprintf(fp, "\n");
   }
   fclose(fp);
+  free(apRule);
   return;
 }
 
@@ -4021,7 +4051,7 @@ void ReportTable(
   for(i=j=0; i<n; i++){
     stp = lemp->sorted[i];
     if( j==0 ) fprintf(out," /* %5d */ ", i);
-    fprintf(out, " %4d,", stp->iDflt);
+    fprintf(out, " %4d,", stp->iDflt+n);
     if( j==9 || i==n-1 ){
       fprintf(out, "\n"); lineno++;
       j = 0;
@@ -4342,7 +4372,7 @@ void ResortStates(struct lemon *lemp)
   for(i=0; i<lemp->nstate; i++){
     stp = lemp->sorted[i];
     stp->nTknAct = stp->nNtAct = 0;
-    stp->iDflt = lemp->nstate + lemp->nrule;
+    stp->iDflt = lemp->nrule;
     stp->iTknOfst = NO_OFFSET;
     stp->iNtOfst = NO_OFFSET;
     for(ap=stp->ap; ap; ap=ap->next){
@@ -4352,7 +4382,7 @@ void ResortStates(struct lemon *lemp)
         }else if( ap->sp->index<lemp->nsymbol ){
           stp->nNtAct++;
         }else{
-          stp->iDflt = compute_action(lemp, ap);
+          stp->iDflt = compute_action(lemp, ap) - lemp->nstate;
         }
       }
     }