switch setfont para numeros numero monto lista letras letra instalar fuentes fuente font example escrito descargar convertir con codigo java annotations code-generation janino

setfont - Anulando el número de línea en la fuente Java generada



monto escrito java (5)

¿Hay alguna manera de anular los números de línea en Java (por ejemplo, mediante el uso de algún tipo de directiva de preprocesador)?

Estoy "compilando" un lenguaje de alto nivel, hasta el código de bytes de Java usando Janino. Necesito errores del compilador para informar la línea del archivo original, no el código Java generado.

C # tiene la directiva #line, y la he explotado exitosamente para mapear los números de línea de un archivo fuente al resultado compilado. Necesito lo mismo para Java.

¡Gracias!


En lugar de generar código Java como su lenguaje intermedio, podría intentar usar el ensamblador JVM. Jasmin tiene una sintaxis agradable, y puedes insertar directivas .line en los lugares apropiados de tu código. También puede especificar el archivo fuente original utilizando la directiva .source.

De acuerdo, ir por la ruta del ensamblador puede ser más complicado de lo que vale :)


No hay una solución simple. Una solución alternativa sería generar un mapa de número de línea desde [su idioma] a Java cuando genere el código. Puede canalizar la salida del compilador y usar el mapa para reemplazar los números de línea de Java con sus números de línea.


Nunca lo he visto usar para otro que no sea JSP, pero JSR-45 fue diseñado para ser utilizado con este propósito para cualquier idioma fuente. El proceso implica la creación de un segundo archivo en un formato especial ("SMAP") que asigna los números de línea en la fuente original a los números de línea en el código fuente Java generado.


Usando Janino puede derivar de Scanner y anular el método de location() . Este método devuelve un objeto Location. Puede anular el método de read() para buscar anotaciones, en los comentarios por ejemplo (agregados durante la generación del código), que contienen información del número de línea.

Simplemente pase su escáner al método SimpleCompiler.cook() y podrá controlar qué nombre de archivo, línea y columna se informarán en caso de error.


Lamentablemente, no, no existe una directiva #line equivalente en Java. Lo mejor que puede hacer es modificar la fuente después de que se haya generado eliminando / insertando líneas nuevas para que coincida con la fuente real (o modifique el generador de códigos). O bien, podría modificar los números de línea almacenados en los archivos de clase binarios después de que se hayan compilado, pero eso probablemente sea aún más doloroso.