È possibile analizzare C++ con dichiarazioni incomplete con clang con la sua API libclang esistente? Cioè parsing .cpp file senza includere tutte le intestazioni, deducendo le dichiarazioni al volo. quindi, ad es. Il testo che segue:Clang per parsing fuzzy C++
A B::Foo(){return stuff();}
rileverà simbolo sconosciuto A, chiamare il mio callback che detrae A è una classe usando la mia magia euristica, quindi chiamare questo callback allo stesso modo con B e Foo e roba. Alla fine voglio essere in grado di dedurre che ho visto un membro Foo di classe B che restituisce A, e roba è una funzione .. O qualcosa del genere. Contesto : Voglio vedere se riesco a fare un'evidenziazione della sintassi ragionevole e l'analisi del codice senza analizzare tutte le intestazioni molto rapidamente.
[EDIT] Per chiarire, sto cercando un parsing C++ molto limitato, possibilmente con qualche euristico per rimuovere alcune delle restrizioni.
La grammatica C++ è piena di dipendenze del contesto. Foo() è una chiamata di funzione o una costruzione di un temporaneo di classe Foo? È Foo <Bar> roba; un modello Foo <Bar> istanza e dichiarazione di roba variabile, oppure è strano 2 chiamate all'operatore sovraccarico < e operatore>? È possibile solo raccontare nel contesto e il contesto spesso deriva dall'analisi delle intestazioni.
Quello che sto cercando è un modo per collegare le mie regole di convenzione personalizzate. Per esempio. So che non sovraccarico i simboli Win32, quindi posso tranquillamente supporre che CreateFile sia sempre una funzione,, e conosco persino la sua firma. So anche che tutte le mie classi iniziano con una maiuscola e sono sostantivi, e le funzioni sono di solito verbi, quindi posso ragionevolmente intuire che Foo e Bar sono nomi di classe. In uno scenario più complesso, so che non scrivo espressioni senza effetti collaterali come un < b> c; quindi posso supporre che a sia sempre un modello di istanziazione. E così via.
Quindi, la domanda è se sia possibile utilizzare l'API Clang per richiamare ogni volta che incontra un simbolo sconosciuto e dargli una risposta usando la mia euristica non-C++. Se il mio euristico fallisce, allora l'analisi fallisce, ovviamente. E non sto parlando di analizzare la libreria Boost :) Sto parlando di C++ molto semplice, probabilmente senza modelli, limitato a un minimo che in questo caso può essere gestito da clang.
È sempre possibile modificare direttamente CLang. Non sono sicuro di quanto sarebbe facile, dato che ci sono molte volte in cui la ricerca può determinare legalmente che non venga trovato nulla (ad es. Contesti dipendenti, ADL). –
Hai davvero bisogno di clang? Se no, forse ha senso provare altre soluzioni? Può succedere che funzionino meglio. –
Sì, ho guardato antlr, ed è fattibile, anche se sospetto che sarebbe più difficile e meno performante .. In effetti sto usando antlr per analizzare un C++ limitato, quindi mi sarebbe familiare. Ci sono altre alternative reali? –