You are on page 1of 19

Análisis semántico

Tabla de símbolos, chequeo de tipos y


representaciones internas

Análisis semático c 2001 José Fortes Gálvez – p.1


¿Análisis? ... ¿semántico?
La semántica corresponde al significado asociado a las
estructuras formales (sintaxis) del lenguaje.

Análisis semático c 2001 José Fortes Gálvez – p.2


¿Análisis? ... ¿semántico?
La semántica corresponde al significado asociado a las
estructuras formales (sintaxis) del lenguaje.
Como las gramáticas (E)BNF —además normalmente
limitadas a LR o LL— no pueden describir todos los
elementos sintácticos del lenguaje, se hace preciso algún
análisis adicional...

Análisis semático c 2001 José Fortes Gálvez – p.2


¿Análisis? ... ¿semántico?
La semántica corresponde al significado asociado a las
estructuras formales (sintaxis) del lenguaje.
Como las gramáticas (E)BNF —además normalmente
limitadas a LR o LL— no pueden describir todos los
elementos sintácticos del lenguaje, se hace preciso algún
análisis adicional...
Así, se denomina tradicionalmente “análisis semántico” a
todo aquello que forma parte del 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 representaciones internas

Análisis semático c 2001 José Fortes Gálvez – p.2


Ejemplo de extensión
del análisis sintáctico
La tabla de símbolos permite que el analizador léxico
devuelva un token distinto según la categoría del
identificador en ese contexto. Con esta técnica:
En el fondo, estamos introduciendo “dependencia del
contexto” sobre una gramática independiente del
contexto.
Por tanto, aumentamos la potencia del
análisis sintáctico
Podemos resolver algunos conflictos y así evitar
modificar la gramática o el lenguaje

Análisis semático c 2001 José Fortes Gálvez – p.3


Tabla de símbolos
Va conteniendo un registro por cada identificador definido
por el programador (o predefinidos), añadiéndose
informació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 (número)
Cuál es su tipo (enlace)
Otra información: tamaño, ubicación, valor, parámetros
o campos (enlaces), refencia adelante o no, ámbito que
define, etc.

Análisis semático c 2001 José Fortes Gálvez – 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 la de
una tabla hash, asociada a pila de ámbitos activos.
Truco: mover (insertar, al menos) el elemento actual a
la cabeza de la lista
Las ristras (identificadores, constantes) pueden ir en
lista(s) aparte.
Análisis semático c 2001 José Fortes Gálvez – p.5
Una buena función hash
Si llamamos a los códigos de los caracteres y la



longitud de la ristra:





 



 




 
















Pueden usarse valores de (preferentemente) o







(más rápido pero peor distribución)

Análisis semático c 2001 José Fortes Gálvez – p.6


Chequeos de tipos (y otros)
Un compilador debe realizar una serie de chequeos
está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 chequeos
dinámicos (p.e., valor dentro de rango).
Análisis semático c 2001 José Fortes Gálvez – p.7
Definiciones de tipos
También llamadas “expresiones de tipos”, en las que el
programador desarrolla los componentes de la estructura.
Cuestiones:
Puede ser conveniente construir un árbol/grafo:
En caso de equivalencia estructural
Para comprobación de no-ciclicidad:
type a=b; b=a;
(Descomponer en) subtipos anónimos

Referencias adelante o declaraciones de tipos, necesarias


para definiciones recursivas: entrada en tabla provisional-
mente “vacía” para tipo base.

Análisis semático c 2001 José Fortes Gálvez – p.8


El árbol sintáctico abstracto (1/2)
En inglés (abstract) syntax tree, AST, para distinguirlo del
árbol del análisis según la gramática [parse tree].


if(a<3) b=2*a; ;

if-then

< :=

a 3 b *

2 a

Análisis semático c 2001 José Fortes Gálvez – p.9


