編譯原理之路(三)遞迴下降的語法子程式設計

2021-09-14 04:17:00 字數 1390 閱讀 7188

要想設計語法解析器,我們必須首先設計一種子程式,能夠解析任何乙個產生式,比如對於

a->te』|bc|ϵ

\epsilon

ϵ 這樣的表示式,如果我們寫乙個程式來檢測他,應該怎麼辦呢?

procedure a;

begin

if sym in first(te') then

begin t;e' end

else if sym in first(bc) then

begin b;c end

else if sym in follow(a) them

begin end

else error

由**可以輕易理解,這是乙個判斷a的子程式,sym表示當前指標指向的字元,如果在te『中,就執行t e的子程式,在bc 中,就執行bc的子程式

如果在ϵ

\epsilon

ϵ中,也就是a為空,那麼直接跳過到下乙個字元,就等同於在follow(a)中

如果三者都不是,就會報錯

對於a的推導,一定是以上四種情況之一,執行完畢後,a推導完成

有趣的是,我們的語法是自頂向下遞迴的,但我們寫程式可以按自己的相符順序來寫。

以下是較複雜的文法的子程式設計(來自中國大學mooc國防科技大學的ppt,講得很不錯,推薦!)

advance指的是指標往前指向下乙個字元,比如在f的子程式設計中,如果sym指向了i或者),那麼f就推導完成,可以直接往下走了

下面圖中

左下角的程式是e的,比較簡單

右邊兩個程式,上面藍色背景部分是精簡版,和下面等價

綠字部分sym!=』#』 and sym!=』)『其實表示的就是不指向ϵ

\epsilon

ϵ的意思,

開頭已經解釋,所謂指向ϵ

\epsilon

ϵ就是指向自己的follow(),e』的follow()是』)『和』#』,因為指向ϵ

\epsilon

ϵ什麼都沒做,所以判定省略了,直接判定不指向ϵ

\epsilon

ϵ的情況,返回error,

接下來是判定t和t』的,同乙個模式,同乙個答案

最後是主程式

編譯原理實驗三 語法分析(遞迴下降法)

實驗任務 完成以下描述算術表示式的ll 1 文法的遞迴下降分析程式 g e e te e ate t ft t mft f e i a m 說明 終結符號i為使用者定義的簡單變數,即識別符號的定義。設計要求 1 輸入串應是詞法分析的輸出二元式序列,即某算術表示式 實驗專案一 的輸出結果。輸出為輸入串...

編譯原理實驗(三) 遞迴下降子程式

對文法中的每個非終結符 語法成分 編寫乙個子程式,而子程式的 結構由相應非終結符的產生式右部所決定 文法 g e e e t t t t f f f e i 消除左遞迴 g e e te e te t ft t ft f e i 可以通過g e 文法構造遞迴下降分析器 文法g e 無左遞迴,e t ...

編譯原理 實驗2 遞迴下降語法分析程式設計

實驗要求 1 待分析的簡單語言的詞法同實驗1 2 待分析的簡單語言的語法 用擴充的bnf表示如下 1 程式 begin 語句串 end 2 語句串 語句 3 語句 賦值語句 4 賦值語句 id 表示式 5 表示式 項 6 項 因子 7 因子 id num 表示式 3 語法分析程式的功能 輸入單詞串以...