LALR語法分析器

2021-07-09 16:36:45 字數 1762 閱讀 7929

lalr分析器

是一種規範lr分析方法的簡化形式。它可以對上下無關文法進行語法分析。

lalr即「l

ook-

ahead

lr」。其中,look-ahead為「向前看」,l代表對輸入進行從左到右的檢查,r代表反向構造出最右推導序列。 

lalr分析器

可以根據一種程式語言的正式語法的

產生式而對一段文字程式輸入進行

語法分析

,從而在語法層面上判斷輸入程式是否合法。 實際應用中的lalr分析器並不是由人手工寫成的,而是由類似於

yacc

和gnu bison

之類的lalr語法分析器生成工具構成。由機器自動生成的**相比較於程式設計師手工的**,擁有更好的執行效率而且減少了程式設計師的工作量.

lemon語法分析生成器

lemon是乙個c或者c++語言的lalr(1)語法分析器生成器。它和「bison」與「yacc」的功能是一樣的,但它不是「bison」或者「yacc」的簡單複製。為了減少編寫**的錯誤,它使用了一種不同的語法。lemon使用了一種更為高階的分析引擎,執行速度比「bison」與「yacc」要更快,並且該引擎是可重入的和執行緒安全的。更進一步的,lemon實現了能夠消除資源洩漏的特性,適合於長時間執行的程式例如gui或者嵌入式控制器中。

在unix領域,很多人對lex和yacc可能比較熟悉。通過搭配使用這兩個工具,可以構造出非常複雜的詞法和語法分析程式。lemon是乙個類似於yacc的lalr(1)語法分析器,相對於yacc,它具有如下優勢:

lemon使用了一套不同於yacc的語法,這套語法更不容易產生程式設計錯誤;

lemon生成的解析器是可重入和執行緒安全的;

lemon引入了非終結符析構器的概念,使得寫乙個不會產生記憶體洩漏的解析器更容易。

眾所周知的sqlite的語法分析就是用lemon生成的。關於lemon的詳細資訊,可見本文的參考資料部分。這裡引入乙個lemon入門教程,供感興趣的同學參考,本教程來自

下面是對lemon語法分析生成器的乙個簡介。

操作的原理

lemon的主要目標是把乙個特定語言的上下文無關文法(cfg)翻譯成c語言實現的該語言的語法分析器。程式有兩個輸入:

語法規範

分析器模板檔案

典型的,程式設計師只需提供語法規範即可。lemon自帶了乙個語法分析器模板,這對大多數的應用足夠了。如果需要的話,使用者可以替換乙個新的分析器模板檔案。

根據命令列引數,lemon會產生下面檔案中的乙個到三個:

分析器的c語言**;

乙個標頭檔案,為每個終結符定義了乙個整型id;

描述產生的語法分析器的狀態的資訊檔案。

預設情況下,上面的三個檔案都會產生。如果使用了「-m」選項,則不會產生標頭檔案;如果使用「-q」選項,資訊檔案則不會產生。

語法規範檔案是乙個以「.y」為字尾的檔案。在文件的例子中,設定規範檔案的名稱是「gram.y」。典型的使用方式是:

lemon gram.y

上面的命令會產生「gram.c」、「gram.h」、「gram.out」三個檔案。第乙個就是語法分析器,第二個就是為所有的終結符定義了數值的標頭檔案,最後乙個是分析器使用的狀態自動機的說明。

完整的源**包含在兩個檔案中,lemon.c

本身就是產生器本身。乙個單獨的檔案lempar.c

是lemon產生語法分析子程式需要的模板檔案。也可獲取lemon的有關文件

。乙個如何使用lemon的例子,可以參見sqlite

資料庫引擎。lemon作為sqlite專案的一部分維護。

關於lemon的乙個指南:

LR 語法分析器

lr語法分析器算是基本完成了,只需要乙個文法定義檔案 syntax 就可以進行對應語言的語法分析,最後形成語法樹。詞法分析是固定的,採用c 的詞法定義。以後將加入動態的詞法分析。壓縮包中檔案的描述 lrtable.exe 是用文法定義檔案 syntax檔案 生成lr動作表檔案 action檔案 使用...

LR語法分析器程式設計

include include include include struct code val const char p const char tnt i etf lr分析表列的字元 const int m 9 0表示出錯,s4用4表示。acc用99表示 r2用 2表示 int col char 列...

編譯原理語法分析器

採用至少一種句法分析技術 ll 1 slr 1 lr 1 或lalr 1 對類高階語言中的基本語句進行句法分析。闡述句法分析系統所要完成的功能。1 能識別以下幾類語句 宣告語句 包括變數宣告 陣列宣告 記錄宣告和過程宣告 表示式及賦值語句 包括陣列元素的引用和賦值 分支語句 if then else...