Download Entorno de desarrollo

Document related concepts
no text concepts found
Transcript
Departamento de Lenguajes y Sistemas Informáticos
Procesadores de Lenguajes
LABORATORIO 1: ENTORNO DE DESARROLLO
OBJETIVO
Especificar el entorno de desarrollo para las sesiones de laboratorio.
DURACIÓN: 1 sesión.
ANTLR Y ECLIPSE
ANTLR es una herramienta diseñada para facilitar la construcción de componentes de un
procesador. Permite la especificación de tres tipos de componentes: Lexers, Parsers y
TreeParsers. Cada componente se escribe en un fichero de texto con extensión .g. La
compilación del fichero ANTLR producirá una clase Java implementando el correspondiente
componente. Por ejemplo, dado un fichero ANTLR conteniendo la especificación de un parser
Anasint producirá al compilarlo un fichero Java llamado Anasint.java.
Para facilitar la construcción del procesador, ANTLR posee plugins Eclipse. Estos plugins se
instalan de forma automática como actualizaciones de software desde la dirección www.antlr.org.
En los laboratorios se ha instalado la versión 2.7.6 de ANTLR. Se recomienda instalar la misma
versión en los ordenadores personales.
1
Departamento de Lenguajes y Sistemas Informáticos
Procesadores de Lenguajes
EJEMPLO DE DESARROLLO
Esta sección muestra paso a paso el desarrollo de un procesador con ANTLR en el entorno
eclipse.
Primero, se crea un proyecto Java y luego se especializa a proyecto ANTLR.
A continuación, se incluye en el proyecto los ficheros ANTLR que contienen los componentes
del procesador. Los dos ejemplos siguientes muestran los ficheros ANTLR Anasint.g y Analex.g
conteniendo parser y lexer para el lenguaje de programación LF. Se recomienda cortar y pegar
tales ficheros en el directorio src.
Ejemplo 1. Fichero Anasint.g.
class Anasint extends Parser;
options{
buildAST = true;
}
tokens{
PROGRAMA;
}
programa : variables instrucciones EOF!
{#programa = #(#[PROGRAMA, "PROGRAMA"], ##);}
;
variables !: a:VARIABLES b:idents PyC {#variables =#(#a,#b);}
;
idents : (VAR COMA) => VAR COMA! idents
| VAR
|
;
2
Departamento de Lenguajes y Sistemas Informáticos
Procesadores de Lenguajes
instrucciones : INSTRUCCIONES^ (definicion|evaluacion)*
;
definicion : VAR DEF^ expr PyC!
;
evaluacion : EVAL^ VAR PyC!
;
expr : (expr1 MAS) => expr1 MAS^ expr
| (expr1 MENOS) => expr1 MENOS^ expr
| expr1
;
expr1 : (expr2 POR) => expr2 POR^ expr1
| expr2
;
expr2 : NUMERO
| MENOS^ expr
| VAR
| PA! expr PC!
;
Ejemplo 2. Fichero Analex.g.
class Analex extends Lexer;
options{
importVocab = Anasint;
}
tokens{
VARIABLES="VARIABLES";
INSTRUCCIONES="INSTRUCCIONES";
EVAL="EVAL";
DEF="DEF";
}
protected NL: "\r\n" {newline();}
;
protected DIGITO : '0'..'9'
;
protected LETRA : 'a'..'z'|'A'..'Z'
;
BTF: (' '|'\t'|NL) {$setType(Token.SKIP);}
;
NUMERO : (DIGITO)+
;
VAR : (LETRA)+
;
PA : '('
;
PC : ')'
;
PyC : ';'
;
COMA : ','
;
MAS : '+'
;
MENOS : '-'
;
POR : '*'
;
3
Departamento de Lenguajes y Sistemas Informáticos
Procesadores de Lenguajes
El tercer paso es compilar los ficheros ANTLR, primero Anasint.g y después Analex.g.
Para ejecutar el procesador se necesita un programa que lo llame. El siguiente ejemplo
muestra un programa lanzador. Se recomienda corta y pegar en el proyecto.
Ejemplo 3. Programa lanzador
import
import
import
import
import
import
java.io.FileInputStream;
java.io.FileNotFoundException;
antlr.RecognitionException;
antlr.TokenStreamException;
antlr.collections.AST;
antlr.debug.misc.ASTFrame;
public class Principal {
public static void main(String[] args) {
try{
FileInputStream f = new FileInputStream(args[0]);
Analex analex = new Analex(f);
Anasint anasint = new Anasint(analex);
// Análisis léxico-sintáctico
anasint.programa();
AST a = anasint.getAST();
ASTFrame af = new ASTFrame(args[0],a);
af.setVisible(true);
}catch(FileNotFoundException e)
{System.out.println("Error in file");}
catch(RecognitionException e)
{System.out.println("Error in parser analysis");}
catch(TokenStreamException e)
{System.out.println("Error in lexical analysis");}
4
Departamento de Lenguajes y Sistemas Informáticos
Procesadores de Lenguajes
}
}
El siguiente ejemplo muestra un fichero Entrada.txt conteniendo un programa LF de ejemplo
para procesar. Se recomienda corta y pegar en el proyecto y crear un entorno de ejecución
pasando como argumento Entrada.txt.
Ejemplo 4. Fichero Entrada.txt
VARIABLES
x, y, z, a, b;
INSTRUCCIONES
a DEF -1;
b DEF (a+1);
EVAL b;
a DEF 2;
EVAL b;
b DEF b + 1;
z DEF 2*y;
EVAL z;
EVAL b;
Finalmente, se propone la ejecución de Programa.java para ver el resultado del análisis
léxico-sintáctico sobre el fichero Entrada.txt (args[0]).
5