本文是浙江大學出版社的《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!\n"); exit(1); } 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 != 0) { 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, 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