El árbol sintáctico abstracto (2/2)
Representación compacta correspondiente a una gramática
sin limitaciones de método de análisis, caracterizada por
que los nodos interiores son operadores, en sentido amplio.
Útil para ser “anotado” o “decorado” con atributos en
recorridos ulteriores, y a partir de ahí:
Realizar chequeos
Generar código (intermedio)

Con frecuencia se puede simular su recorrido (sin construir-


lo) durante el análisis sintáctico.

Análisis semático c 2001 José Fortes Gálvez – p.10


Representaciones intermedias (1/2)
Constituye la frontera entre front-ends y back-ends, y
permite desacoplar los diseños de unos y otros. Orientadas
a:
1. Su optimización (instruccines claras y simples)
2. Generar código de distintas máquinas objeto

El diseño debe permitir su fácil generación por el analizador


semático.

Análisis semático c 2001 José Fortes Gálvez – p.11


Representaciones intermedias (2/2)
Podemos clasificarlas por su nivel de abstracción (distancia
a la máquina objeto real):
Alto: próxima al árbol abstracto, con correspondencia
con las estructuras del lenguaje
Medio: instrucciones de máquina virtual (a veces
realmente implementada: P-code, bytecode), tales
como tuplas de tres direcciones
Bajo: máquina próxima al ensamblador, con un amplio
número de registros

Algunos compiladores pasan por varias representaciones


de distintos niveles de abstracción.

Análisis semático c 2001 José Fortes Gálvez – p.12


Cuádruplas
Operaciones con hasta tres direcciones, que pueden ser
variables del programa o temporales:
#
"

$
!


Ó ó
#
$

$
!

!



" %
$ &

%
!" &
ó

$
!



ó
(

+
'

*
)

)
#






"


, ..., ,

2311
-,
,

-,
,

0
,
#

.

.

Podemos entenderlas como una linealización de un cierto


tipo de árbol abstracto.

Análisis semático c 2001 José Fortes Gálvez – p.13


Ejemplo de cuádruplas
...
:= i a
:= t8 b
for i in a..b do if > goto i t8 L5
... L4: ...
endfor; if = goto i t8 L5
:= + i i 1
goto L4
L5: ...

Análisis semático c 2001 José Fortes Gálvez – p.14


C/C++ como lenguaje objeto
Generar “cuádruplas” en C/C++ aporta ventajas:
Nos ahorramos programar (al menos inicialmente) la
generación de código objeto “real”
Permite descargar en C/C++ la mayor parte de la
gestión de pila, heap, E/S, ...
Permite aprovechar la optimización de un buen
compilador de C/C++
Independencia de la máquina objeto (o casi: tamaños
de referencias, p.e.) y del s.o.

con los inconvenientes de que la eficiencia de los ejecuta-


bles no será óptima y de estar sujetos a las limitaciones del
compilador de C/C++.
Análisis semático c 2001 José Fortes Gálvez – p.15
“Cuádruplas” en C/C++
Sólo instrucciones elementales de hasta 3 “direcciones”.
Posible implementación para lenguajes imperativos:
Una función void C/C++ por cada rutina del lenguaje
fuente
Se crean localmente variables temporales conforme se
necesitan (C++ más práctico); el optimizador las podrá
eliminar en su caso
Una union de vectores de tipos básicos contendrá las
variables de cada ámbito, incluyendo las auxiliares
como enlaces, parámetros, ...
Si áreas locales englobadas: gestionar pila de punteros
usando enlaces estáticos o display

Análisis semático c 2001 José Fortes Gálvez – p.16


Conclusión
Elementos mínimos para la práctica de análisis semántico:
Implementar una tabla de símbolos (no es necesario
que sea hash)
Implementar al menos parte del chequeo de tipos del
lenguaje

Como mínimo, para la prática de generación de código,


“cuádruplas” en C/C++. Se valorarán especialmente apor-
taciones adicionales.

Análisis semático c 2001 José Fortes Gálvez – p.17

You might also like