Oops, Dominique alerted me to the fact that the patch I included was
stripped by the listserver...  I'm including it inline, then.

(Begin patch)

--- lemon.c    2013-01-04 20:39:20 +0000
+++ lemon-new.c    2013-01-04 23:09:59 +0000
@@ -109,7 +109,7 @@
 void Reprint(struct lemon *);
 void ReportOutput(struct lemon *);
 void ReportTable(struct lemon *, int);
-void ReportHeader(struct lemon *);
+void ReportHeader(struct lemon *, int);
 void CompressTables(struct lemon *);
 void ResortStates(struct lemon *);

@@ -1393,11 +1393,13 @@
   static int mhflag = 0;
   static int nolinenosflag = 0;
   static int noResort = 0;
+  static int fpflag = 0;
   static struct s_options options[] = {
     {OPT_FLAG, "b", (char*)&basisflag, "Print only the basis in report."},
     {OPT_FLAG, "c", (char*)&compress, "Don't compress the action table."},
     {OPT_FSTR, "D", (char*)handle_D_option, "Define an %ifdef macro."},
     {OPT_FSTR, "T", (char*)handle_T_option, "Specify a template file."},
+    {OPT_FLAG, "f", (char*)&fpflag, "Generate function prototypes in
header."},
     {OPT_FLAG, "g", (char*)&rpflag, "Print grammar without actions."},
     {OPT_FLAG, "m", (char*)&mhflag, "Output a makeheaders compatible
file."},
     {OPT_FLAG, "l", (char*)&nolinenosflag, "Do not print #line
statements."},
@@ -1502,7 +1504,7 @@
     /* Produce a header file for use by the scanner.  (This step is
     ** omitted if the "-m" option is used because makeheaders will
     ** generate the file for us.) */
-    if( !mhflag ) ReportHeader(&lem);
+    if( !mhflag ) ReportHeader(&lem, fpflag);
   }
   if( statistics ){
     printf("Parser statistics: %d terminals, %d nonterminals, %d rules\n",
@@ -4009,16 +4011,20 @@
 }

 /* Generate a header file for the parser */
-void ReportHeader(struct lemon *lemp)
+void ReportHeader(struct lemon *lemp, int fpflag)
 {
   FILE *out, *in;
+  const char *name;
   const char *prefix;
   char line[LINESIZE];
   char pattern[LINESIZE];
   int i;
+  int protok = 1;

   if( lemp->tokenprefix ) prefix = lemp->tokenprefix;
   else                    prefix = "";
+  if( lemp->name ) name = lemp->name;
+  else             name = "Parse";
   in = file_open(lemp,".h","rb");
   if( in ){
     int nextChar;
@@ -4026,9 +4032,24 @@
       sprintf(pattern,"#define %s%-30s
%2d\n",prefix,lemp->symbols[i]->name,i);
       if( strcmp(line,pattern) ) break;
     }
+    if( fpflag ){
+        sprintf(pattern,"void *%sAlloc(void *(*)(size_t));\n",name);
+        if( !fgets(line,LINESIZE,in) || strcmp(line,pattern) ){ protok =
0; goto after; }
+
+        if( lemp->arg ){
+            sprintf(pattern,"void %s(void
*,int,%s,%s);\n",name,lemp->tokentype,lemp->arg);
+        }else{
+            sprintf(pattern,"void %s(void
*,int,%s);\n",name,lemp->tokentype);
+        }
+        if( !fgets(line,LINESIZE,in) || strcmp(line,pattern) ){ protok =
0; goto after; }
+
+        sprintf(pattern,"void *%sFree(void *,void (*)(void *));\n",name);
+        if( !fgets(line,LINESIZE,in) || strcmp(line,pattern) ){ protok =
0; goto after; }
+    }
+after:
     nextChar = fgetc(in);
     fclose(in);
-    if( i==lemp->nterminal && nextChar==EOF ){
+    if( i==lemp->nterminal && protok && nextChar==EOF ){
       /* No change in the file.  Don't rewrite it. */
       return;
     }
@@ -4038,6 +4059,16 @@
     for(i=1; i<lemp->nterminal; i++){
       fprintf(out,"#define %s%-30s %2d\n",prefix,lemp->symbols[i]->name,i);
     }
+    if( fpflag ){
+        /* emit function prototypes */
+        fprintf(out,"void *%sAlloc(void *(*)(size_t));\n",name);
+        if( lemp->arg ){
+            fprintf(out,"void %s(void
*,int,%s,%s);\n",name,lemp->tokentype,lemp->arg);
+        }else{
+            fprintf(out,"void %s(void *,int,%s);\n",name,lemp->tokentype);
+        }
+        fprintf(out,"void *%sFree(void *,void (*)(void *));\n",name);
+    }
     fclose(out);
   }
   return;

(End patch)

Thanks,

          -Tiago


On Mon, Jan 7, 2013 at 6:15 AM, Dominique Devienne <ddevie...@gmail.com>wrote:

> On Sat, Jan 5, 2013 at 6:22 PM, Tiago Rodrigues <wtrm...@gmail.com> wrote:
> > [...]
> > This patch works against the current version of lemon.c, as linked to by
> > the Lemon page.  This is probably not correct, as the file is amalgamated
> > from other sources, but still might be useful to somebody.
>
> Hi Tiago. Looks like the patch was stripped by the mailing list.
> Perhaps you should include it inline to your message. Thanks, --DD
>



-- 
In those days, in those distant days, in those nights, in those remote
nights, in those years, in those distant years...
          - Gilgamesh, Enkidu and the Underworld
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to