2009-02-10 17 views
13

C'è un modo per sovrascrivere i numeri di riga in Java (ad esempio, utilizzando una sorta di direttiva del preprocessore)?Sovrascrivere il numero di riga nella sorgente Java generata

Sto "compilando" un linguaggio di alto livello, in codice byte Java utilizzando Janino. Ho bisogno di errori del compilatore per segnalare la linea dal file originale, non il codice Java generato.

C# ha la direttiva #line e l'ho sfruttata con successo per mappare i numeri di riga da un file sorgente al risultato compilato. Ho bisogno dello stesso per Java.

Grazie!

+0

Se si sta eseguendo la compilazione in codice byte Java, è necessario conoscere i numeri di riga. O vuoi dire che stai compilando in Java e il compilatore Java lo sta prendendo e compilando in codice byte? – jdigital

risposta

3

Utilizzando Janino è possibile derivare da Scanner e l'override del metodo location(). Questo metodo restituisce un oggetto posizione. È possibile sovrascrivere il metodo read() per cercare le annotazioni, all'interno dei commenti, ad esempio (aggiunte durante la generazione del codice), che contengono informazioni sul numero di riga.

Basta passare lo scanner allo scanner al metodo SimpleCompiler.cook() ed è possibile controllare quale nome file, riga e colonna vengono segnalati in caso di errore.

4

Sfortunatamente no, non esiste una direttiva #line equivalente in Java. Il meglio che puoi fare è modificare la sorgente dopo che è stata generata eliminando/inserendo newline per abbinare la fonte reale (o modificare il generatore di codice). Oppure, è possibile modificare i numeri di riga memorizzati nei file di classe binari dopo che sono stati compilati, ma ciò sarà probabilmente ancora più doloroso.

1

Non esiste una soluzione semplice. Una soluzione alternativa sarebbe quella di generare una mappa del numero di riga da [la tua lingua] a Java quando si genera il codice. È possibile reindirizzare l'output del compilatore e utilizzare la mappa per sostituire i numeri di riga di Java con i numeri di linea.

8

Non l'ho mai visto utilizzato per altri da JSP, ma JSR-45 è stato progettato per essere utilizzato a questo scopo per qualsiasi lingua di origine. Il processo prevede la creazione di un secondo file in un formato speciale ("SMAP") che mappa i numeri di riga nella sorgente originale ai numeri di riga nel codice sorgente Java generato.

3

Invece di generare codice Java come lingua intermedia, è possibile provare a utilizzare l'assembler JVM. Jasmin ha una buona sintassi e sei libero di inserire direttive .line nei punti appropriati del tuo codice. Puoi anche specificare il file sorgente originale usando la direttiva .source.

Certo, andare via assemblatore può essere più problemi di quanto ne vale la pena :)

Problemi correlati