Copyright (GPL) 2004 mmc mchirico@users.sourceforge.net or mchirico@comcast.net Last Updated: Fri Sep 3 10:18:58 EDT 2004
The latest version of these documents can be downloaded from: http://prdownloads.sourceforge.net/souptonuts/lemon_examples.tar.gz?download
To get emailed when there are update and additions: http://sourceforge.net/project/filemodule_monitor.php?filemodule_id=124528
example1.y
This is a very simple calulator. To compile the example do the following:
$ make
Then, to run the example issue the following command:
$ ./ex1
OK, what is happening: Take a look at the file "main_part", then, take a look at "example1.c" This main_part is appended to the raw form of example1.c in the Makefile. lemon does not create a complete program - only the necessary subroutines. So it is necessary to build in the main part of a program.
If you make your own changes to this example, you should make the changes to example1.y or main_part. example1.c is a generated file, and will be over written every time lemon is run.
Disecting main_part:
If you take a look at the documentation at the following link: http://www.hwaci.com/sw/lemon/lemon.html
You'll see that these are the essential functions that must be called. Note, this is a stripped down simple version with no error checking or tokenizer. The tokens are hardwired in so we can see exactly how lemon operates.
void* pParser = ParseAlloc (malloc); The next 4 lines parse the command 15 DIVIDE 5.
Parse (pParser, INTEGER, 15); Parse (pParser, DIVIDE, 0); Parse (pParser, INTEGER, 5); Parse (pParser, 0, 0);
INTEGER and DIVIDE are assigned values in the generated file example1.h to be the following;
#define PLUS 1 #define MINUS 2 #define DIVIDE 3 #define TIMES 4 #define INTEGER 5 Again, this is a generated file, so if any additions are made to this file, they'll be over-written when re-running lemon.
example2.y
This example is more interesting. A custom token is created in ex2def.h with the following 4 lines:
struct Token { const char *z; int value;
unsigned n;
};
This structure supports both a value and a count. You could add many more values, and allocate memory to z if you wanted. One, note, you cannot put in C++ strings or other STL containers directly into this structure; instead, you would need to have pointers to such structures. Note, if memory was allocated for z, you'd have to free it.
example3.y
This shows the behavior of a destructor
Parse (pParser, 0, t1); ^--^------ only t1 will destruct, since it is called with zero here.
example4.y
This is the first example that ends the grammer with a newline.
In the file example4.y take a look at the following:
main ::= in. in ::= . in ::= in state NEWLINE.
In main_part4 the last statement here can cause the output to print. Whereas in examples 1-3 it had to end with " Parse (pParser, 0, t0)";
Parse (pParser, ID, t0); Parse (pParser, PLUS, t0); Parse (pParser, ID, t1); Parse (pParser, NEWLINE, t1);
example5.y
This example puts everything together with flex. But, take a peek at how lexer.l is complied in the Makefile with "flex lexer.l" instead of "flex++ lexer.l". The main_part5 for this example is in C++, so it's necessary to add the extern "C" directives. True it could have been compiled with flex++; but, many people prefer flex for the speed of C in complex projects.
This example is run interactively, so entering something like 3+5 is demonstrated below:
$ ./ex5 3+5 yylex() 6 yylval.dval 3 yylex() 1 yylval.dval 3 yylex() 6 yylval.dval 5 yylex() 5 yylval.dval 5 In token_destructor t.value= 3 In token_destructor t.n= 0 Result.value=8 Result.n=4
desktop_calc.cc
This is an example of a C++ calculator that has not been written with a parser.
REFERENCES:
(1) Complete source for all examples including the lemon parser generator http://prdownloads.sourceforge.net/souptonuts/lemon_examples.tar.gz?download
(2) Example desktop calculator from scratch http://souptonuts.sourceforge.net/code/desktop_calc.cc.html]
(3) Example of flex and bison parser http://prdownloads.sourceforge.net/souptonuts/flex_bison.tar.gz?download
(3) Home of the lemon parser generator http://www.hwaci.com/sw/lemon/
(4) Home of sqlite http://www.sqlite.org/
(5) Glossory of paser terms http://www.parsifalsoft.com/gloss.html
(6) Good introduction to parsers http://www.parsifalsoft.com/isdp.html
(7) GNU flex manual http://www.gnu.org/software/flex/manual/
(8) GNU bison manual http://www.gnu.org/software/bison/manual/
(9) The spirit parser September 2003, C/C++ Users Journal Powerful parsing made easy via modern template techniques. Joel de Guzman and Dan Nuffer. http://spirit.sourceforge.net/
(10) Getting a C++ Bison parser to use a C Flex lexer http://www.iunknown.com/000123.html