SQLite Lemon 语法分析器学习与使用

时间:2022-11-18 10:25:20

本文是浙江大学出版社的《LEMON语法分析生成器(LALR 1类型)源代码情景分析》学习笔记。

用到的Windows下的编译器介绍MinGW(http://www.mingw.org/):
一个可*使用和*发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时库。

Lemon是SQLite作者开发的用于SQLite数据库语法分析的分析器,线程安全可重入,源码可以从SQLite官网完整的代码包获取。

SQLite Lemon 语法分析器学习与使用

编译出来Windows下的可执行程序lemon.exe:

SQLite Lemon 语法分析器学习与使用

按部就班,码代出语法代码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!\n");
exit();
} program ::= expr(A). { printf("Result = %d\n",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 != ) {
A = B / C;
} else {
printf("Divide by zero!\n");
}
} expr(A) ::= INTEGER(B). { A = B;} %code {
int main() {
void* pParser = ParseAlloc(malloc);
Parse(pParser, INTEGER, );
Parse(pParser, PLUS , );
Parse(pParser, INTEGER, );
Parse(pParser, , );
ParseFree(pParser, free);
}
}

用语法分析器生成C代码2_1.c, 2_1.h, 2_1.out:

SQLite Lemon 语法分析器学习与使用

把C代码编译成可执行程序并执行:

SQLite Lemon 语法分析器学习与使用

OK!史上最简陋的计算器诞生了!

备注:aHR0cCUzQS8vd3d3LmNuYmxvZ3MuY29tL3poaGQv