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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM