2012-12-26 17 views
10

Özel bir dosya biti olan dosyalar için ek bir ayrıştırıcı ile Clang'ı nasıl uzatabilirim, yani "Hey! '.lorem' biten dosyayla tüm dosyalara bakacağım ve bir özet döndürecek bir FrontendAction geliştirebilir miyim? sözdizimi ağacı (clang::ASTContext?) "?Clang başka bir ayrıştırıcıyla nasıl genişletilir?

Ben yaklaşık clang::FrontendAction, clang::Parser ve clang::driver::Driver okudum ama nerede ve geçerli ayrıştırıcı uzanan (ek ayrıştırıcı ile derleyici uzatmak mümkün clang uzatmak değil gerektiğini anlamaya edemedik).

+1

Genişletilmiş diliniz C/C++/Objective-C'ye benzer mi? Clang bu tür dillerin önüdür. Arka ucunu (optimizasyon vb.) Tekrar kullanmak istiyorsak, sadece LLVM'ye ihtiyacımız var. –

+0

Dil, Objective-C++ (söz dizimi değil, semantik) ile benzer olacaktır. Önişlemci aynıdır. – finnsson

+0

Clang hakkında fazla bir şey bilmiyorum. Peki o zaman ObjC'ye nasıl yazılır? –

cevap

1

İşte bazı noktalar şunlardır: tools/clang/lib/Driver/Types.cpp yılında

Eğer lookupTypeForExtension var ki uzantısı dayalı derlenen kodun "type" belirler. Örneğin, .m uzantısı için TY_ObjC döndürür. Ayrıca verilen tip çözümleyici bir LangOptions üyesi var Preprocessor yoluyla bilir ... ayrıştırma o kanalın hangi dili bildiğini gelince Amaç C.

ait olup olmadığını belirler isObjC yüklemi var. İkincisi include/clang/Basic/LangOptions.def'da tanımlanan birçok seçeneğe sahiptir. Örneğin, ObjC1 ve ObjC2. Bunlar 'da ayarlanır ve sonunda CompilerInvocation::CreateFromArgs'dan çağrılır.

Clang sürücüsünün clang ön ucunu ek komut satırı argümanlarından geçirerek "alt işlem" olarak çağırdığını unutmayın. Sürücü gcc uyumlu ve ön clang kendisi olarak görülebilir. Ayrıca IMHO, argoya fazladan ayrıştırıcı eklemede çok fazla sorun olacaktır. Her şey modüler olsa da, her şeyi bir araya getirmek ve birleştirmek için çok fazla iş yapılmalıdır. Diliniz ObjC'yi genişletiyorsa, mevcut ayrıştırıcıyı kullanın. Eğer dil tamamen farklı bir şey ise, o zaman clang sizin için iyi bir seçenek olmayabilir.

İlgili konular