現在的編譯前端技術還是用NFA和遞歸下降實現lexer和parser嗎?

最新的前端編譯技術還是使用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 的語言一經問世便佔據統治地位?

TAG:編程語言 | 編程 | 編譯器 | 編程技術 | 計算機語言 |