寫語法分析器的感想

由於課程設計的需要,我要實現一個源代碼到四元式的翻譯程序,整個過程對我來說還是很有挑戰性的。

容易的部分就不說了,本來我就是用遞歸下降實現的,已經十分的直觀了(相對於SLR等自底向上的分析法),但是我在實現的過程中還是遇到了一些問題,最棘手的是

<expression>:=<term>{(+|-)<term>}

這樣的語句的分析,因爲只有<term>是符合文法的情況下才能繼續下去,然後我實現的時候就寫了一個int類型的term函數,每次判斷term是否返回正確的結果才繼續下一步分析,

我只能說It Works,但是讓卻給我一種累覺不愛的感覺,後來作業交上去了,但是仍然想學習一下編譯的過程,於是繼續看書,恩,就是經典的龍書,我發現書上有個十分好的方法,它使用一個match函數來判斷下一個單詞是否是所需要的,不是的話,直接退出程序,我一瞬間就感覺豁然開朗,立馬把我自己的代碼改寫了一下,這樣不僅實現起來輕鬆多了,而且可讀性也提高了不少,想起之前的做法,完全是刻板地遵守結構化編程的原則,結果卻丟失了結構化的優點。而像match這種類似於goto end的函數,雖然不符合結構化的原則,但是卻能大大提高工作效率和可讀性,這也讓我明白了爲什麼很多人吐槽C語言的goto,但是ISO仍然保留它,而Linux內核開發也大量使用的原因了。

後來我翻了一下教材,發現它的實現方法其實和龍書是類似的,但是上面的代碼排版噁心,函數變量不分,當時就讓我沒興趣看下去,這樣拙劣的教材竟然能在高校使用,真的讓我對高校的教材選用很失望。

每天埋頭寫代碼,不如抽些時間看看大師們的傑作,思考思考,站在巨人的肩膀上,我們才能看得更遠。

發佈了51 篇原創文章 · 獲贊 21 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章