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

lemon/README_lemon_tutorial.txt · Last modified: 2015/01/17 01:06 (external edit)
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0