2012-12-26 6 views
10

Come posso estendere Clang con un parser aggiuntivo per i file con un file speciale che termina, cioè posso sviluppare un FrontendAction che dice "Ehi! Mi prenderò cura di tutti i file con il file che termina '.lorem' e restituirò un abstract albero di sintassi (clang::ASTContext?) "?Come estendere Clang con un parser aggiuntivo?

ho letto su clang::FrontendAction, clang::Parser e clang::driver::Driver, ma non sono stato in grado di capire dove e come devo estendo Clang per essere in grado di estendere il compilatore con un parser aggiuntivo (non estendere il parser corrente).

+1

La tua lingua estesa è simile a C/C++/Objective-C? Clang è il frontend per questi tipi di lingue. Se vogliamo riutilizzare il back-end (ottimizzazione, ecc.), Abbiamo solo bisogno di LLVM. –

+0

La lingua sarà simile a Objective-C++ (la semantica, non la sintassi). Il preprocessore è lo stesso. – finnsson

+0

Non so molto su Clang. Ma che ne dici di eseguire una traslazione su ObjC? –

risposta

1

Ecco alcune indicazioni:

in tools/clang/lib/Driver/Types.cpp avete lookupTypeForExtension, che determina il "tipo" del codice compilato in base all'estensione. Ad esempio, per l'estensione .m restituisce TY_ObjC. Hai anche la isObjC predicato che determina se il tipo di dato appartiene a Objective C.

Quanto a come il parser sa quale lingua è l'analisi ... E sa tramite il Preprocessor, che ha un membro LangOptions. Quest'ultimo ha molte opzioni definite in include/clang/Basic/LangOptions.def. Ad esempio, ObjC1 e ObjC2. Questi sono impostati in CompilerInvocation::setLangDefaults, che alla fine viene richiamato da CompilerInvocation::CreateFromArgs.

Ricordare che il driver clang invocherà il frontend clang come un "sottoprocesso", passandogli ulteriori argomenti della riga di comando. Il driver è compatibile con gcc e il frontend può essere visto come clang stesso.

Inoltre, IMHO sarebbe un sacco di problemi aggiungendo un parser extra a clang. Mentre tutto è modulare, è necessario molto lavoro per creare e legare tutto insieme. Se la tua lingua estende ObjC, usa il parser esistente. Se la tua lingua è qualcosa di completamente diverso, allora clang potrebbe non essere una buona opzione per te.