2016-05-29 39 views
2

我需要爲C++ 14創建一個解析器。此解析器必須使用C++創建,以便實現遺留代碼生成重用。我正在考慮使用ANTLR3來實現這個功能(因爲ANTLR4還沒有針對C++代碼)。LL(*)解析器(如antlr3)可以解析C++嗎?

我的疑問是,如果ANTLR3可以解析C++,因爲它不使用像ANTLR4這樣的Adaptive LL(*)算法。

+0

*「我需要爲C++ 14創建解析器。」* ...爲什麼?另外,如果您真的需要這個,您是否探索LLVM及其功能? – Nawaz

+0

你確實意識到[C++的語法不受限制](http://stackoverflow.com/questions/14589346/is-c-context-free-or-context-sensitive),沒有上下文,對吧? – Cornstalks

+0

語法正確的輸入可能會產生無效的C++代碼:'void m(){m ++;}' – Rerito

回答

4

大多數傳統的解析器生成器不能生成解析器,該解析器將解析任意上下文無關語言的語法。它們可以解析的語法的限制經常引起解析器生成器類的名稱:LL(k),LALR,... ANTLR3基本上是LL; ANTLR4更好,但仍然沒有語境。

Earley,GLR和GLL解析器生成器可以解析上下文無關語言,有時成本很高。在實踐中,Earley往往會很慢(但可以看到用於Perl6的MARPA解析器生成器,我知道它是Earley變體,據稱其速度相當快)。 GLR和GLL似乎能夠生成具有合理性能的工作解析器。

我的公司已經爲使用GLR的實際語言構建了大約40個解析器,包括所有C++ 14,因此我對GLR的實用性有很大的信心。

當談到解析C++時,你完全處於另一個世界,主要是因爲C++解析似乎依賴於同時收集符號表信息。 (It isn't really necessary to do that if you can parse context-free).

如果你願意努力奮鬥,你也許可以讓ANTLR4(甚至ANTLR3)解析C++。基本上你所要做的就是構建一個解析器,它通常會由於解析器生成器類的限制而接受太多的,然後使用臨時方法去除額外的東西。這本質上是手寫的GCC和Clang解析器所做的;符號表信息用於強制解析器沿着正確的路徑。

如果您選擇構建自己的解析器的這個路徑,無論您選擇哪個解析器生成器,都會投入大量精力來獲得工作解析器。 [曾在這裏;做了這個]。這不是一個很好的方式來與任何你想要的任務激勵這個解析器。

我建議你得到一個已經工作。 (我已經列出了兩個,如果你願意的話,你可以通過我的生物瞭解我們的解析器)。

這將大概給你一個工作分析器。然後你想用分析樹來做一些事情,並且你會發現解析後的生活需要很多解析器不提供的機制。谷歌短語來找到我的論文關於這個話題或檢查我的生物。

+0

謝謝你艾拉巴克斯特。我使用Bison來解析C++,但它不能在解析過程中訪問語義謂詞中的子節點信息。 ANTLR啓用了這個功能,但是我最大的問題是解析算法LL(*)。我讀到,這具有無限的前瞻性。我正在考慮嘗試ANTLR。 –

+0

好吧,祝你好運。您是否真的考慮過取得成功所需的努力水平? –

+0

我認識到這將是一項艱苦的工作。但是,如果我取得成功,它將啓動一系列研究和源到源轉換。我的第一個目標是保存所有C++聲明並將這些信息用於語義謂詞以避免含糊不清。我已經有一個(幾乎)用於C++的工作解析器(使用Bison開發),但是這不處理含糊不清(當解析器不知道標識符是否是類型/聲明符等)。再次感謝您的回答,併爲糟糕的英語感到抱歉。 –