2012-04-24 36 views
5

Tengo un archivo C-Header que define un par de estilos, que contienen varias matrices de caracteres.Analizando/leyendo archivos C-Header usando Java

Me gustaría analizar estos archivos utilizando Java. ¿Hay una biblioteca para leer archivos de encabezado C en una estructura o hay un analizador de flujo que comprende los archivos de cabecera en C?

Solo para obtener más información (solo estoy buscando un analizador C-Header, no una solución para este problema en particular): Tengo un archivo de texto que contiene datos y un archivo C-Header que explica la estructura. Ambos son un poco dinámicos, por lo que no quiero generar archivos de clase Java.

ejemplo:

#define TYPE1 
typedef struct type1 
{ 
char name1[10]; 
char name2[5]; 
} 
#endif 

Type2, Type3 etc son similares.

Estructura de datos:

type1ffffffffffaaaaa 
+0

las páginas de manual para lex y yacc (flex y bison) pueden ayudar –

+0

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

+0

@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 =) –

Respuesta

12

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).

+0

¡Parece una buena opción! ¿Te importaría arrojar algunas palabras clave o consejos sobre cómo hacer esto? (¿Cuáles son las clases principales en este escenario?) – PhilW

+0

De hecho, tengo una pregunta: En mi ejemplo anterior, tengo una macro "#define type1" - ¿cómo hago que mi ASTVisitor visite eso? – PhilW

+0

No estoy seguro de cómo es compatible con las declaraciones previas al procesador, ya que nuestro código no tiene ninguna de ellas. Pero hay algunos métodos en 'IASTTranslationUnit' que parecen darle acceso a declaraciones previas al procesador como' # define'. –

4

Ejemplo usando Eclipse CDT con solo 2 jarras.
- https://github.com/ricardojlrufino/eclipse-cdt-standalone-astparser
En el ejemplo tiene una clase que muestra la estructura del archivo de origen como un árbol y otro ejemplo que realiza interacciones en la api ...

Un detalle es que con esta API (Eclipse CDT Parser) puede hacer el análisis de una cadena en la memoria.

Otro ejemplo de uso es:
https://github.com/ricardojlrufino/cplus-libparser
Biblioteca para la extracción de los metadatos (información sobre clases, métodos, variables) de código fuente en C/C++.

Ver el archivo: https://github.com/ricardojlrufino/cplus-libparser/blob/master/src/main/java/br/com/criativasoft/cpluslibparser/SourceParser.java

3

Como ya se ha mencionado, CDT es perfecto para esta tarea. Pero a diferencia de lo descrito anteriormente, lo usé desde dentro de un complemento y pude usar IFiles. Entonces todo es tan fácil. Para obtener el "ITranslationUnit" Just Do:

ITranslationUnit tu = (ITranslationUnit) CoreModel.getDefault().create(myIFile); 
IASTTranslationUnit ias = tu.getAST(); 

es decir, que estaba buscando un #define especial, por lo que tan sólo pudiera:

ppc = ias.getAllPreprocessorStatements(); 

para obtener todas las instrucciones de código preprocesados, cada declaración en conjunto -elemento. Perfectamente fácil.