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

本文是浙江大学出版社的《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

posted @ 2016-04-20 21:07  seebigsea  阅读(2426)  评论(63编辑  收藏  举报