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.
fonte
2013-01-06 14:01:58
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. –
La lingua sarà simile a Objective-C++ (la semantica, non la sintassi). Il preprocessore è lo stesso. – finnsson
Non so molto su Clang. Ma che ne dici di eseguire una traslazione su ObjC? –