Procesadores del Lenguaje
Compilador de Pascal
Entrega final
Grupo 2
Daniel Dionne GonzálezAlberto Milán Gutiérrez
Borja Gómez GómezAntonio de Miguel VicentiMiguel 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 final2
Procesadores del Lenguaje Práctica "Compilador de Pascal"
Entrega final3
Scanner.
Programado por el grupo 4:– Carlos Sánchez-Vellisco Sánchez– Martín Montalvo Martínez
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 final4
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 final5
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 final7
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 final8
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 final9
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 final10
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 final11
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 final12
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 final15
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 final16
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 final17
Pruebas con errores léxicos
Procesadores del Lenguaje Práctica "Compilador de Pascal"
Entrega final18
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;
begin ç := 3;
end.
Pruebas con errores sintácticos
Procesadores del Lenguaje Práctica "Compilador de Pascal"
Entrega final19
program prueba01;var a: integer;begin
a := ;end.
program prueba02;var a: integer;beginif (a<3)
a := a + a;end.
program prueba03;
var a: integer;
function Funcion (valor: integer) : integer;beginFuncion := 3;
begina := Funcion(3);end.
Pruebas con errores semánticos
Procesadores del Lenguaje Práctica "Compilador de Pascal"
Entrega final20
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}
var x: integer;
y: boolean;
function Funcion: integer;
var k : integer;
begin
k := 1;
end;
begin
x := Funcion;
end.
program prueba03;
{Error en el retorno de valores en funciones}
var x: integer;
y: boolean;
function Funcion: integer;
begin
Funcion:=3;
Funcion:=2;
end;
begin
x := Funcion;
end.
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}typeTCarta = record palo : integer; numero: integer; end; var x: TCarta; y: integer;
begin read(y); x.palo := y; read(y); x.numero := y; y := x.palo; write (y); y := x.numero; write (y); end.
program Prueba03; {devuelve el mayor}var a : integer; b : integer;
begin read(a); read(b); if (a<b) then write(a) else write(b); end.
Procesadores del Lenguaje Práctica "Compilador de Pascal"
Entrega final21
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;
end;
begin
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.
Procesadores del Lenguaje Práctica "Compilador de Pascal"
Entrega final22