本文是浙江大学出版社的《LEMON语法分析生成器(LALR 1类型)源代码情景分析》学习笔记。
用到的Windows下的编译器介绍MinGW(http://www.mingw.org/):
一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时库。
Lemon是SQLite作者开发的用于SQLite数据库语法分析的分析器,线程安全可重入,源码可以从SQLite官网完整的代码包获取。
编译出来Windows下的可执行程序lemon.exe:
按部就班,码代出语法代码2_1.y:
%include { #include<stdio.h> #include<stdlib.h> #include<assert.h> #include "2_1.h" } %token_type { int } %left PLUS MINUS. %left DIVIDE TIMES. %syntax_error { printf("Syntax error! "); exit(1); } program ::= expr(A). { printf("Result = %d ",A);} 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 { printf("Divide by zero! "); } } expr(A) ::= INTEGER(B). { A = B;} %code { int main() { void* pParser = ParseAlloc(malloc); Parse(pParser, INTEGER, 1); Parse(pParser, PLUS , 0); Parse(pParser, INTEGER, 2); Parse(pParser, 0, 0); ParseFree(pParser, free); } }
用语法分析器生成C代码2_1.c, 2_1.h, 2_1.out:
把C代码编译成可执行程序并执行:
OK!史上最简陋的计算器诞生了!
备注:aHR0cCUzQS8vd3d3LmNuYmxvZ3MuY29tL3poaGQv