所以你想要處理使用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編寫更復雜的元程序,以便在一個地方應用一些規則,其他規則在其他地方應用,您可以將源到源轉換與程序轉換混合,直接在樹上進行轉義。
如果您想了解有關轉換效果的更多詳細信息,請詢問我將提供的鏈接。
想要了解*可以解析MS標頭的解決方案嗎? –
任何解決方案,使這項工作是的! – N0vember