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

  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/zhhd/p/5414447.html
Copyright © 2011-2022 走看看