2015-10-07 62 views
4

我在Windows上,使用MSVC編譯我的項目,但我需要鏗鏘其整齊的AST解析器,這讓我寫一個小代碼生成器。
問題是,鏗鏘聲不能解析MSVC標題(一個衆所周知的和可以理解的問題)。忽略俚語AST解析器丟失的標題

我嘗試了兩種選擇:

  1. 我包括MSVC頭文件夾,解析內置頭包含在我的代碼將結束行動導致致命的錯誤在某些時候,阻止我解析部分我想要正確。
  2. 我之前做的是根本不提供任何內置的頭文件,並向前聲明我需要的類型。它運行良好,不知何故,它不再與最新的Clang。我不知道解析器策略是否發生了錯誤標題,但是每次包含<string>之類的東西都會導致完全失敗,並且沒有太多解析。

我正在使用python綁定(libclang),但我會考慮切換到C/C++ API,如果那裏會有解決方案的話。

是否有反正我可以改變這種行爲,並使鐺繼續解析,即使當找不到一些標題?

+0

想要了解*可以解析MS標頭的解決方案嗎? –

+0

任何解決方案,使這項工作是的! – N0vember

回答

0

所以你想要處理使用MS頭的C++代碼,並且你想要訪問AST以便生成代碼。 Clang不會處理MS頭文件。 所以Clang不能成爲答案,除非得到徹底的升級。

你問過「任何可以使這項工作的解決方案」。

我們的DMS Software Reengineering Tookit及其C++14 Front End可以做到這一點。

DMS提供了通用解析,AST構建/檢測/轉換/生成以及反向解析(將AST轉換回可編譯代碼),並由語言定義進行參數化。

C++前端提供了完整的C++ 14解析器,預處理器處理,AST構造以及全名和類型解析。已經使用GCC和MS VS 2013頭文件進行了測試;我們現在正在使用2015頭文件進行測試。 (它也處理MS VS 2013語法)。

它完全處理了嚴格的解析案例,包括C++着名的「最令人頭疼的解析」。你可以在get human readable AST from c++ code看到解析樹。

DMS不提供Python綁定,也不提供直接的C++接口。相反,它是一個獨立的工具,用於支持構建自定義工具(例如,您的「小代碼生成器」)。它有自己非常廣泛的一套內部API,以元編程語言PARLANSE編碼,這是類似LISP的語言。 DMS的其他方面通過使用詞法分析器,語法和轉換的DSL進行管理。見下文。

謹慎的一句話:任何可以處理C++的工具都應該是複雜的。 DMS相當複雜,學習使用它需要一段時間,所以你不會得到即時答案。這裏的好消息是 是有些事情更容易做到。您的代碼生成問題 很可能是「讀取骨架文件,然後用問題特定代碼替換其中的關鍵條目」。如果是這樣的情況下,DMS工具用下面的代碼(簡化演示這裏)可能會做的伎倆:

... 
    (= myAST (Registry:ParseFile (. filename) (. `CppVisualStudio2013') ...) 
    (Registry:ApplyTransforms myAST (. `MyTransforms.rsl')) 
    (Registry:PrettyPrint myAST (concat filename `.modified')) 
    ... 

轉換文件MyTransforms.rsl含源到源表面 - 語法(如C++語法)的概念形式

 rule rulename if_you_see THIS then replace_by ("-->") THAT 

一個實際的C++規則的轉換規則可能看起來像(使這件事,因爲我不知道 您的實際代碼生成目標)

 rule replace_abstraction(s: STRING_LITERAL): 
     " abstraction_place_holder(\s) " 
    -> " my_DSL_library(\s,17); " 

上面的ApplyTransforms調用將應用全部該文件中的規則,直到沒有進一步應用爲止。

書寫表面語法轉換,你可以做到這一點,比在過程庫上調用(比如Clang,DMS提供的)在樹上的調用要容易得多。

您可以使用PARLANSE編寫更復雜的元程序,以便在一個地方應用一些規則,其他規則在其他地方應用,您可以將源到源轉換與程序轉換混合,直接在樹上進行轉義。

如果您想了解有關轉換效果的更多詳細信息,請詢問我將提供的鏈接。