È possibile utilizzare un parser C esistente per Java. Fa molto più dell'analisi dei file di intestazione, ovviamente, ma non dovrebbe farti male.
Utilizziamo il parser dal progetto Eclipse CDT. Questo è un plugin Eclipse, ma lo usiamo con successo al di fuori di Eclipse, dobbiamo solo raggruppare 3 file JAR di Eclipse con il parser JAR.
Per utilizzare il parser CDT, iniziare con un'implementazione di org.eclipse.cdt.core.model.ILanguage
, ad esempio org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage
. Puoi chiamare getTranslationUnit
su di esso, passare il codice e alcune cose di supporto. Un file di codice è rappresentato da un'istanza org.eclipse.cdt.core.parser.FileContent
(almeno in CDT7, questo sembra cambiare molto). Il modo più semplice per creare tale oggetto è FileContent.createForExternalFileLocation(filename)
o FileContent.create(filename, content)
. In questo modo non devi preoccuparti delle cose di Eclipse IFile
, che sembrano funzionare solo all'interno di progetti e spazi di lavoro.
Il IASTTranslationUnit
che si ottiene rappresenta l'intero AST del file. Tutti i nodi in questo caso sono istanze di tipi IASTSomething
, ad esempio IASTDeclaration
ecc. È possibile implementare la propria sottoclasse di org.eclipse.cdt.core.dom.ast.ASTVisitor
per scorrere l'AST utilizzando il modello di visitatore. Se hai bisogno di ulteriore aiuto, basta chiedere.
I file JAR che utilizziamo sono org.eclipse.cdt.core.jar
, org.eclipse.core.resources.jar
, org.eclipse.equinox.common.jar
e org.eclipse.osgi.jar
.
Edit: avevo trovato un documento che contiene frammenti di codice sorgente per questo: "Utilizzo del Tooling Eclipse C/C++ per lo sviluppo come un robusto, perfettamente funzionante, mantenuto attivamente, Open Source C++ Parser", ma è non più disponibile online (solo come versione abbreviata).
fonte
2012-04-24 15:04:55
le pagine man di lex e yacc (flex e bisonte) possono aiutare –
Oh, buon punto, ho dimenticato di yacc. Speravo che ci sarebbe già una soluzione esistente per questo. Ma credo di poter creare il mio parser di streaming usando yacc. – PhilW
@PhilW, hai creato il parser? Ho bisogno di analizzare C Header contenente le definizioni del preprocessore (solo costanti intere). Ho bisogno di ottenere queste costanti dall'applicazione C Header a Java. Certo che sto cercando una soluzione pronta per l'uso prima di implementare la mia =) –