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

  • 相关阅读:
    Win7系统安装Centos7.0双系统(一)
    CentOS7安装Oracle 11g R2 详细过程——零基础
    分页整理
    文件压缩与挤压ZIP
    js阻止事件冒泡
    input上传图片
    ios web input 内边阴影
    JS中如何处理多个ajax并发请求?
    jquery的deferred使用详解
    HTTP常见状态码
  • 原文地址:https://www.cnblogs.com/zhhd/p/5414447.html
Copyright © 2011-2022 走看看