Procesadores de Lenguajes - Departamento de Lenguajes y

Anuncio
Departamento de Lenguajes y Sistemas Informáticos
Procesadores de Lenguajes
LABORATORIO 7: ANÁLISIS SEMÁNTICO
OBJETIVO
Construir un analizador semántico con la tecnología ANTLR. Se supone que el ejercicio
propuesto se ha trabajado previamente.
DURACIÓN: 2 sesiones.
EJERCICIO
Supongamos un lenguaje llamado L0 diseñado para expresar programas imperativos como el
mostrado en el siguiente ejemplo.
programa:
variables locales:
booleano resultado;
entero elemento, i;
vector(entero)[10] v;
instrucciones:
elemento=6;
v[3]=6;
resultado=falso;
i=1;
mientras (resultado == falso y i<=n) hacer
si (elemento == v[i]) entonces
resultado = cierto;
sino
i=i+1;
finsi
finmientras
si (resultado == cierto) entonces
escribir(i-1);
si no
escribir(0);
finsi
fin
Un programa L0 se estructura mediante un conjunto de variables locales y una secuencia de
instrucciones. Los tipos en L0 son el tipo entero, el tipo booleano, el tipo vector de enteros y el
vector de booleanos. La declaración de un vector incluirá el número de componentes
comenzando desde la posición 1. L0 tiene 4 tipos de instrucciones: asignaciones, iteraciones,
condicionales y escritura de expresiones enteras.
1
Departamento de Lenguajes y Sistemas Informáticos
Procesadores de Lenguajes
SE PIDE: Analizador semántico que detecte el uso de variables no declaradas y problemas de
tipos en las expresiones (no poder decidir el tipo de una expresión). La solución debe
implementarse con un tree-parser para asas generados con el siguiente parser.
class Anasint extends Parser;
options{
buildAST=true;
}
tokens{
VARIABLESLOCALES;
DECL_VARS;
}
programa!: a:PROGRAMA DP b:variableslocales c:instrucciones EOF
{#programa = #(#a,#b,#c);}
;
variableslocales !: VARIABLES LOCALES DP a:variables
{#variableslocales = #(#[VARIABLESLOCALES,"variables locales"], #a);}
;
variables :
|
;
decl_vars variables
decl_vars !: t:tipo v:vars PyC!
{#decl_vars = #(#[DECL_VARS,"declaracion"],#t,#v);}
;
vars : (IDENT COMA)=> IDENT COMA! vars
| IDENT
;
instrucciones: INSTRUCCIONES^ DP! (instruccion)* FIN!
;
instruccion :
|
|
|
;
asignacion
iteracion
seleccion
escribir
asignacion : (IDENT CA)=> IDENT^ CA! expr CC! ASIG^ expr PyC!
| IDENT ASIG^ expr PyC!
;
iteracion: MIENTRAS^ PA! expr PC! HACER! bloque FINMIENTRAS!
;
seleccion:
|
;
(SI PA expr PC ENTONCES bloque SINO) =>
SI^ PA! expr PC! ENTONCES! bloque SINO! bloque FINSI!
SI^ PA! expr PC! ENTONCES! bloque FINSI!
2
Departamento de Lenguajes y Sistemas Informáticos
Procesadores de Lenguajes
escribir: ESCRIBIR^ PA! expr PC! PyC!
;
bloque : (instruccion)*
;
tipo: VECTOR^ PA! tipo PC! CA! NUMERO CC!
| ENTERO
| BOOLEANO
;
expr:
|
|
|
;
(NO expr) => NO^ expr
(expr1 (Y|O)) => expr1 (Y^|O^) expr
PA! expr PC!
expr1
expr1: NO^ expr2
| expr2
;
expr2 : (expr3 (MAYOR|MENOR|MAYORIGUAL|MENORIGUAL|IGUAL|DISTINTO)) => expr3
(MAYOR^|MENOR^|MAYORIGUAL^|MENORIGUAL^|IGUAL^|DISTINTO^) expr3
| expr3
;
expr3 : MENOS^ expr3
| (expr4 (MAS|MENOS|POR|DIV)) => expr4 (MAS^|MENOS^|POR^|DIV^) expr3
| expr4
;
expr4:
|
|
|
|
;
(IDENT CA) => IDENT^ CA! expr CC!
IDENT
NUMERO
FALSO
CIERTO
3
Descargar