2010-05-12 10 views
5

quiero obtener una representación xml del ast de código Java y c. Hace 3 meses, le pregunté this question yet pero las soluciones no eran cómodas para mí¿Cómo convertir el código fuente a una representación basada en xml del ast?

  • srcml parece ser una buena solución para este problema, pero no es compatible con los números de línea y columnas pero necesito esa característica.
  • acerca de elsa: cite: "Hay un esfuerzo continuo para exportar el AST de Elsa como un documento XML, esperamos poder publicitarlo en la próxima publicación pública".
  • dms ... no entendí eso.
  • especialmente para java, hay javaml que admite números de línea. pero el sourceforge page no muestra ningún archivo.

pregunta: hay un software disponible que admite la conversión de ast en xml que admite números de línea (y columnas) [especialmente para java yc/C++]? ¿Hay alguna alternativa a javaml y srcml?

pd: no quiero tener generadores de analizadores. Espero encontrar una herramienta que se pueda usar en la consola escribiendo: ./my-xml-generator Test.java [o algo por el estilo] ... o una implementación Java también sería genial.

+0

¿Qué es lo que quieres hacer, que * requiere * que uses XML? –

+2

srcML ahora admite números de línea y columnas. Desde el sitio web: "Conocimiento de archivos y directorios con metadatos a nivel de archivo, es decir, idioma, ubicación de archivo e información de versión". He usado srcML extensamente y puedo verificar que tenga números de línea e información de columna. –

Respuesta

1

Hay GCC-XML en http://www.gccxml.org/HTML/Index.html - advertencia; Realmente no lo he usado yo mismo.

+1

AFAIK, GCC-XML solo vuelca datos de definición de tipo, no el código para el cuerpo de funciones. –

2

¿Qué no entendió acerca de DMS?

Existe.

Tiene un compilador preciso parsers/frontends for C, C++, Java, C#, COBOL (and many other languages).

Crea automáticamente Árboles de sintaxis abstractos completos para lo que sea que analice. Cada nodo AST está marcado con un archivo/línea/columna para el token que representa ese inicio de ese nodo, y la columna final se puede calcular mediante una llamada a la API DMS.

Tiene una opción incorporada para generar XML a partir de los AST, completa con el tipo de nodo, la posición de origen (como se indica anteriormente) y cualquier valor literal asociado. La llamada línea de comandos es:

run DMSDomainParser ++XML <path_to_your_file> 

Puede see what such an XML result looks like for Java.

Probablemente no quieras realmente lo que estás deseando. Un programa de 1000 C puede tener 100K líneas de #include cosas de archivo. Una línea produce entre 5-10 nodos. La salida DMS XML es succinta y cada nodo solo toma una línea, por lo que está viendo ~~ 1 millón de líneas de XML, de 60 caracteres cada una -> 60 millones de caracteres. Es un archivo grande, y probablemente no desee procesarlo con una herramienta basada en XML.

DMS proporciona una gran cantidad de infraestructura para manipular los AST que construye: cruzada, coincidencia de patrones (contra patrones codificados esencialmente en forma de fuente), transformaciones fuente a fuente, flujo de control, flujo de datos, puntos-a análisis, gráficos de llamadas globales. Te resultará increíblemente difícil replicar toda esta maquinaria, y es probable que necesites hacer algo interesante.

Moral: es mucho mejor usar algo así como DMS para manipular el AST directamente, que luchar con XML.

Descripción completa: Soy el arquitecto detrás de DMS.

3

un poco tarde, pero aquí es una: http://xmltranslator.appspot.com/sourcecodetoxml.html

he implementado por mí mismo y convierte PHP y Java para XML. ¡Es gratis así que disfruta!

Oana.

+0

Y para 1000 líneas de entrada Java, ¿qué tan grande es un documento XML? –

0

Solo para Java, puede usar BeautyJ.

Puede ejecutarlo contra su archivo con las opciones -xml. *. Por ejemplo:

java /your/dir/BeautyJ/lib/beautyj.jar beautyj -xml.out= -xml.doctype your_file.java 

... y obtiene una representación XML de ese archivo (e incluidos).

BTW: las opciones "-xml.out =" especifican un archivo de salida. Utilizado de esa manera, con el final "=", se envía a STDOUT. No es un error

0

srcml admite el número de línea y el número de columna. Aquí hay un ejemplo usando un archivo de Java llamada input.java (tener en cuenta srcml soporta múltiples idiomas, incluyendo C/C++) que contiene lo siguiente:

public class HelloWorld { 
    public static void main(String[] args) { 
     // Prints "Hello, World" to the terminal window. 
     System.out.println("Hello, World"); 
    } 
} 

A continuación, ejecute srcml con el comando para habilitar el seguimiento de esta información de posición adicional:

srcml input.java --position 

Se produce el siguiente AST en un formato XML con el número de línea y el número de columna incrustado:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<unit xmlns="http://www.srcML.org/srcML/src" xmlns:pos="http://www.srcML.org/srcML/position" revision="0.9.5" language="Java" filename="input.java" pos:tabs="8"><class><specifier pos:line="1" pos:column="1">public<pos:position pos:line="1" pos:column="7"/></specifier> class <name pos:line="1" pos:column="14">HelloWorld<pos:position pos:line="1" pos:column="24"/></name> <block pos:line="1" pos:column="25">{ 
    <function><specifier pos:line="2" pos:column="5">public<pos:position pos:line="2" pos:column="11"/></specifier> <specifier pos:line="2" pos:column="12">static<pos:position pos:line="2" pos:column="18"/></specifier> <type><name pos:line="2" pos:column="19">void<pos:position pos:line="2" pos:column="23"/></name></type> <name pos:line="2" pos:column="24">main<pos:position pos:line="2" pos:column="28"/></name><parameter_list pos:line="2" pos:column="28">(<parameter><decl><type><name><name pos:line="2" pos:column="29">String<pos:position pos:line="2" pos:column="35"/></name><index pos:line="2" pos:column="35">[]<pos:position pos:line="2" pos:column="37"/></index></name></type> <name pos:line="2" pos:column="38">args<pos:position pos:line="2" pos:column="42"/></name></decl></parameter>)<pos:position pos:line="2" pos:column="43"/></parameter_list> <block pos:line="2" pos:column="44">{ 
    <comment type="line" pos:line="3" pos:column="9">// Prints "Hello, World" to the terminal window.</comment> 
    <expr_stmt><expr><call><name><name pos:line="4" pos:column="9">System<pos:position pos:line="4" pos:column="15"/></name><operator pos:line="4" pos:column="15">.<pos:position pos:line="4" pos:column="16"/></operator><name pos:line="4" pos:column="16">out<pos:position pos:line="4" pos:column="19"/></name><operator pos:line="4" pos:column="19">.<pos:position pos:line="4" pos:column="20"/></operator><name pos:line="4" pos:column="20">println<pos:position pos:line="4" pos:column="27"/></name></name><argument_list pos:line="4" pos:column="27">(<argument><expr><literal type="string" pos:line="4" pos:column="28">"Hello, World"<pos:position pos:line="4" pos:column="42"/></literal></expr></argument>)<pos:position pos:line="4" pos:column="43"/></argument_list></call></expr>;<pos:position pos:line="4" pos:column="44"/></expr_stmt> 
    }<pos:position pos:line="5" pos:column="6"/></block></function> 
}<pos:position pos:line="6" pos:column="2"/></block></class></unit> 

Referencia: Documentación para srcml v0.9.5 (ver srcml --help). También uso srcml con frecuencia, incluida esta función para obtener información de posición.

Cuestiones relacionadas