Procesadores del Lenguaje Compilador de Pascal Entrega final Grupo 2 Daniel Dionne González Alberto Milán Gutiérrez Borja Gómez Gómez Antonio de Miguel Vicenti Miguel Martínez Segura
Objetivos. Registros IF-THEN-ELSE (gramática LL(2) forzada) Bucle FOR Funciones Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Scanner. Programado por el grupo 4: Carlos Sánchez-Vellisco Sánchez Martín Montalvo Martínez Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Scanner. Reglas. Tokens de 4 atributos Tipo de token, atributos, línea y columna Generación del scanner directamente a partir de las expresiones regulares. Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Scanner. Herramientas. Scanner generado con Jflex. Interpreta las expresiones regulares con sus acciones semánticas asociadas. Genera un analizador léxico que reconoce el texto y va produciendo tokens. Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Scanner. Detalles destacables. Gestor de errores Clase interna del scanner Según el error lanzado devuelve el mensaje, la línea y la columna. Relación con la TS Se configuran los atributos “lexema” y “tipo-token”
Parser. Programado por el grupo 4: Carlos Sánchez-Vellisco Sánchez Martín Montalvo Martínez Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Parser. Reglas. Parser descendente no recursivo predictivo (tabular) Basado en gramática LL(1), excepto por el problema del else en la producción del if Traducción dirigida por sintaxis Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Parser. Herramientas. Parser generado con SLK. Convierte una gramática definida en notación similar a EBNF en un parser. Deja espacio para rellenar las reglas semánticas pertinentes. Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Semántico. Programado por el grupo 2: Antonio De Miguel Vicenti Daniel Dionne González Miguel Martínez Segura Alberto Milán Gutiérrez Borja Gómez Gómez Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Semántico. Reglas. Está fuertemente unido al parser Realiza las comprobaciones necesarias sobre la salida del parser Llama al generador de código en las producciones pertinentes Inserción de tipos en la tabla de símbolos Apertura y cierre de ámbitos Modo debug detallado Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Semántico. Herramientas. Semántico generado completando el parser cedido por el grupo 4, añadiendo las acciones necesarias Librería SWT para ver la salida por pantalla Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Semántico. Detalles destacables I Clase Nodo. Objeto similar a un token, con los mismos atributos, pero que almacena la información de los elementos terminales y no terminales de la gramática. Uso de dos pilas auxiliares sincronizadas. Objetivo: Controlar la ejecución de las reglas de la gramática. Pila: Almacena los Nodos habituales de las reglas de la gramática. PilaLista: Almacena, en caso de obtener una lista de elementos desde la gramática mediante el parser, una copia básica para llevar la contabilidad de éstos.
Semántico. Detalles destacables II Clase “OptionalNonTerminals”. Contiene un tipo enumerado con todas las situaciones opcionales de la gramática. Con estos enumerados se crea un array de flags. En las acciones semanticas se consultan estos flags para gestionar la interaccion con la TS. Ejemplos: Operadores Encontrarse dentro de una declaración de función
Generador de código. Programado por el grupo 2: Antonio De Miguel Vicenti Daniel Dionne González Miguel Martínez Segura Alberto Milán Gutiérrez Borja Gómez Gómez Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Generador de código. Reglas. El semántico genera los datos necesarios, recupera los tipos y llama al generador de código El generador lleva un contador de etiquetas y una pila de variables para manejar la pila de datos en memoria Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Generador de código. Herramientas. No se han utilizado herramientas de desarrollo en esta parte Se utiliza el intérprete ENS2001 para probar el código generado Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Pruebas con errores léxicos program Prueba01; {cadena mal formada} var z : integer; x : integer; y : integer; begin x := 3.2.1 + z; write (x); end. program Prueba02; {carácter no reconocido} var ç : integer; ç := 3; Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Pruebas con errores sintácticos program prueba01; var a: integer; begin a := ; end. program prueba02; if (a<3) a := a + a; program prueba03; function Funcion (valor: integer) : integer; Funcion := 3; a := Funcion(3); Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Pruebas con errores semánticos program prueba01; {Errores en la comprobación de tipos} var x: integer; y: boolean; begin x := y; end. program prueba02; {Error en el retorno de valores en funciones} function Funcion: integer; var k : integer; k := 1; end; x := Funcion; program prueba03; Funcion:=3; Funcion:=2; Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Código de prueba (I) program Prueba01; {Op. Arit. simple } var z : integer; x : integer; y : integer; begin read(z); read(y); x := y + z; write (x); end. program prueba02; {Prueba de escritura y lectura con registros} type TCarta = record palo : integer; numero: integer; end; var x: TCarta; y: integer; x.palo := y; x.numero := y; y := x.palo; write (y); y := x.numero; program Prueba03; {devuelve el mayor} var a : integer; b : integer; read(a); read(b); if (a<b) then write(a) else write(b); Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final
Código de prueba ( y II) program Prueba04; {multiplica con sumas a*b} type TReg = record m1 : integer; m2 : integer; resultado : integer; end; var a,b : integer; x,y : integer; mult : TReg; function funcion (k : integer): integer; begin funcion := 0; y := funcion(1); read(a); mult.m1:=a; read(b); mult.m2:=b; if (mult.m1=1) then mult.resultado:=b else for x := 1 to mult.m2 do mult.resultado := mult.resultado+mult.m2; y:=mult.resultado; write(y) end. 22 Procesadores del Lenguaje Práctica "Compilador de Pascal" Entrega final 22