zoukankan      html  css  js  c++  java
  • 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!
    ");
      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

  • 相关阅读:
    十四行诗 Sonnet 15
    P3386 【模板】二分图匹配
    20171105模拟题
    需要注意的各种各种 持续更新
    P1315 观光公交 贪心
    【搬家辣】
    【洛谷P2387】魔法森林
    【洛谷P3369】普通平衡树(splay)
    【算法详解】splay的初步了解
    研究性学习代码
  • 原文地址:https://www.cnblogs.com/zhhd/p/5414447.html
Copyright © 2011-2022 走看看