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;
}