2014-10-28 88 views
1

我正在嘗試編寫一個可以分析混合語言並生成AST的解析器。我首先嚐試從頭開始在Java中從頭開始構建它,並且失敗了,因爲對於Parser初學者來說,這是一個相當困難的話題。然後我Google搜索並找到了http://www2.cs.tum.edu/projects/cup/examples.php和JFlex。編寫混合語言解析器

現在的問題是:什麼是最好的辦法呢?

例如我有一個Codefile,它包含幾個標籤,JS代碼和一些$ CMS_SET(x,y)$代碼。解決這個問題的最好方法是爲CUP中所有這些東西定義一個語法,並讓CUP根據我的語法生成一個Parser,這個語法可以分析那些混合的語言文件並生成它的AST樹?

感謝所有有幫助的答案。 :)

編輯:我需要做的是在Java中...

回答

4

這個主題是相當困難,即使在這方面的專家,我認爲自己是;檢查我的生物。

第一個問題是爲每種子語言構建單獨的解析器。你會發現的第一件事是爲特定語言定義解析器實際上很難;您可以閱讀「我可以得到X的解析器」或「我該如何修復X的解析器」的SO請求的無盡列表。大多數情況下,我認爲這些要求最終不會去任何地方;解析引擎不是很好,你必須扭曲語法和解析器,使它們能夠在真正的語言上工作,沒有任何「純HTML」的東西,標準文檔不同意,並且你的客戶總是有一些轉折在他沒有準備好的代碼中。最後還有與字符集編碼有關的故障,換行符的變化以及預處理器使解析分析問題複雜化。 C++預處理器比你想象的複雜得多,你必須擁有這個權利。解決這個問題的最簡單方法是找到一些語言已經預定義的解析器生成器。 ANTLR對於現在已棄用的ANTLR3有一大堆;沒有保證這些解析器是強大的,更不用說爲了您的目的兼容。

CUP不是特別有用的解析器生成器; LL(x)或LALR(x)解析器生成器都不是真正有用的,因爲沒有真正的語言匹配它們可以解析的東西的類別。結果是:無休止的請求(在SO!上)幫助「解決我的轉換 - 減少衝突」或「消除右遞歸」。唯一經歷了時間考驗的解析器生成器恕我直言是一個GLR解析器生成器(我聽到關於GLL的好消息,但那是相當新的)。我們使用一個完成了40多種語言GLR解析器生成器,包括生產IBM COBOL,完整的C++ 14和Java8。

你的第二個問題是建立AST。您可以手動編寫AST構建過程,但當您必須經常更改語法並且/或者您正在有效地考慮許多語法時,該過程會變得很快。你可以用汗水打敗你。 (我們選擇推動the problem of building ASTs into the parser,所以我們不必在構建語法時投入任何精力;爲此,您的解析器引擎必須爲您提供此幫助,而且沒有任何主流解決方案能夠實現這一點)。

現在你需要編寫解析器。當需求出現時,你需要有一個調用另一個;當然,你選擇的解析器並不是爲了做到這一點而設計的,所以你必須扭轉它。第一個難題是爲解析器提供一些線索,使得輸入流中出現子語言,並將解析結果交給子高級語法分析器,並讓它將樹傳回到父解析器的樹中,大概帶有某種標記,這樣你就可以知道樹中不同sublangauges之間的轉換。你通常可以通過竊聽一個語言的詞法分析器來做到這一點,當它看到線索時,調用另一個語言的詞法分析器;但那麼你對它返回的樹做了什麼?沒有辦法將該樹交給當前解析器並說「集成這個」。你可以通過修改解析機制來解決這個問題。

但是,以上所有問題都不是問題所在。

解析不方便,但只有一小部分你需要以任何有趣的方式分析你的程序;您需要符號表,控制和數據流分析,也許需要進行點對點分析,並且對這些進行工程設計將會擴大上述工作。請參閱我關於「解析後的生活」(google或通過我的博客)的文章,瞭解您還需要什麼。

簡而言之,我認爲你在「解析」中咬了一大筆任務,甚至沒有告訴我們你打算如何處理結果。歡迎你開始走這條道路,但很少人成功;我的團隊花費了50多年的博士水平工程學來獲得我們的位置,而我們很難完成。

Java不會讓解決方案變得更容易或更難;你解決上述所有問題的語言是無關緊要的。

+0

感謝您的相當詳細的答案。我想解析不同語言代碼的混合,以便能夠正確自動配置它。因此,通過將它解析爲AST,我可以輕鬆地通過它的級別*選項卡縮進每個節點來格式化它。此外,因爲我是一名醫學信息學學生(單身漢),並且在我的第三學期感到無聊,所以我想用它來真正學到一些東西。這個小項目的最終目標是擁有一個解析器,它可以檢測每個CodeNode並將其解析爲獨立於混合語言的樹。之後,我可以很容易地格式化。 – Shiuyin 2014-10-28 19:34:28

+0

我沒有任何解析器的經驗,但我想了解更多。正如我所說,我嘗試自己做,並在Java中寫了一個「Parser」,它能夠處理類型爲的簡單標籤,但不能做更多的事情。 – Shiuyin 2014-10-28 19:35:20

+0

如果你的* only *目標是格式化的,那麼你就沒有解析後的生活問題。您仍然有定義和編寫解析器的問題。如果您想了解「自動成型」,請參閱http://stackoverflow.com/a/5834775/120163 – 2014-10-28 22:39:20