新手寫tokenize和parser建議使用lex和yacc嗎?藍色2018-05-27 18:58:10

看你的目的和重點是什麼,如果想了解一下編譯器前端如何工作,手寫一下挺不錯的。如果是想做整個編譯器,而且重點在後面最佳化,可以用工具。

新手寫tokenize和parser建議使用lex和yacc嗎?brambles2018-05-28 00:04:04

如果你想造一門“程式語言”,那麼不要浪費時間在前端上,Parser 是難點但卻不是重點。所以學好基礎,然後儘量去使用工具(基礎不好你是用不好這些工具的…)

除非你你的目的只是單純的學習 Parser,那麼我建議你去造一個簡易的 LR Parser Generator 比較靠譜,比如 Lex 和 Yacc 就是…

順便推薦我自己的文章

brambles:前端要以正確的姿勢學習編譯原理(上篇)

新手寫tokenize和parser建議使用lex和yacc嗎?菜鳥天堂2018-05-28 12:45:58

感覺憑我的經驗,新手造玩具編譯器的時候最好先用現成工具。因為如果完整地寫過編譯器的話,就會發現這個過程要操心的事情挺多的,而如果只是寫著玩玩的話估計自己也不會gen太多資料對每一部分進行測試,要是tokenizer或者parser的bug傳到最後,那真的是調到吐血也很難檢查出來。所以感覺初體驗最好還是用工具把前端搞掉,然後再一點點自己造輪子。

不過回到問題,新手寫tokenize和parser建議使用lex和yacc嗎?其實我更建議用ANTLR,因為它操作更加簡單,更加無腦(逃

新手寫tokenize和parser建議使用lex和yacc嗎?WljlKtpC6zCVXM2018-05-29 09:44:24

lex/yacc作為自底向上的parser generator,一個額外的好處在於可以更容易的定製error recovery。只要在特定的產生式上掛上鉤子,錯誤資訊幾乎可以想多漂亮有多漂亮,也可以透過定製恢復點,“帶傷”讓parser強行跑下去,獲得儘量豐富的診斷除錯資訊。如果你做的是學校的大作業,這有利於給助教留下良好的印象。

相反,手寫top-down parser的錯誤恢復可能會難一些,而且這種修改往往是侵入式的,各種SkipUntil()之類的函式混雜在邏輯中阻礙思路,遠比加一兩個production要容易出錯。

新手寫tokenize和parser建議使用lex和yacc嗎?知乎使用者2018-06-04 07:58:59

你擔心錯過了一些基本的知識:tokenize 就是把程式碼按照單詞和運算子(語言的最小單位)序列化。

parser 就是將這些最小單位組織成一個樹形結構。我正在做的專案,就是將程式碼按照語法,直接解析成語法樹。

這個步驟一旦完成, 很少修改,因為比較繁瑣,牽一髮動全身,所以也少人願意經常修改這個。這也造成一種語言一旦完成,語法變動很小的原因。

但語言的形式,程式設計師通常對它都充滿了期望:用更少的程式碼,表達更豐富的語義。