Download Como integrar un Editor al compilador de su

Document related concepts
no text concepts found
Transcript
Esta es la seccion dentro del archivo de especificacion de javacc, en la cual se declara la
clase principal del Analizador Lexico-Sintactico, el cual desde ahora le denominaremos
simplemente Compilador.
En los ejemplos anteriores, se incluia el metodo main como el punto inicial para ejecutar
el Compilador, en el archivo .jj.
PARSER_BEGIN(Compilador)
import java.io.FileInputStream;
import java.io.IOException;
public class Compilador{
public static void main(String args[])
throws ParseException {
try {
// Especificaremos un archivo en
// lugar de la entrada por teclado
FileInputStream fin;
fin = new FileInputStream("entrada.txt");
Compilador comp = new Compilador(fin);
comp.Entrada();
}catch(IOException e){
System.out.println("Error");
}
}
}
PARSER_END(Compilador)
Para integrar el editor, tendremos que modificar la espeficiacion de la clase principal del
Compilador ya que lo mandaremos a ejecutar desde el mismo Editor. Quitaremos
entonces el método main(), pero incluiremos dos metodos necesarios para interactuar
con el Editor (addError() y setEditor()).
Esta especificación quedará como sigue (atender a comentarios dentro del codigo) :
options {
STATIC = false; // Esta opcion es importante
// para integrar el Analizador al Editor
}
/* Declaraciones previas */
PARSER_BEGIN(Compilador)
// Aqui se pueden importar los paquetes que sean necesarios
import java.io.FileInputStream;
import java.io.IOException;
import javax.swing.JTextArea;
import javax.swing.JTextPane;
import java.awt.Color;
public class Compilador{
public EditorDoc editor=null; // Variable para referenciar al
// Editor.
public String errores="";
// Con este metodo se le indica al nuestro compilador,
// la referencia al objeto Editor, para que pueda comunicarse
// con este y acceder a sus miembros publicos (vars y metodos)
public void setEditor(EditorDoc ed){
editor = ed;
}
// Aquí otro metodo para reportar los errores y en el caso
// en que se haya especificado un Editor, colocar el mensaje
// de error en el area de texto que corresponda.
public void addError(String err, Token t){
// Si la variable referencia es nula se manda a la
// salida estandar.
if (editor!=null){
errores = errores+err+"\n";
editor.textError.setText(errores);
if (t!=null){
editor.coloreaTexto(t.beginColumn,t.toString().length());
}
} else {
System.out.println(err);
}
}
}
PARSER_END(Compilador)
Guardaremos entonces en el compilador, en una variable la referencia al objeto Editor.
Por otra parte desde el Editor crearemos la instancia de la clase Compilador e
invocaremos al inicio del analisis lexico sintactico invocando el simbolo inicial de la
gramatica, igual que se hacia en el metodo main().
Dentro de la clase editor (EditorDoc.java), cuando se seleccione el invocar al compilador
para revisar el texto de entrada, se invocará el siguiente método, que ahora efectuara
las acciones que hacia antes el metodo main(), ver comentarios dentro del codigo:
// Metodo donde se traslado el main del Compilador.
private void buttonCompilar_actionPerformed(ActionEvent e)
{
// Streams para los flujos de entrada y salida del archivo a revisar
FileInputStream fin;
FileOutputStream fout;
PrintWriter pw;
// Generamos un nombre de archivo “aleatorio”, para crear un temporal.
String archivo = Long.toString(System.currentTimeMillis())+".txt";
// Se escribe en un archivo el texto escrito en el editor, con el nombre antes generado.
try {
fout = new FileOutputStream(archivo);
pw = new PrintWriter(fout);
pw.print(textCodigo.getText());
pw.close();
fout.close();
} catch (IOException ioe) {
textError.setText("Error de escritura en el archivo.");
}
// Ahora se abre para la lectura y asi pasar un flujo de entrada al compilador.
// el siguiente codigo, se encontraba en el metodo main original
try {
Compilador comp;
fin = new FileInputStream(archivo);
// Se crea la instancia del compilador
comp = new Compilador(fin);
// Se le indica al compilador el editor, que en este caso es this.
comp.setEditor(this);
// Se inicia el proceso de analisis lexico-sintactico.
try {
comp.Entrada(); // Invoca al simbolo inicial de la gramatica.
} catch (ParseException pe){
comp.addError("Error en el proceso de Compilacion",null);
}
// se cierra el archivo de entrada.
fin.close();
// Se borra el temporal.
File file = new File(archivo);
if (!file.delete())
comp.addError("No se pudo borrar el archivo = "+archivo,null);
comp=null;
} catch (IOException ioe) {
textError.setText("Error de apertura del archivo.");
}
}
En concreto tienen que referenciar el editor y agregar un metodo de error al compilador
para que escriba los mensajes de error en el cuadro de texto correspondiente, en nuestro
ejemplo el metodo addError y setEditor.
Las lineas que tienen que cambiar en el codigo anterior, se especifican en negritas.
Si no quieren batallar mucho, simplemente agreguen el segundo bloque de codigo en su
archivo *.jj para que su compilador sea la clase “Compilador” y listo.
Generen con javacc los archivos fuente de Java
javacc compilador.jj
y luego compilen todo con
javac Editor.java
Solo tengan cuidado en el archivo fuente EditorDoc.java, invoquen el llamado al simbolo
inical, que en ejemplo es:
comp.Entrada()