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 <[email protected]>wrote:
> On Sat, Jan 5, 2013 at 6:22 PM, Tiago Rodrigues <[email protected]> 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
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users