参考文献: http://souptonuts.sourceforge.net/readme_lemon_tutorial.html
像所有的入门教程一样,咱也写一个Hello World程序。
准备工作:先编译生成lemon,并把lempar.c源代码放在当前工作目录下。
第一个例子:
1、编写语法文件:
example.y
%token_type {int}
%left PLUS MINUS.
%left DIVIDE TIMES.
%include {
#include <iostream>
#include "example.h"
}
%syntax_error {
std::cout << "Syntax error!" << std::endl;
}
program ::= expr(A). { std::cout << "Result=" << A << std::endl; }
expr(A) ::= expr(B) MINUS expr(C). { A = B - C; }
expr(A) ::= expr(B) PLUS expr(C). { A = B + C; }
expr(A) ::= expr(B) TIMES expr(C). { A = B * C; }
expr(A) ::= expr(B) DIVIDE expr(C). {
if(C != 0){
A = B / C;
}else{
std::cout << "divide by zero" << std::endl;
}
} /* end of DIVIDE */
expr(A) ::= INTEGER(B). { A = B; }
2、然后利用lemon生成代码:
$lemon example.y
产生两个两个代码文件:example.c example.h
3、写头文件,避免每次编译都要重写源代码
LAPI.h
#ifndef __LAPI_H__
#define __LAPI_H__
#include “example.c”
#endif
4、主函数
main.c
#include “LAPI.h”
int main()
{
void* pParser = ParseAlloc (malloc);
/* First input:
15 / 5
*/
Parse (pParser, INTEGER, 15);
Parse (pParser, DIVIDE, 0);
Parse (pParser, INTEGER, 5);
Parse (pParser, 0, 0);
/* Second input:
50 + 125
*/
Parse (pParser, INTEGER, 50);
Parse (pParser, PLUS, 0);
Parse (pParser, INTEGER, 125);
Parse (pParser, 0, 0);
/* Third input:
50 * 125 + 125
*/
Parse (pParser, INTEGER, 50);
Parse (pParser, TIMES, 0);
Parse (pParser, INTEGER, 125);
Parse (pParser, PLUS, 0);
Parse (pParser, INTEGER, 125);
Parse (pParser, 0, 0);
ParseFree(pParser, free );
}
5、编译生成可执行程序
g++ main.c –o calc1
执行查看结果:
$./calc1
Result=3
Result=175
Result=6375