構建自己的編譯器(二)語法分析器

2021-10-02 09:53:58 字數 1445 閱讀 2709

用來描述計算機語言語法的符號集。現在,幾乎每一位新程式語言書籍的作者都使用巴科斯正規化來定義程式語言的語法規則。

擴充套件巴科斯-瑙爾正規化(ebnf)是表達作為描述計算機程式語言和形式語言的正規方式的上下文無關文法的元語法符號表示法。它是基本巴科斯正規化(bnf)元語法符號表示法的一種擴充套件。

**,如由終結符即可視字元、數字、標點符號、空白字元等組成的電腦程式的源**。

ebnf 定義了把各符號串行分別指派到非終結符的產生規則:

digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;

digit = "0" | digit excluding zero ;

這個產生規則定義了在這個指派的左端的非終結符 digit。豎槓表示可供選擇,而終結符被引號包圍,最後跟著分號作為終止字元。所以 digit 是乙個0或可以是1 或2 或 3 直到 9 的乙個 digit excluding zero。

產生規則還可以包括由逗號分隔的一串行終結符或非終結符:

twelve = "1" , "2" ; two hundred one = "2" , "0" , "1" ; three hundred twelve = "3" , twelve ; twelve thousand two hundred one = twelve , two hundred one ;

可以省略或重複的表示式可以通過花括號 表示:

natural number = ;

在這種情況下,字串 ', ', ...,'1',...,'1234',... 都是正確的表示式。要表示這種情況,於花括號內設立的所有東西可以重複任何次,包括根本不出現。

可選項可以通過方括號 [...] 表示:

integer ="0" | ["-"] natural number ;

所以 integer 是乙個零(')或可能前導可選的負號的乙個自然數。

ebnf 還包括描述指定次數的重複,和排除產生式的某部分或向 ebnf 文法插入注釋的語法。

好,那麼,語法編譯器究竟怎麼運作的呢?它是按照一條語句一條語句地進行編譯,也就是說,token必須歸納成為乙個語句。

如何歸納成語句?就是應該在詞法編譯器中實現,遞迴實現。那麼怎麼歸納呢?

我們既然能歸結出句子,就會要斷句,而斷句,是自己實現的,最後歸結為乙個大token,就是這個大token進行下一步的語法編譯。

而這個大token,是定義語句,賦值語句,條件語句,迴圈語句中的一種。

我們如何形成這麼乙個大token呢?或者說,這個大token就是乙個語法樹。這個語法樹,各個階層的都有其屬性,我們就是通過這些屬性,從而獲得整條語句的屬性。那麼這個屬性如何獲得呢?就是語法樹的難點,從終結符歸納為非終結符的過程中,是可以對上層非終結符進行賦值的,而每條語句總會有特殊的地方對吧,就是在那一步歸納的時候,進行賦值。這樣我們的語法樹就構建起來了,語法樹構建起來了,我們就可以實現三位址碼了。

編譯原理語法分析器

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

編譯原理 語法分析器

當乙個文法滿足ll 1 條件時,我們就可以為它構造乙個不帶回溯的自上而下分析程式,這個分析程式是由一組遞迴過程組成的,每個過程對應文法的乙個非終結符。這樣的乙個分析程式成為遞迴下降分析器。例 乙個支援 的簡單文法為 用 表示空字元 e te e te t ft t ft f e i 編譯原理 第三版...

自己動手開發編譯器(七)遞迴下降的語法分析器

上回我們說到語法分析使用的上下文無關語言,以及描述上下文無關文法的產生式 產生式推導和語法分析樹等概念。今天我們就來討論實際編寫語法分析器的方法。今天介紹的這種方法叫做遞迴下降 recursive descent 法,這是一種適合手寫語法編譯器的方法,且非常簡單。遞迴下降法對語言所用的文法有一些限制...