2010-05-12 2 views
5

voglio ottenere una rappresentazione xml del codice java e c. 3 mesi fa, ho chiesto this question yet ma le soluzioni non erano confortevoli per meCome convertire il codice sorgente in una rappresentazione basata su xml dell'ast?

  • srcml sembra essere una buona soluzione per questo problema, ma non supporta i numeri di riga e colonne, ma ho bisogno di questa caratteristica.
  • su elsa: cite: "È in corso uno sforzo per esportare Elsa AST come documento XML e ci aspettiamo di poterlo pubblicizzare nella prossima versione pubblica."
  • dms ... non lo capisco.
  • specialmente per java, c'è javaml che supporta i numeri di riga. ma lo sourceforge page non elenca alcun file.

domanda: c'è un software disponibile che supporta la conversione di ast in xml che supporta numeri di riga (e colonne) [specialmente per java e c/C++]? c'è un'alternativa a javaml e srcml?

ps: non ho generatori di parser. spero di trovare uno strumento che possa essere usato sulla console digitando: ./my-xml-generator Test.java [o qualcosa del genere] ... o anche un'implementazione java sarebbe ottima.

+0

Che cosa vuoi fare, che * richiede * di utilizzare XML? –

+2

srcML ora supporta numeri di riga e colonne. Dal sito Web: "File e directory in conoscenza con i metadati a livello di file, ovvero lingua, percorso file e informazioni sulla versione." Ho usato srcML estesamente e posso verificare che abbia numeri di riga e informazioni sulle colonne. –

risposta

1

C'è GCC-XML a http://www.gccxml.org/HTML/Index.html - avvertenza; In realtà non l'ho usato da solo.

+1

AFAIK, GCC-XML archivia solo i dati di definizione del tipo, non il codice per il corpo delle funzioni. –

2

Cosa non hai capito di DMS?

Esiste.

Ha compilatore accurato parsers/frontends for C, C++, Java, C#, COBOL (and many other languages).

Costruisce automaticamente gli alberi di sintassi astratta per qualsiasi cosa analizzi. Ogni nodo AST è timbrato con file/riga/colonna per il token che rappresenta quell'inizio di quel nodo, e la colonna finale può essere calcolata da una chiamata API DMS.

Ha un'opzione integrata per generare XML dagli AST, completo di tipo di nodo, posizione di origine (come sopra) e qualsiasi valore letterale associato. La chiamata dalla riga di comando è:

run DMSDomainParser ++XML <path_to_your_file> 

È possibile see what such an XML result looks like for Java.

Probabilmente non vuoi veramente ciò che desideri. Un programma da 1000 C può contenere 100K righe di #include file stuff. Una linea produce tra 5-10 nodi. L'output XML DMS è di tipo succint e ogni nodo prende solo una linea, quindi stai guardando ~~ 1 milione di righe di XML, di 60 caratteri ciascuna -> 60 milioni di caratteri. Questo è un file grande e probabilmente non si desidera elaborarlo con uno strumento basato su XML.

DMS stesso fornisce una grande quantità di infrastrutture per manipolare le AST che costruisce: traslazione, pattern matching (contro modelli codificati essenzialmente in forma sorgente), source-to-source trasforma, flusso di controllo, il flusso di dati, indica-to analisi, grafici delle chiamate globali. Troverai incredibilmente difficile replicare tutti questi macchinari e probabilmente avrai bisogno di fare qualcosa di interessante.

Morale: molto meglio usare qualcosa come DMS per manipolare l'AST direttamente, piuttosto che combattere con XML.

Full disclosure: Sono l'architetto dietro DMS.

0

Solo per Java, è possibile utilizzare BeautyJ.

È possibile avviarlo sul file con le opzioni -xml. *. Ad esempio:

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

... e si ottiene una rappresentazione XML di tale file (e inclusi).

BTW: le opzioni "-xml.out =" specificano un file di output. Usato in questo modo, con il trailing "=", viene emesso in STDOUT. Non è un errore

0

srcml supporta il numero di riga e il numero di colonna. Ecco un esempio utilizzando un file java chiamato input.java (tenere a mente srcml supporta più lingue, tra cui C/C++) che contiene il seguente:

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

Poi gestita srcml con il comando per attivare tenere traccia di questo informazioni di posizione in più:

srcml input.java --position 

produce il seguente AST in un formato XML con numero di riga e di colonna incorporato:

<?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> 

Riferimento: Documentazione per srcml v0.9.5 (vedere srcml --help). Inoltre uso spesso srcml, inclusa questa funzione per ottenere informazioni sulla posizione.