2012-12-26 56 views
10

如何與額外的解析器延長鏘的文件有一個特殊的文件結束,即我可以開發一個FrontendAction,說:「喂!我要與文件擴展名爲‘.lorem’的所有文件的關懷和返回一個抽象語法樹(clang::ASTContext?)「?如何用額外的解析器擴展Clang?

我讀過有關clang::FrontendActionclang::Parserclang::driver::Driver,但我一直無法弄清楚在何處以及如何我應該延伸鏘能夠有額外的解析器擴展編譯器(擴展當前解析器)。

+1

是您的類似於C/C++/Objective-C的擴展語言? Clang是這些語言的前端。如果我們想重新使用後端(優化等),我們只需要LLVM。 –

+0

該語言與Objective-C++(語義,而不是語法)類似。預處理器是一樣的。 – finnsson

+0

我對Clang不太瞭解。但是,那麼如何編譯到ObjC呢? –

回答

1

這裏有一些指針:

tools/clang/lib/Driver/Types.cpp

你有lookupTypeForExtension,決定了基於擴展編譯代碼的「類型」。例如,對於.m擴展它返回TY_ObjC。你也有isObjC謂詞,確定給定的類型是否屬於目標C.

至於語法分析器是如何知道它的解析的語言......它通過Preprocessor,其中有一個LangOptions成員都知道。後者在include/clang/Basic/LangOptions.def中定義了許多選項。例如,ObjC1ObjC2。這些在CompilerInvocation::setLangDefaults,最終會從CompilerInvocation::CreateFromArgs調用設置。

記住鐺驅動程序將調用鐺前端爲「子」,它傳遞額外的命令行參數。該驅動程序是兼容gcc的,前端可以看作是clang本身。

而且,恕我直言,這將是增加一個額外的解析器鐺噸的麻煩。雖然所有東西都是模塊化的,但需要做大量工作來創建並將所有東西捆綁在一起。如果您的語言擴展了ObjC,只需使用現有的解析器即可。如果你的語言完全不同,那麼叮噹對你來說可能不是一個好選擇。