| /* Copyright (GPL) 2004 mchirico@users.sourceforge.net or mchirico@comcast.net |
| Simple lemon parser example. |
| |
| Download: |
| http://prdownloads.sourceforge.net/souptonuts/lemon_examples.tar.gz?download |
| |
| |
| To compile this example see the Makefile. Or |
| this is what is taking place. |
| |
| $ ./lemon example2.y |
| $ cat main_part2 >> example2.c |
| $ g++ -o ex2 -O2 -s -pipe example2.c |
| |
| Next, run ./ex2 |
| |
| $ ./ex2 |
| |
| Which will give the following output: |
| |
| Result.value=17 <---------------------------\ |
| Result.n=4 | |
| Result.value=-9 | |
| Result.n=4 | |
| Result.value=78 | |
| Result.n=10 | |
| | |
| Now looking at a section of main_part2 | |
| we can see how 4 PLUS 13 in implemented. | |
| | |
| struct Token t0,t1; | |
| struct Token mToken; | |
| | |
| t0.value=4; | |
| t0.n=0; | |
| | |
| t1.value=13; | |
| t1.n=0; | |
| // Below 4 PLUS 14 ----------------- / |
| Parse (pParser, NUM, t0); |
| Parse (pParser, PLUS, t0); |
| Parse (pParser, NUM, t1); |
| Parse (pParser, 0, t0); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| */ |
| |
| %include { |
| #include <iostream> |
| #include "ex2def.h" |
| #include "example2.h" |
| } |
| |
| |
| %token_type {Token} |
| %default_type {Token} |
| |
| |
| %type expr {Token} |
| %type NUM {Token} |
| |
| %left PLUS MINUS. |
| %left DIVIDE TIMES. |
| |
| |
| |
| %syntax_error { |
| std::cout << "Syntax error!" << std::endl; |
| } |
| |
| program ::= expr(A). { |
| std::cout << "Result.value=" << A.value << std::endl; |
| std::cout << "Result.n=" << A.n << std::endl; |
| |
| } |
| |
| |
| expr(A) ::= expr(B) MINUS expr(C). { A.value = B.value - C.value; |
| A.n = B.n+1 + C.n+1; |
| } |
| |
| expr(A) ::= expr(B) PLUS expr(C). { A.value = B.value + C.value; |
| A.n = B.n+1 + C.n+1; |
| } |
| |
| expr(A) ::= expr(B) TIMES expr(C). { A.value = B.value * C.value; |
| A.n = B.n+1 + C.n+1; |
| |
| } |
| expr(A) ::= expr(B) DIVIDE expr(C). { |
| |
| if(C.value != 0){ |
| A.value = B.value / C.value; |
| A.n = B.n+1 + C.n+1; |
| }else{ |
| std::cout << "divide by zero" << std::endl; |
| } |
| } /* end of DIVIDE */ |
| expr(A) ::= NUM(B). { A.value = B.value; A.n = B.n+1; } |
| |