現在的編譯前端技術還是用NFA和遞歸下降實現lexer和parser嗎?
01-14
最新的前端編譯技術還是使用Lex/yacc裡面的實現原理嗎?另外這種用自動狀態機進行語法分析的方法是上個世紀出現的,現在有更好的方法嗎?
題主的問題不太容易回答。
最新的前端編譯技術還是使用Lex/yacc裡面的實現原理嗎?
如果改為:
最新出現的主流編譯器前端還是使用Lex/yacc裡面的實現原理嗎?
那答案會是:很多很多大家平時常用的編譯器的前端時至今日都還是手寫的,所以連lex/yacc那種都不是,而更多是ad-hoc的手寫lexer以及遞歸下降+運算符優先順序的手寫parser。這方面主流並沒有特別積極的跟進技術的發展…就像現在還堅持用全手動檔的車的感覺類似。
然後當然也還有一些前端是用lex/yacc系的做法,例如Ruby的parser;或者是用ANTLR那樣的LL(*)的做法,例如Groovy的parser。(注意ANTLR的LL(*)不是給定k的LL(k)而比後者更強,因為其lookahead允許無限多,本質上跟PEG類似)如果改為:
最新的理論編譯技術的前端還是使用Lex/yacc裡面的實現原理嗎?
那答案會是:當然不是,早就不是了。
就像 @vczh 的回答說的,語法分析上,自底向上方面其實GLR系的演算法早就有了,實現上也越來越好,早就比yacc/bison用的LALR(1)好。而自頂向下方面在2000後也有 PEG、LL(*) (ANTLRv3)和 ALL(*) (ANTLRv4)的發展,頗有搶回地盤的趨勢。流行的另說,不過如果個人造輪子,用腳本手寫最方便,好維護,比如我的https://github.com/larva-lang/larva-lang
一般來說,為了手寫編譯器好寫,我們都把本來可以用General LR無腦輕鬆解決的問題,做成超級複雜的、針對語法二義性的、基本沒法用lex/yacc無痛寫出來的一大堆規則,然後寫進標準文檔里,你就可以用不同的語言手寫很多遍parser了。
推薦閱讀:
※有什麼可以用raspberry pi做的或者實現的有趣的/有用東西?
※C#有沒有什麼比較好的入門類書籍,能夠闡明c#的思想以及基本語法,適合初學者上手?
※如何從C++過渡到C#?
※完成一個Scheme解釋器需要哪些知識?實現各功能都有哪些東西需要理解?
※既然 Lisp 以及基於此的語言好到不行,為什麼基於 C 的語言一經問世便佔據統治地位?