Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Análisis semánticoTabla de símbolos, chequeo de tipos y
representaciones internas
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.1 .
¿Análisis? ... ¿semántico?
La semántica corresponde al significado asociado a lasestructuras formales (sintaxis) del lenguaje.
Como las gramáticas (E)BNF —además normalmentelimitadas a LR o LL— no pueden describir todos loselementos sintácticos del lenguaje, se hace preciso algúnanálisis adicional...Así, se denomina tradicionalmente “análisis semántico”a todo aquello que forma parte del frontal [front-end]más allá de lo que la gramática utilizada nos permite:
Tabla de símbolos
Chequeos de tipos (y otros)
Generación de representación interna
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.2 .
¿Análisis? ... ¿semántico?
La semántica corresponde al significado asociado a lasestructuras formales (sintaxis) del lenguaje.Como las gramáticas (E)BNF —además normalmentelimitadas a LR o LL— no pueden describir todos loselementos sintácticos del lenguaje, se hace preciso algúnanálisis adicional...
Así, se denomina tradicionalmente “análisis semántico”a todo aquello que forma parte del frontal [front-end]más allá de lo que la gramática utilizada nos permite:
Tabla de símbolos
Chequeos de tipos (y otros)
Generación de representación interna
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.2 .
¿Análisis? ... ¿semántico?
La semántica corresponde al significado asociado a lasestructuras formales (sintaxis) del lenguaje.Como las gramáticas (E)BNF —además normalmentelimitadas a LR o LL— no pueden describir todos loselementos sintácticos del lenguaje, se hace preciso algúnanálisis adicional...Así, se denomina tradicionalmente “análisis semántico”a todo aquello que forma parte del frontal [front-end]más allá de lo que la gramática utilizada nos permite:
Tabla de símbolos
Chequeos de tipos (y otros)
Generación de representación interna
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.2 .
¿Análisis? ... ¿semántico?
La semántica corresponde al significado asociado a lasestructuras formales (sintaxis) del lenguaje.Como las gramáticas (E)BNF —además normalmentelimitadas a LR o LL— no pueden describir todos loselementos sintácticos del lenguaje, se hace preciso algúnanálisis adicional...Así, se denomina tradicionalmente “análisis semántico”a todo aquello que forma parte del frontal [front-end]más allá de lo que la gramática utilizada nos permite:
Tabla de símbolos
Chequeos de tipos (y otros)
Generación de representación interna
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.2 .
Ejemplo de extensióndel análisis sintáctico
La tabla de símbolos permite que el analizador léxicodevuelva un token distinto según la categoría delidentificador en ese contexto. Con esta técnica:
En el fondo, estamos introduciendo “dependenciadel contexto” sobre una gramática independiente delcontexto.
Por tanto, aumentamos la potencia delanálisis sintáctico
Podemos resolver algunos conflictos y así evitarmodificar la gramática o el lenguaje
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.3 .
Tabla(s) de símbolos
Va conteniendo un registro por cada identificadordefinido/declarado por el programador, añadiéndoseinformación asociada:
Ristra del identificador (¿mayúsculas y minúsculas?)
Categoría: variable, constante, tipo, campo,procedimiento, función, parámetro, clase, etiqueta,módulo, macro, etc.
A qué ámbito pertenece (profundidad)
Otra información según categoría: tamaño;ubicación; valor; enlaces a tipo, parámetros ocampos; si incompletamente definido; etc.
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.4 .
Estructura de la tabla de símbolos
Su estructura lógica viene determinada por:El tipo de ámbito (estático o dinámico)Los mecanismos de ámbito del lenguaje:procedimientos, bloques, herencia, módulos,espacios de nombres, registros, with, ...Si se da más de una pasada.Compilación separada: ficheros con tablas
Su implementación física más eficiente suele ser lade una tabla hash, asociada a pila de ámbitos activos.
Truco: mover (insertar, al menos) el elemento actual a lacabeza de la lista
Las ristras (identificadores, constantes) pueden ir enlista(s) aparte. Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.5 .
Ejemplo de tabla de símbolos
↓ char c;
↓ int s(double, int);
↓ int main() {
↓ typedef double real;
↓ while (c==0) {
↓ real y = 0.1;
↓ int c = 1;
↓ c = s(y, c);
↓ }
↓ }
↓ int i = -1;
↓ int s(double c, int d) {
↓ return c+d;
↓ }
main
?
?
s
c
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.6 .
Ejemplo de tabla de símbolos
↓ char c;
↓ int s(double, int);
↓ int main() {
↓ typedef double real;
↓ while (c==0) {
↓ real y = 0.1;
↓ int c = 1;
↓ c = s(y, c);
↓ }
↓ }
↓ int i = -1;
↓ int s(double c, int d) {
↓ return c+d;
↓ }
main
real
?
?
s
c
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.6 .
Ejemplo de tabla de símbolos
↓ char c;
↓ int s(double, int);
↓ int main() {
↓ typedef double real;
↓ while (c==0) {
↓ real y = 0.1;
↓ int c = 1;
↓ c = s(y, c);
↓ }
↓ }
↓ int i = -1;
↓ int s(double c, int d) {
↓ return c+d;
↓ }
main
real
y
c
?
?
s
c
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.6 .
Ejemplo de tabla de símbolos
↓ char c;
↓ int s(double, int);
↓ int main() {
↓ typedef double real;
↓ while (c==0) {
↓ real y = 0.1;
↓ int c = 1;
↓ c = s(y, c);
↓ }
↓ }
↓ int i = -1;
↓ int s(double c, int d) {
↓ return c+d;
↓ }
main
real
?
?
s
c
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.6 .
Ejemplo de tabla de símbolos
↓ char c;
↓ int s(double, int);
↓ int main() {
↓ typedef double real;
↓ while (c==0) {
↓ real y = 0.1;
↓ int c = 1;
↓ c = s(y, c);
↓ }
↓ }
↓ int i = -1;
↓ int s(double c, int d) {
↓ return c+d;
↓ }
main
?
?
s
c
i
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.6 .
Ejemplo de tabla de símbolos
↓ char c;
↓ int s(double, int);
↓ int main() {
↓ typedef double real;
↓ while (c==0) {
↓ real y = 0.1;
↓ int c = 1;
↓ c = s(y, c);
↓ }
↓ }
↓ int i = -1;
↓ int s(double c, int d) {
↓ return c+d;
↓ }
main
d
c
s
c
i
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.6 .
Ejemplo de tabla de símbolos
↓ char c;
↓ int s(double, int);
↓ int main() {
↓ typedef double real;
↓ while (c==0) {
↓ real y = 0.1;
↓ int c = 1;
↓ c = s(y, c);
↓ }
↓ }
↓ int i = -1;
↓ int s(double c, int d) {
↓ return c+d;
↓ }
main
s
c
i
d—c—
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.6 .
Una función de dispersión [hashing]
Sean ci los códigos de los caracteres de la ristrar = c1 · · · cn. Para enteros de w bits, tabla de tamañoT = 2p, y p.e. q = 613 y a ' (
√5− 1)/2 :
k1 = c1
ki = (qki−1 + ci) mod 2w, 1 < i ≤ n
h = bT (kna mod 1)c, 0 < a < 1
Si doble dispersión [rehashing], usando p.e. a′ ' e/9para h′:
hj = (h+ j(2bh′/2c+ 1)) mod T, j = 0, 1, . . .
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.7 .
Chequeos de tipos (y otros)
Un compilador debe realizar una serie de chequeosestáticos, como chequeos de tipos:
Consistencia: unicidad, existencia, no-ciclicidad, ...
Equivalencia y compatibilidad de tipos
Conversión explícita [cast] o forzada [coercion]
Inferencia de tipos (en valores)
Sobrecarga de funciones y operadores
Funciones polimórficas,
u otros (p.e., consistencia de instrucciones de control).
En otros casos, debe generar código para realizar che-
queos dinámicos (p.e., valor dentro de rango).Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.8 .
Definiciones de tipos
También llamadas “expresiones de tipos”, en las que elprogramador desarrolla los componentes de la estructura.Cuestiones:
Puede ser conveniente construir un árbol/grafo:En caso de equivalencia estructuralPara comprobación de no-ciclicidad:type a=b; b=a;
(Descomponer en) tipos anónimos
Las definiciones incompletas (declaraciones) son necesa-
rias para definiciones recursivas: entrada en tabla provi-
sionalmente “vacía” para tipo base.Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.9 .
El árbol sintáctico abstracto (1/2)
En inglés (abstract) syntax tree, AST, para distinguirlo del árbol delanálisis según la gramática [parse tree].
if(a<3) {b=2*a;};
2 a
*a 3
<
b
if-then
:=
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.10 .
El árbol sintáctico abstracto (2/2)
Representación compacta correspondiente a unagramática sin limitaciones de método de análisis,caracterizada por que los nodos interiores sonoperadores, en sentido amplio.
Útil para ser “anotado” o “decorado” con atributosen recorridos ulteriores, y a partir de ahí:
Realizar chequeosGenerar código (intermedio)
Con frecuencia se puede simular su recorrido (sin cons-
truirlo) durante el análisis sintáctico.
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.11 .
Representaciones internas (1/2)
Intermedias entre frontal [front-end] y dorsal [back-end],permiten desacoplar los diseños de unos y otros.Orientadas a:
Su optimización (instrucciones claras y simples)
Generar código de distintas máquinas objeto
El diseño debe permitir su fácil generación por el analiza-
dor semático.
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.12 .
Representaciones internas (2/2)
Podemos clasificarlas por su nivel de abstracción(distancia a la máquina objeto real):
Alto: próxima al árbol abstracto, concorrespondencia con las estructuras del lenguaje
Medio: instrucciones de máquina virtual (a vecesrealmente implementada: P-code, bytecode), talescomo tuplas de tres direcciones
Bajo: máquina próxima al ensamblador, sinrestricción de número de registros
Algunos compiladores pasan por varias representaciones
de distintos niveles de abstracción.
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.13 .
Cuádruplas
Operaciones con hasta tres direcciones, que pueden servariables del programa o temporales:
x := y op z
Ó x := op z ó x := z
x := y[z] ó x[y] := z
if x op y goto L ó goto L
param x1, ..., param xn, call p(n)
Podemos entenderlas como una linealización de un cierto
tipo de árbol abstracto.
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.14 .
Ejemplo de cuádruplas
for i in a..b do
...
endfor;
...:= i a:= t8 b
if >goto i t8 L5L4: ...
if = goto i t8 L5:= + i i 1goto L4
L5: ...
Analisis sematico v1.2 c©2005 Jose Fortes Galvez– p.15 .