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