淺談SQLite:淺析Lemon

來源:互聯網
上載者:User

1、概述

Lemon是一個LALR(1)文法分析器產生工具。雖然它是SQLite作者針對SQLite 寫的一個分析器產生工具,但是它與bison和yacc類似,是一個可以獨立於 SQLite使用的開源的分析器產生工具。而且它使用與yacc(bison)不同的文法規 則,可以減少編程時出現錯誤的機會。Lemon比yacc和bison更精緻、更快,而且 是可重新進入的,也是安全執行緒的——這對於支援多線程的程式是非常重要的。

Lemon的主要功能就是根據上下文無關文法(CFG),產生支援該文法的分析器 。程式的輸入檔案有兩個:

(1) 文法規則檔案;

(2) 分析器模板檔案。

一般來說,文法規則是由程式員定義的;Lemon有一個適用於大多數應用程式 的預設分析器模板。根據命令列選項,Lemon會產生以下一些檔案:

(1) 分析器的C代碼;

(2) 一個為每個終結符定義一個整型ID的標頭檔;

(3) 一個描述分析器狀態的檔案。

文法規範檔案以”.y”為尾碼,如果文法規範檔案為”gram.y”,則可以使 用如下命令產生分析器:

lemon gram.y

1.1、分析器介面

Lemon不會產生一個完整的、可以啟動並執行程式。它僅僅產生一些實現分析器的 子常式,然後由使用者程式在適當的地方調用這些子常式,從而產生一個完整的分 析器。

1.1.1、ParseAlloc

程式在使用Lemon產生的分析器之前,必須建立一個分析器。如下:

void *pParser = ParseAlloc( malloc );

ParseAlloc為分析器分配空間,然後初始化它,返回一個指向分析器的指標 。SQLite對應的函數為:

void *sqlite3ParserAlloc(void *(*mallocProc)(size_t))

函數的參數為一個函數指標,並在函數內調用該指標指向的函數。如:

代碼

void *sqlite3ParserAlloc(void *(*mallocProc)(size_t)){
   yyParser *pParser;
   pParser = (yyParser*)(*mallocProc)( (size_t)sizeof(yyParser)  );
   if( pParser ){
     pParser->yyidx = -1;
#ifdef YYTRACKMAXSTACKDEPTH
     pParser->yyidxMax = 0;
#endif
#if YYSTACKDEPTH<=0
     pParser->yystack = NULL;
     pParser->yystksz = 0;
     yyGrowStack(pParser);
#endif
   }
   return pParser;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.