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