Análisis semánticoserdis.dis.ulpgc.es/~ii-pl/ftp/transp/tr-asem-imp.pdf · 2006-01-25 ·...

Preview:

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 .