practica2k3

11
ESCUELA UNIVERSITARIA DE INFORMÁTICA Compiladores PRÁCTICA OBLIGATORIA Contenido de este documento OBJETIVOS ............................................................................................................................................ 1 DESCRIPCIÓN DEL LENGUAJE A IMPLEMENTAR ...................................................................................... 1 EL COMPILADOR .................................................................................................................................... 1 Programa reconocedor de componentes léxicos .............................................................................. 1 Compilador del lenguaje .................................................................................................................. 4 PRUEBAS DEL COMPILADOR................................................................................................................... 8 NORMAS DE ENTREGA DE LA PRÁCTICA................................................................................................. 8 APÉNDICE 1. LAS HERRAMIENTAS JFLEX Y BYACC/JAVA ...................................................................... 8 JFlex ................................................................................................................................................. 8 Yacc (Byacc/Java) ............................................................................................................................ 9 APÉNDICE 2. SOFTWARE PARA REALIZAR LA PRÁCTICA ...................................................................... 10 APÉNDICE 3. DOCUMENTACIÓN SOBRE EL LENGUAJE JAVA................................................................. 10

Upload: jose-nose-mentiende

Post on 16-Dec-2015

2 views

Category:

Documents


0 download

DESCRIPTION

a

TRANSCRIPT

  • ESCUELA UNIVERSITARIA DE INFORMTICA

    Compiladores

    PRCTICA OBLIGATORIA Contenido de este documento

    OBJETIVOS ............................................................................................................................................ 1 DESCRIPCIN DEL LENGUAJE A IMPLEMENTAR ...................................................................................... 1 EL COMPILADOR.................................................................................................................................... 1

    Programa reconocedor de componentes lxicos.............................................................................. 1 Compilador del lenguaje .................................................................................................................. 4

    PRUEBAS DEL COMPILADOR................................................................................................................... 8 NORMAS DE ENTREGA DE LA PRCTICA................................................................................................. 8 APNDICE 1. LAS HERRAMIENTAS JFLEX Y BYACC/JAVA...................................................................... 8

    JFlex ................................................................................................................................................. 8 Yacc (Byacc/Java) ............................................................................................................................ 9

    APNDICE 2. SOFTWARE PARA REALIZAR LA PRCTICA ...................................................................... 10 APNDICE 3. DOCUMENTACIN SOBRE EL LENGUAJE JAVA................................................................. 10

  • Objetivos Diseo de una gramtica para un lenguaje propio de programacin sencillo (que

    necesariamente ser diferente del lenguaje que mostramos en los ejemplos que se detallan a lo largo de la descripcin de la prctica)

    Implementacin de un programa que reconozca el lxico de un lenguaje, utilizando la herramienta jflex

    Implementacin de un compilador para el lenguaje utilizando las herramientas jflex(lex) y byacc/JAVA, que son las versiones de lex y yacc que generan Java respectivamente.

    Descripcin del lenguaje a implementar El lenguaje de programacin ser definido por cada alumno y permitir

    escribir mensajes y resultados por pantalla, definir y asignar variables de tipo entero y de tipo carcter, realizar operaciones condicionales IF, realizar expresiones aritmtico-lgicas (=, , , =, +, *,-, /) realizacin de bucles tipo WHILE y REPEAT, definir procedimientos y funciones con variables locales y con entrada de datos valor, hacer comentarios, definir, vectores de enteros y caracteres. Se deber permitir la inicializacin del vector

    completo en una asignacin y el acceso a cada componente. Para ello, cada alumno deber elegir el conjunto de palabras y signos reservados para el lenguaje (por ejemplo, := para asignacin, etc..) y la estructura y sintaxis de cada sentencia. Se podr tomar como ejemplo el lenguaje definido en el apndice del libro de la asignatura (pgina 764). Para la gestin de las palabras reservadas, variables (sus tipos y mbitos) y nombres de procedimientos se disear una tabla de smbolos.

    El compilador Implementar un programa que, utilizando jflex y byacc/Java, compile un programa escrito en el lenguaje diseado. Si algn alumno desea realizar esta practica en C con las herramientas de Unix, tendr que tener en cuenta las opciones y directivas especficas para ellas. El plan de trabajo se describe en los apartados posteriores.

    Programa reconocedor de componentes lxicos Definir una clase en jflex que reciba como entrada un programa escrito en el nuevo lenguaje y para cada sentencia, o token, saque un mensaje indicando qu es. Por ejemplo, para el siguiente programa

  • Prctica de Compiladores. Curso 2003/2004 2

    programa suma; variables a,b: vector(5) de entero; i,res:entero; # un procedimiento auxiliar proc inicializar; a

  • Prctica de Compiladores. Curso 2003/2004 3

    Es un entero: Es una llave: Es un punto y coma:

    in> Es una palabra clave: Es un comentario: Es una palabra clave:

  • Prctica de Compiladores. Curso 2003/2004 4 Java y como consecuencia se tiene una clase Yylex.class. As para el programa reconoce pedido en esta prctica se procedera del siguiente modo : c:\> jflex reconoce.l (llama a jflex y le da como entra el fichero reconoce.l, como

    resultado devuelve el fichero Yylex.java) c:\> javac Yylex.java (llama al compilador de Java y como resultado genera un

    fichero interpretable Yylex.class) c:\> java cp . Yylex suma.cal

    (ejecuta el programa y le da como entrada un fichero con un programa en calculator llamado ope1.cal)

    Compilador del lenguaje Modificar el cdigo correspondiente a jflex del apartado anterior, de forma que en vez de sacar un mensaje devuelva el token correspondiente cuando reconozca un token del lenguaje (con la sentencia return nombre-de-token o un valor (numero o variable) cuando reconozca un identificador o un valor numrico (ver en el siguiente apartado como se hace esto en jflex). Incluirlo en un fichero llamado scanner.l. En este caso el fichero jflex no tiene la declaracin %standalone. Por lo tanto, la estructura del fichero es la siguiente (la figura 4): %% %ignorecase /* directiva para utilizar jflex con byacc */ %byaccj /* declaracin de cdigo */ %{ private Parser yyparser; public Yylex(java.io.Reader r, Parser yyparser) { this(r); this.yyparser = yyparser; } %} /* macros */ IDENT =[a-zA-Z][a-zA-Z0-9_]* NUMERO=[0-9]+ %% PROGRAMA { System.err.println("Es un "); return Parser.PROGRAMA; } ";" { System.err.println("Es un "); return Parser.PUNTOYCOMA; } {IDENT} { yyparser.yylval = new ParserVal(yytext()); System.err.println("Es un identificador: " ); return Parser.IDENT; } {NUMERO} { try { yyparser.yylval = new ParserVal(Integer.parseInt(yytext())); return Parser.NUMERO; } catch (java.lang.NumberFormatException e) { return Parser.ILEGAL; } } [\ \t\r\n]+ { } . {}

  • Prctica de Compiladores. Curso 2003/2004 5

    Figura 4. Estructura del programa scanner.l.

    Implementar en un fichero que llamaremos compilador.y el analizador sintctico y semntico haciendo uso de la herramienta byacc. En el cdigo en byacc, para referenciar automticamente al analizador lxico, basta con definir un miembro de la clase Yylex que es compilado conjuntamente con las dems clases que forman el compilador. Luego se han de incluir las definiciones necesarias para byacc y las reglas de la gramtica, y a la derecha de cada una de las partes derechas de la regla (y antes del ; o | ) se van aadiendo las acciones semnticas correspondientes, en las que se va generando y comprobando la tabla de smbolos, generando cdigo o emitiendo los correspondientes mensajes de error, si hay errores de sintaxis o errores semnticos. %{ import java.io.*; %} /* declaracion de tokens */ %token PROGRAMA PUNTOYCOMA %token IDENT /* aqui los otros tokens del lenguaje */ /* %type sent_asig */ /* aqui al declaracion de las cadenas para las sentencias */ %% /* codificacion de las producciones de la gramatica del lenguaje */ cabecera : PROGRAMA IDENT PUNTOYCOMA { System.out.println("class " + $2 + "{"); System.out.println($2 + "(){"); System.out.println(); System.out.println("}"); System.out.println("public static void main(String[] args) {"); System.out.println($2 + " v = new " + $2 + "();"); System.out.println("}"); System.out.println("}"); } ; %% /*.. aqu el cuerpo de los procedimientos para manejar la tabla de smbolos*/ /* definicin analizador lxico */ private Yylex lexer; /* yylex(): utliza el analizador lxico */ private int yylex () { int yyl_return = -1; try { yylval = new ParserVal(0); yyl_return = lexer.yylex(); } catch (IOException e) { System.err.println("IO error :"+e); } return yyl_return; } /* ... resto de cdigo */ }

    Figura 5. Modo de incluir el fichero scanner.l en el analizador sintctico y semntico

    En el ejemplo se ha escrito el cdigo armazn para generar una cabecera de un programa. El cdigo generado, resultado de ejecutar el compilador sera con un programa que nicamente consistiera de la cabecera sera:

  • Prctica de Compiladores. Curso 2003/2004 6 class suma{ suma(){ } public static void main(String[] args) { suma v = new suma(); } }

    Figura 6. Cdigo generado por el compilador Tanto para las variables como para los procedimientos es necesario definir una tabla de smbolos, en la que se guardar el nombre de cada smbolo, distinguiendo de qu tipo es y el nombre que tiene. Cuando se declara una nueva variable o procedimiento, hay que comprobar si ya est declarado antes (en cuyo caso se emite un mensaje de error). Por otro lado, cuando se usa una variable o un procedimiento hay que comprobar si existe una variable o procedimiento, respectivamente, con ese nombre; caso de que no, se emite el correspondiente mensaje de error. Tanto la definicin de la tabla de smbolos como las funciones y procedimientos necesarios para manejarla se implementaran en Java en la zona de declaracin de cdigo de usuario, indicada en la figura 5, despus de incluir el cdigo correspondiente a byacc. La generacin de cdigo se har en un lenguaje Java, para la cul se explica como generar el cdigo de un programa vaco. Para generar el cdigo, se asocia a las reglas que correspondan, una accin semntica que simplemente escriba en el lenguaje elegido, en este caso Java, el trozo de cdigo que realiza lo que indica la regla. Por ejemplo, si tenemos la siguiente regla

    Cabecera PROGRAMA Nombre ;

    que reconoce la cabecera de un programa la accin correspondiente es la mostrada en la Figura 5, donde PROGRAMA, IDENT, y PUNTOCOMA son el nombre de tres tokens (la palabra reservada programa, el identificador de nombre de programa y el punto y coma) que una vez reconocidos por el analizador lxico, indican que la regla que define la cabecera es cierta, con lo cual se puede ejecutar la accin semntica correspondiente que dice que se escriba la palabra PROGRAM, en contenido del token IDENT (que se indica con $2 ya que ocupa la posicin 2 dentro de la parte derecha de la regla; esto se explica ms detalladamente en el siguiente apartado), despus un punto y coma y luego se salta una lnea; es decir, se genera cdigo en Java para describir la cabecera de un programa.

    (Nos referimos al apndice 1, donde se explica cmo se compila cdigo en jflex y en byacc y cmo, a continuacin, se genera un programa que hace de compilador del lenguaje) El fichero compilador.y tendr la estructura, del listado de la figura 7. El proceso de compilacin de un fichero en byacc es el siguiente:

    c:\> yacc J compilador. y (llama a byacc el ejecutable se llama yacc- y genera los ficheros Parser.java y ParserVal.java. El flag J indica la generacin de Java.) c:\> jflex scanner.l (llama a jflex, compila el scanner. Genera Yylex.java. No es necesario hacerlo cada vez que se recompila compilador.y.) c:\> javac Parser.java ParserVal.java Yylex.java

    (compila el cdigo generado por byacc y genera las clases Parser.class, ParserVal.class y Yylex.class).

    c:\> java cp . Parser suma.cal (Compila el programa suma.cal. Saca el resultado por pantalla)

    c:\> java cp . Parser suma.cal > suma.java

  • Prctica de Compiladores. Curso 2003/2004 7

    (compila el programa suma.cal. Escribe el resultado en el fichero suma.java)

    c:\> javac suma.java (compila el fichero suma.java) c:\> java cp . suma suma.java (ejecuta la clase suma)

    %{ import java.io.*; %} /* declaracion de tokens */ %token PROGRAMA PUNTOYCOMA %token IDENT /* aqui los otros tokens del lenguaje */ /* %type sent_asig */ /* aqui al declaracion de las cadenas para las sentencias */ %% /* codificacion de las producciones de la gramatica del lenguaje */ cabecera : PROGRAMA IDENT PUNTOYCOMA { System.out.println("class " + $2 + "{"); System.out.println($2 + "(){"); System.out.println(); System.out.println("}"); System.out.println("public static void main(String[] args) {"); System.out.println($2 + " v = new " + $2 + "();"); System.out.println("}"); System.out.println("}"); } ; %% /*.. aqu el cuerpo de los procedimientos para manejar la tabla de smbolos*/ /* definicin analizador lxico */ private Yylex lexer; /* yylex(): utliza el analizador lxico */ private int yylex () { int yyl_return = -1; try { yylval = new ParserVal(0); yyl_return = lexer.yylex(); } catch (IOException e) { System.err.println("IO error :"+e); } return yyl_return; } /* Mtodo para manejar errores */ public void yyerror (String error) { System.err.println ("Error: " + error); } /* Constructor: inicializa el analizador lxico */ public Parser(Reader r) { lexer = new Yylex(r, this); } /* main */ public static void main(String args[]) throws IOException { Parser yyparser; if ( args.length > 0 ) { // parse a file yyparser = new Parser(new FileReader(args[0])); yyparser.yyparse(); } else {

  • Prctica de Compiladores. Curso 2003/2004 8 System.err.println("usage: java -cp . Parser "); } }

    Figura 7. Listado de un ejemplo del fichero compilador.y

    Pruebas del compilador Para probar el compilador habr que definir un conjunto de programas ejemplo escritos en el lenguaje diseado, tres correctos, y seis incorrectos (con diferentes tipos de errores: sintcticos, semnticos, lxicos).

    Normas de entrega de la prctica El alumno deber entregar con la practica por correo electrnico a la direccin ([email protected]) una memoria en la que se incluir el siguiente material : Gramtica del lenguaje Listado del fuente jflex, reconoce.l Listado del compilador en byacc/Java; listado del fichero compilador.y y el fichero scanner.l Listado de los programas de prueba a los que se someti el compilador y sus respectivas salidas,

    entre los que se incluirn por lo menos, los indicados en el apartado anterior. Clases correspondientes a compilador y el analizado lxico. Clases correspondientes a reconoce.l Programas compilados que se utilizaron de prueba y que estn correctamente programados La fecha tope de entrega de la prctica es el da 14 de junio de 2004.

    Apndice 1. Las herramientas JFlex y byacc/Java En el libro de texto de la asignatura Compiladores. Principios, tcnicas y herramientas (Aho, A. ; Sheti, R. ; Ullman, J.D.) se incluye una introduccin de las herramientas lex y yacc. Aqu vamos a explicar las peculiaridades de las herramientas que elegidas, jflex y byacc/Java.

    JFlex En relacin a aspectos derivados de la programacin en JFlex, cabe destacar :

    La estructura de un fichero JFLEX es: Cdigo de usuario %% opciones y declaraciones %% reglas lxicas Para devolver un token se hace con return nombre-de-token. Cuando se reconoce un token NUMERO, no basta con que jflex devuelva que es un token

    NUMERO sino que adems debe devolver el valor de ste. Esto se hace con la siguiente accin, cuando se reconoce la expresin regular correspondiente a un numero: {

    try { yyparser.yylval = Interger.parser(yytext()); return Parser.NUMERO; } catch (java.lang.NumberFormatException e) { return Parser.ILEGAL; }

  • Prctica de Compiladores. Curso 2003/2004 9

    reconoce un token de tipo identificador, hay que devolver que es un token IDENT, y

    parser.yylval = new ParserVal(yytext()); + yytext() + ">" );

    s com analizador lxico. Para ello se incluye el siguiente par

    #"[^\n\r]* {}

    ara compilar cdigo en jflex y generar cdigo en Java o cualquier otro lenguaje:

    uando se escribe un programa en jflex, lo que hay que hacer es compilarlo, utilizando para ello el

    :\> jflex reconoce. l (llama a jflex y le da como entra el fichero , como

    c:\> javac Yylex.java do genera una clase

    c:\> java cp . Yylex suma.cal programa y le da como entrada un fichero con

    Yacc (Byacc/Java)

    on relacin a aspectos de programacin:

    La estructura de un fuente byacc/Java es:

    Se puede emplear cualquier definicin en la parte de cdigo de usuario.nticos. Se puede

    ara compilar un fichero y generar cdigo en Java para el compilador :

    las %token de generan las

    :\> yacc J compilador.y (llama a byacc/Java, y genera los ficheros Parser.java y

    c:\> jflex scanner.l mpila el scanner.) el cdigo generado por byacc

    s

    c:\> java cp . Parser suma.ca programa suma.cal. Saca el resultado por pantalla)

    } Cuando se

    el nombre de ste. Cuando se reconoce la expresin regular correspondiente a un identificador, se tiene que ejecutar la siguiente accin: { yy System.err.println("Es un identificador: javac Parser.java ParserVal.java Yylex.java (compilay genera las clase Parser.class, ParserVal.class y Yylex.class). l (Compila el

  • Prctica de Compiladores. Curso 2003/2004 10

    c:\> java cp . Parser suma.cal > suma.java (compila el programa suma .cal. Escribe el resultado en el fichero

    La realizacin de la prctica es obli

    forma que si no se aprueba la prctica de junio o no se resenta, la prctica se considera suspensa.

    pndice 2. Software para realizar la prctica

    realizar la prctica se encuentran isponibles en el CD-ROM de la escuela.

    suma.java)

    gatoria. Solo hay una convocatoria de prcticas, de p

    A Los archivos ejemplos de este anunciado y el software parad http://garoe.lsi.uned.es/compiladores

    Apndice 3. Mquina Virtual de Java y documentacin sobre el lenguaje Java

    lizar la prctica se requiere tener instalada una versin de la mquina virtual. Las herramientas roporcionadas han sido probadas con la versin 1.4.0, aunque no tiene por qu dar problemas con

    n sobre el lenguaje Java en el CD-ROM, en el material asociado a la signatura de Lenguajes de Programacin.

    racin de cdigo: No es necesario especificar modificadores de acceso public, protected, private.

    cceso por defecto.

    mo mtodos.

    Para reapversiones inferiores. Se puede obtener una en el CD-ROM de la escuela, en el material de la asignatura de Lenguajes de Programacin. Se puede encontrar documentacia Algunas pautas a tener en cuenta en la gene

    Todos los miembros pueden tener el modificador de a Todas las clases en Java que se deseen interpretar tienen que tener un mtodo main, cuyo

    prototipo es public static void main(String args[]). Una buena estrategia a seguir en la generacin de cdigo es generar las variables del

    programa como variables miembro, y los procedimientos y funciones co