2013-05-13 65 views
11

大約每年一次,我必須開發或至少設計一個語法和解析器 - 這似乎是我工作生活中的一個常量。每當我面對這項任務時,因此大概一年,我,相當一個lex/yacc(flex/bison resp。)的人,考慮或重新考慮lex/yacc的替代品,並且在一些思考和嘗試我回到普通的lex/yacc。使用lex/yacc替代品的原因是什麼?

因爲我已經在應用的樞紐CORBA服務器,我可以從寫在幾乎每一種語言解析器調用,所以這個時候我看了一下

  • antlr4(JAVA)和antlr3(Java,但有RT其他語言),
  • SableCC(渣),
  • 解析:: EBNF,解析::亞普和馬爾巴(Perl的),
  • 和SimpleParse是(蟒蛇),

對我來說,antlrworks的串聯antlr4看起來是最有希望的候選人,但我還不確信花在花費上的時間最終會被攤銷。


我要開發的語法類似於SQL DDL(在結構方面,而不是在主題方面)。

爲什麼任何替代方案都會使我的任務比使用普通的lex/yacc更容易?

+0

我認爲這是一個像「我應該使用哪種編程語言」這樣的問題,這不太可能吸引SO促進的事實上的客觀答案。因此投票結束時不具有建設性。然而,你面臨的問題是:你覺得lex/flex/yacc/bison不能令你滿意嗎?那至少會給你一個關於要尋找什麼功能的線索。如果它只是「我想嘗試新的東西」,那麼翻轉一枚硬幣:) – rici 2013-05-13 16:02:48

+0

它不具有可比性。如果所有的生成器都會生成相同的解析器,我會同意,但取決於解析器生成器,結果是完全不同的。 – 2013-05-14 12:42:51

回答

9

你還應該考慮的是不同的解析器生成器生成完全不同的解析器。 Yacc/bison生成自下而上的解析器,這些解析器通常很難理解,難以調試並給出奇怪的錯誤消息。例如,ANTLR生成一個遞歸下降自頂向下的分析器,它很容易理解,你可以很容易地調試它(除非你像我這樣有一個35MB的詞法分析器),你只能使用子規則進行分析操作(例如,解析表達式而不是完整的語言)。

此外,它的錯誤恢復更好,併產生很多更乾淨的錯誤。 ANTLRWorks是一款優秀的跨平臺應用程序,用於開發和調試語法(只有在使用Java目標時才進行調試)。 Apropros的目標是:除非你的語法中有語言特定的動作(你已經在你的問題中提到了這一點),否則你可以用同樣的語法生成不同語言的解析器(C,C++,C#,Java等等)。當我們談到動作時:由於底層語法分析器中的評估原則(移位令牌,移位令牌,將它們減少爲新的令牌並移動它等等),動作很容易在那裏引起麻煩,執行不止一次等。 ANTLR生成的解析器並非如此。

我也嘗試了多年來的各種解析器生成器,甚至寫了我自己的,但我會隨時推薦ANTLR作爲選擇的工具。

+0

優秀的答案,非常感謝。 – Solkar 2013-05-14 13:02:28

5

latest Marpa is Marpa::R2,它在「whipituptude」中有很大的改進,包括a very convenient new DSL interface,它本身寫在Marpa中。你可以考慮從Marpa開始,進行「原型設計」。馬爾帕是高度聲明性的,使用乾淨的BNF。如果你遷移出去,你可以將大部分工作交給新的解析器。 Marpa在錯誤處理和檢測方面是無與倫比的,在原型設計階段也非常方便。

Marpa解析由線性時間列出的其他解析器解析的所有語法類,它的靈活性無與倫比。它的最新功能允許您從Marpa來回切換到您自己的解析代碼。所以你甚至可以留下來。有a website,我的博客有a series of tutorials,這可能是引入Marpa的最佳方式。

+0

Thx爲您的深入答覆,Jeffrey! PLS。以SQL DDL爲例。爲什麼Marpa會比lex&yacc做得更好? – Solkar 2013-05-13 17:21:13

+0

隨着馬爾帕,你只需輸入BNF(amy BNF)並運行。有了yacc的經驗,你知道LALR並不那麼容易。 Marpa在任何時候都知道並能夠準確地報告解析的位置,從而使錯誤檢測,調試和維護變得更加容易。 – 2013-05-13 18:41:00

+0

Marpa當前的SQL(或子集)實現是專有的(可嘆),但是一個片段在測試套件中。 – 2013-05-13 18:48:15