要想設計語法解析器,我們必須首先設計一種子程式,能夠解析任何乙個產生式,比如對於
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 語法分析程式的功能 輸入單詞串以...