> 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

Reply via email to