Puede usar un analizador C existente para Java. Hace mucho más que analizar archivos de encabezado, por supuesto, pero eso no debería lastimarlo.
Utilizamos el analizador del proyecto Eclipse CDT. Este es un plugin de Eclipse, pero lo usamos con éxito fuera de Eclipse, solo tenemos que agrupar 3 archivos JAR de Eclipse con el analizador JAR.
Para usar el analizador CDT, comience con una implementación de org.eclipse.cdt.core.model.ILanguage
, por ejemplo org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage
. Puedes llamar al getTranslationUnit
, pasando el código y algunas cosas de ayuda. Un archivo de código está representado por una instancia org.eclipse.cdt.core.parser.FileContent
(al menos en CDT7, esto parece cambiar mucho). La forma más fácil de crear dicho objeto es FileContent.createForExternalFileLocation(filename)
o FileContent.create(filename, content)
. De esta forma, no necesita preocuparse por las cosas de Eclipse IFile
, que parece funcionar solo dentro de proyectos y espacios de trabajo.
El IASTTranslationUnit
que obtiene representa todo el AST del archivo. Todos los nodos son instancias de tipos IASTSomething
, por ejemplo IASTDeclaration
, etc. Puede implementar su propia subclase de org.eclipse.cdt.core.dom.ast.ASTVisitor
para recorrer el AST utilizando el patrón de visitante. Si necesita ayuda adicional, solo pregunte.
Los archivos JAR que utilizamos son org.eclipse.cdt.core.jar
, org.eclipse.core.resources.jar
, org.eclipse.equinox.common.jar
y org.eclipse.osgi.jar
.
Editar: había encontrado un documento que contiene fragmentos de código fuente para esto: "Uso de las Herramientas Eclipse C/C++ Development como un robusto y completamente funcional, activamente Mantenido, Open Source C++ Analizador", pero es ya no está disponible en línea (solo como una versión abreviada).
las páginas de manual para lex y yacc (flex y bison) pueden ayudar –
Oh, buen punto, me olvidé de yacc. Esperaba que ya hubiera una solución existente para esto. Pero creo que podría crear mi propio analizador de transmisión usando yacc. – PhilW
@PhilW, ¿has creado tu analizador? Necesito analizar el encabezado C que contiene definiciones de preprocesador (solo constantes de enteros). Necesito obtener estas constantes de la aplicación C Header a Java. Por supuesto que estoy buscando algún tipo de solución ya hecha antes de implementar mi propia =) –