> Hi, > Can u send me any documentation on LEMON that u have worked out. > I have some queries also..... > 1.Does LEMON work on Windows environment? > 2.I tried but it is not.I heard that it works on Linux environment.I am > trying to know why not on windows...can u give me some info about it > > I am reading the material u have suggested me but it did not have any > information regarding to my queries. > > Can u mail me if u have made any documentation on LEMON. >
Well, basically lemon works as follows: 1. It reads the definition of the parser from the input file you give it as the first argument. From that it produces a set of tables that implement the parser. This information gets filled in in a template. 2. The result is a C file that you can use to parse (interpret) your input. 3. What it does not do is split up the input into tokens. You have to do that yourself. I attach a small - not very efficient - example that shows a few features of lemon. As for your questions: There is no reason it would not work on Windows: it is a perfectly straghtforward C program, you get the source code and compile it. One thing though: the template file must be in the directory where you run the program, where the executable lives or in the PATH. (I am using it myself on Windows :). I am adapting it so that it will produce Fortran code instead of C code. But that is off topic.) Here is my sample parser definition: // expr.y // Simple parser: // expr = vaue + value + value + ... %extra_argument {State *state} %token_type {Token*} %type term {int} expr ::= firstterm plusterms . { printf( "Result: %d\n", state->sum ); } firstterm ::= term(T) . { state->sum = T; printf("First term: %d\n", T ); } term(V) ::= NUMBER(N) . { sscanf( N->token, "%d", &V ); printf("Term: %d -- %s\n", V, N->token ); } plusterms ::= . plusterms ::= plusterms plusterm . plusterm ::= PLUS term(T) . { state->sum = state->sum + T; printf( "Result so far: %d\n", state->sum ); } ------ And here is the main program that includes the resulting C code: #include <stdlib.h> #include <stdio.h> #include <assert.h> typedef struct { char *token; } Token; typedef struct { int sum; } State; #include "expr.h" #include "expr.c" int main( int argc, char *argv[] ) { Token token[10]; State state; void *pParser = (void *) ParseAlloc( malloc ); ParseTrace( stdout, ">>" ); token[0].token = "1"; Parse( pParser, NUMBER, &token[0], &state ); token[1].token = "+"; Parse( pParser, PLUS, &token[1], &state ); token[2].token = "2"; Parse( pParser, NUMBER, &token[2], &state ); token[3].token = "+"; Parse( pParser, PLUS, &token[3], &state ); token[4].token = "3"; Parse( pParser, NUMBER, &token[4], &state ); Parse( pParser, 0, &token[0], &state ); ParseFree( pParser, free ); return 0; } ----- One thing to note: As the tokens are not always treated the moment they are passed to the parser - this depends on the grammar and the moment in the parsing process, you need to make sure that the tokens remain available. I have done that in this silly program by using an array of them. But a smarter program would use lemon's abilities to destroy the tokens when ready. Regards, Arjen _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users