Vous êtes sur la page 1sur 18

1

Cadena de
tokens

Árbol Grafo de Eval. reglas


Sintáctico dependencias semánticas

ANÁLISIS SEMÁNTICO

Análisis Semántico
2

… Comprobación estática
† Comprobación de tipos
„ La aplicación de los operadores y operandos deben ser compatibles
† Comprobaciones del flujo del control
„ Las proposiciones que hacen que se abandone el flujo del control de
una construcción debe tranferirse a otro punto. (break, exit)
† Comprobaciones de unicidad
„ Hay situaciones en los que un objeto solo puede definirse una vez
exclusivamente. Las etiquetas de una sentencia case no deben
repetirse, declaraciones de objetos,..
† Comprobaciones relacionadas con nombre
„ El mismo nombre debe aparecer dos o más veces. En Ada el nombre
que aparece en un bloque puede aparecer al principio y final, el
compilador debe comprobar que se utiliza el mismo el ambos sitios

1
Análisis Semántico
3

† Además de comprobar que un programa cumple con las reglas de la


gramática, hay que comprobar que lo que se quiere hacer tiene sentido
† E t fase
Esta f tambíen
t bí modificadifi lla ttabla
bl dde símbolos
í b l y suele
l estar
t mezclada
l d
con la generación de código intermedio
† Las gramáticas independientes del contexto (G2) no son suficientes para
realizar el análisis semántico
† Por ejemplo, no hay forma de comprobar si una variable ha sido
definida ya, o si existe una determinada etiqueta
† Es necesario definir un tipo de gramática más rica como las gramáticas
de atributo
… Definición
† Las gramáticas de atributo son gramáticas G2 a las que se añaden
atributos y reglas de evaluación de atributos (funciones/reglas
semánticas)

El Analizador Semántico
4

… Traducción dirigida por sintaxis

Autómata a pila
(Gramática independiente
del contexto)
Traductor
+ Dirigido por
Sintaxis
Acciones Semánticas

Cadena Árbol de Análisis Grafo de Orden de Evaluación


De entrada Sintáctico Dependencias de las reglas Semánticas

2
Traducción dirigida por sintaxis
5

… Notaciones
† Definición dirigida por la sintaxis (DDS)
† Esquema de Traducción (EDT)

… Evaluación de una acción


† Generación de código
g
† Guardar/Consultar información de la Tabla de Símbolos
† Notificación de mensajes de error

Traducción dirigida por sintaxis


6

… Definición dirigida por la sintaxis


† C d símbolo
Cada í b l tiene
ti un conjunto
j t ded atributos
t ib t asociados
i d
„ Atributo: una cadena, número, tipo, posición de memoria, etc
„ NombredeSímbolo.NombredeAtributo

† Cada producción A=α tiene asocida un conjunto de acciones


semánticas que se representan como una función:
„ X.atr=f (Y1.atr, ..., Yn.atr)
… Dos tipos de atributos
† Sintetizados (locales)
„ El valor a asignar a un nodo depende del valor de los nodos hijos
† Heredados
„ Se pasan a niveles inferiores del árbol. Su valor depende del valor
de los hermanos y del padre.

3
Traducción dirigida por sintaxis
7

… Ejemplo
† Sintetizados,
Sintetizados CALCULADORA
CALCULADORA, Análisis Ascendente

Producción Reglas Semánticas


L→E n print (E.val)
E→E1 + TE.val := E1.val + T.val
E→T E.val := T.val
T T1 * F T.val
T→T T l := T1.vall * F.val
F l
T→F T.val := F.val
F→( E ) F.val := E.val
F→dígito F.val := dígito.valex

Traducción dirigida por sintaxis


8

… Ejemplo
† Heredados,
H d d INFORMACIÓN DE TIPOS

Producción Reglas Semánticas


D→T L L.her := T.tipo
T→int T.tipo := integer
T→real T tipo ::= real
T.tipo
L→L1 , id L1.her := L.her
añadetipo (id.entrada, L.her)
L→id añadetipo (id.entrada, L.her)

4
Grafos de Dependencias
9

… Si un atributo b en un nodo depende de un atributo


c, entonces se debe evaluar
e al ar la regla semántica
para b después de la regla semántica que define a
c
… Las interdependencias entre atributos heredados y
sintetizados de un árbol de análisis sintáctico se
pueden
d representar t mediante
di t un grafo f dirigido
di i id
llamado Grafo de Dependencias

Grafo de Dependencias
10

… Algoritmo de Construcción

Para cada nodo n en el árbol de análisis sintáctico hacer


Para cada atributo a del símbolo gramatical en el nodo n hacer
Construir un nodo en el grafo de dependencias para a;
Para cada nodo n en el árbol de análisis sintáctico hacer
Para cada regla semántica b:=f(c1, c2, ..., ck) asociada con la producción
utilizada en n hacer
Para cada i:=1 hasta k hacer
Construir una arista desde el nodo ci hasta el nodo para b;
val
E
Producción Regla Semántica
E→E1+E2 E.val:=E1.val+E2.val
E1 val + E2 val

5
Grafo de Dependencias
11

… Ejemplo:
† reall id1, id2, id3

4
T.tipo=real L.her=real 6
her 5
tipo

3 entrada
her id3
real 7 L.her=real 8 ,

her
9 L.her=real 10 , 2 entrada
id2

id1
1 entrada

Grafo de dependencias
12

… Evaluación de las reglas semánticas


† Métodos con árbol de análisis sintáctico
„ Se realiza en el momento de compilación
„ El orden se obtiene de un ordenamiento topológico del grado de
dependencias construido según el árbol de análisis sintáctico para
cada entrada
„ Si hay ciclos no funciona
† Métodos basados en reglas
„ Se realiza en el momento de construcción del compilador
„ Las reglas semánticas asociadas con las producciones se analizan a
mano
„ No necesita construir un grafo de dependencias de forma explícita
† Métodos “sin recuerdo”
„ Para realizar el orden de evaluación no tiene en cuenta las reglas
semánticas. Por ejemplo en el momento de análisis sintáctico
„ No necesita construir un grafo de dependencias de forma explícita

6
Evaluación Ascendente de Definiciones con Atributos
Sintetizados (I)
13

… Los atributos sintetizados se pueden evaluar con un analizador


sintáctico ascendente conforme la entrada es analizada
… El analizador sintáctico conserva en su pila los valores de los
atributos sintetizados asociados a los símbolos gramaticales
… Cuando se hace una reducción se calculan los valores de los
nuevos atributos sintetizados a partir de los atributos de la
pila para los símbolos gramaticales del lado derecho de la
producción

Estado Val
... ...

Tope X X.x
Y Y.y

Evaluación Ascendente de Definiciones con Atributos


Sintetizados (II)
14

… Ejemplo:
† Producción
P d ió F
Fragmento d
de Código
Códi
L→E n print (val [tope])
E→E1 + T val [ntope] := val [tope-2] + val [tope]
E→T
T→T1 * F val [ntope] := val [tope-2] × val [tope]
T→F
F→( E ) val [ntope] := val [tope-1]
F→dígito F.val := dígito.valex

7
Definiciones con Atributos por la
15
Izquierda
… Si la traducción ocurre durante el análisis sintáctico, el orden de evaluación de los
atributos se corresponde con el orden en el que se “crean” los nodos de un árbol
de análisis sintáctico
… Un orden natural para los métodos de traducción descendente y ascendente es el
“orden de evaluación en profundidad”

procedimiento visitaprof (n:nodo)


empezar
para cada hijo
p j m de n,, de izquierda
q a derecha
hacer empezar
evaluar los atributos heredados de m;
visitarprof (m)
fin;
evaluar los atributos sintetizados de n
fin

Esquema de Traducción
16

… Cada símbolo tiene un conjunto de atributos asociados


† Nombre de Símbolo Nombre de Atributo
Nombre_de_Símbolo.Nombre_de_Atributo
… Las acciones semánticas se intercalan con los símbolos del
consecuente
† X::=ab {accion();} b
… Orden de evaluación fijo
… Dos tipos
† EDT sólo con atributos sintetizados
„ Acciones al final de la producción
† EDT con atributos sintetizados y heredados
„ Atributos heredados de un símbolo del consecuente
„ Atributos sintetizados utilizados en acciones
„ Atributos sintetizados del antecedente

8
Esquema de Traducción
17

… Sólo con atributos sintetizados


† Una
U acción
ió para cadad reglal semántica
á i
† Se coloca al final del lado derecho de la producción
Producción Regla Semántica
T→T1*F T.val:=T1.val x F.val
T→T1*F {T.val:=T1.val x F.val}
… Con atributos heredados y sintetizados
† Un atributo heredado para un símbolo en el lado derecho de una producción
debe calcularse en una acción antes que dicho símbolo
† Una acción no debe referirse a un atributo sintetizado de un símbolo que esté a la
derecha de la acción
† Un atributo sintetizado para el NO terminal de la izquierda solo puede calcularse
después de que se hayan calculado todos los atributos a los que hace referencia.
(La acción se sitúa al final del lado derecho de la producción)

Generación de Código Intermedio


18

… Proceso de Síntesis
† Lenguaje Intermedio
† Generación de Código
… Ventajas del código intermedio
† Facilitar la fase de optimización
† Aumentar la portabilidad del compilador de una máquina a otra
„ Se puede utilizar el mismo analizador para diferentes generadores
„ Se pueden utilizar optimizadores independientes de la máquina

† Facilitar la división en fases del proyecto


Generador
Fuente Scanner Parser LI de
Objeto
Código

TDS

9
Tipos de representaciones intermedias
19

… Notación Polaca Inversa (RPN)


† Los operadores van después de los operandos
„ S=A+B*C → SABC*+=
† Ventajas
„ Facilidad para generar código a partir de ella
„ Es la notación más sencilla para el lenguaje intermedio
† Inconvenientes
„ El código es difícil de entender
„ N es útil para optimización
No ti i ió ded código
ódi
… Árboles de Sintaxis Abstracta (Árbol Semántico)
… Códigos de tres direcciones
† Cuartetos
† Tercetos
† Tercetos Indirectos

Árboles de Sintaxis Abstracta


20

… Son árboles de derivación en los que no existe


información superflua
s perfl a
… Cada nodo hoja representa un operando y cada
no-hoja un operador
… Ejemplos
Árbol ASA S:=A+B*C IF A<B THEN X:=B A[I]:=B
E + :
:= IF :=
E T A B S + < :=
+ [] B
T F A * A B X B A I
F B B C

10
Códigos de Tres Direcciones
21

… Cada línea de código tiene un operador y hasta tres direcciones


… Tipos: Cuartetos, Tercetos, Tercetos Indirectos
… Cuartetos
† Se representan por cuatro valores:
(<OPERADOR>,<Operando1>,<Operando2>,<Resultado>)
† Ejemplos
Expresión Cuartetos Otra representación
S:=A+B*C * B C T1 (*, B, C, T1)
+ A T1 T2 (+, A, T1, T2)
:= T2 S (:=, T2, , S)
IF A<B THEN X:=B < A B E1 (<, A, B, E1)
GOTO E2 (GOTO, , , E2)
LABEL E1 (LABEL, , , E1)
:= B X (:=, B, , X)
LABEL E2 (LABEL, , , E2)

Tercetos
22

… Los cuartetos son la herramienta más general


… Inconvenientes
† Ocupan demasiado espacio
† Requieren muchas variables auxiliares para almacenar los
resultados intermedios
… Los tercetos resuelven este problema suprimiendo el
operando del resultado, queda implícito y asociado a
di h terceto
dicho t t
(<OPERADOR>, <Operando1>, <Operando2>)
† Hacen referencia a otro terceto
† Son equivalentes a Árboles de Sintaxis Abstracta

11
Tercetos y Tercetos Indirectos
23

… Ejemplos
Expresión Tercetos
S:=A+B*C 1 (*, B, C)
2 (+, A, (1))
3 (:=, (2), S)
IF A<B THEN X:=B 1 (<, A, B)
2 (IFF, , (4))
3 (:=, B, X)
4 (,,)

… Los Tercetos Indirectos son análogos a los anteriores pero


en lugar de ejecutarse secuencialmente se ejecutan según
un vector llamado SECUENCIA
† Son más fáciles de optimizar
† Ocupan menos memoria, el mismo terceto aparece una vez

Tercetos Indirectos, Ejemplos


24

Expresión Tercetos
S:=A+B*C 1 (*,
(* B,
B C)
X:=A+B*C 2 (+, A, (1))
3 (:=, (2), S)
4 (:=, (2), X)
VE=(1, 2, 3, 1, 2, 4)
WHILE X<B DO X:=X+1 1 (<, X, B)
2 (IFF, , (6))
3 (+, X, 1)
4 (:=, (3), X)
5 (GOTO, , (1))
6 (, , )
VE=(1, 2, (3, 4, 5, 1, 2)*, 6)

12
Tercetos Indirectos, Optimización
25

… Código Inicial
Expresión Tercetos Orden de Ejecución
While X<B do 1 (<, X, B) VE=(1,2,(3,4,5,6,7,1,2)*,8)
A:=X+1; 2 (IFF, , (8))
B:=B-1 3 (+, X, 1)
4 (:=, (3), A)
5 (-, B, 1)
6 (:=, (3), B)
7 (GOTO, , (1))
8 (, , )

… Código Optimizado
If X<B
THEN A:=X+1;
WHILE X<B DO
B:=B-1
VE=(1, 2, 3, 4, (1, 2, 5, 6, 7)*, 8)

Comparación entre representaciones


26

… Nivel de Indirección
† La representación de tercetos tiene mayor nivel de
indirección que los cuartetos
… Optimización
† Mover código en los tercetos es relativamente más
difícil, aunque en menor grado para los tercetos
indirectos
… Espacio
† Los cuartetos ocupan más memoria, especialmente si se
utilizan las variables temporales más de una vez

13
Tercetos
27

… Traducción dirigida por la sintaxis a código de tres


direcciones
† Se construyen nombres temporales para los nodos
interiores del árbol sintáctico
† Se calcula el valor del no terminal E en el lado
izquierdo de E→E1+E2 dentro de un nuevo temporal t
„ E.lugar, es el nombre que contendrá el valor de E
„ E.código,
E ódi es la
l secuencia i dde proposiciones
ii d
de tres
t
direcciones que evalúan E
„ La función tempnuevo devuelve una secuencia de nombres
distintos t1, t2,... En sucesivas llamadas

Ejemplo TDS a Tercetos


28

… Producciones Regla Semántica


S→ id := E SS.código
ódi := E.código
E ódi || gen(id.lugar
(id l ’ ’ E.lugar)
’:=’ El )
E→ E1+E2 E.lugar := tempnuevo;
E.código := E1.código || E2.código ||
gen(E.lugar ´:=´ E1.lugar ´+´ E2.lugar)
E→ E1*E E.lugar := tempnuevo;
E.código := E1.código || E2.código ||
gen(E.lugar ´:=´ E1.lugar ´*´ E2.lugar)
E→ -E1 E.lugar := tempnuevo;
E.código := E1.código || gen(E.lugar ´menosu´ E1.lugar)
E→ (E1) E.lugar := E1.lugar;
E.código := E1.código
E→ id E.lugar := id.lugar;
E.código := ´´

14
Generación de Código a partir de
29
Notación Polaca
… El código se genera cuando se encuentra el operador
… Ejemplo:
Pila Entrada Código Generado
$ SABC*+:=
$S ABC*+:=
$SA BC*+:=
$SAB C*+:=
$SABC *+:= LOAD C
MUL B
STO T1
$SAT1 +:= LOAD T1
ADD A
STO T2
$ST2 := LOAD T2
STO S

Generación de Código Intermedio en


30
el Análisis Sintáctico Recursivo
† Se pueden utilizar las rutinas de árboles de sintaxis abstracta,
incorporándolas al código
† Supongamos que se genera con el análisis un árbol binario con
tres campos por nodo: info (información del nodo); izda (puntero
al subárbol izquierdo; dcha (puntero al subárbol derecho)
† Se pueden definir las funciones
„ CreaNodo: crea un nodo del árbol
„ CreaHoja: crea un nodo hoja
† Se añade un parámetro a cada procedimiento que contiene el
árbol generado hasta ese momento
† Además, se pueden formar grafos dirigidos para optimizar las
expresiones aritméticas

15
GCI con ASA
31

Producción Regla Semántica

E0::=E1+T E0.Nodo:=CreaNodo(´+´, E1.Nodo, T.Nodo)


E0::=E1*T E0.Nodo:=CreaNodo(´*´, E1.Nodo, T.Nodo)
E::=T E0.Nodo:=T.Nodo
T::=(E) T.Nodo:=E.Nodo
T::=Id T.Nodo:=CreaHoja(ValorLex(Id), Id.Puntero)
T::=Numero T.Nodo:=CreaHoja(ValorLex(Numero), Numero.Valor)

Ejemplo de GCI
32

Funcion E (VAR Arbol: Arbol)


(* E::= Identificador := E’)
c:= GetToken;
If c=´Identificador´ Then
nodo:= CreaHoja(´Identificador´, token.puntero(c));
c:=GetToken;
If c=´:=´ Then
Arbol:= CreaNodo(´:=´, nodo, NIL);
E´(nodo.dcha(Arbol))
else
Fail; error
else
Fail; error

16
GCI- Asignaciones con cuartetos
33

Producción Regla Semántica


S::=Id:=E S.Código:=E.Código
gen(:=, E.Valor, Id.Valor)
E0:=E1+E2 E0.Valor:=newtemp;
E0.Código:=E1.Codigo
E2.Codigo
gen(+,E1.Valor,E2.Valor,E0.Valor)
E0:=E1*E2 E0.Valor:=newtemp;
E0.Código:=E1.Codigo
E2.Codigo
gen(*,E1.Valor,E2.Valor,E0.Valor)
E0:=(E1) E0.Valor:= E1.Valor;
E0.Código:=E1.Codigo
E:=Id E.Valor:= Id.Valor;
E.Código:=´´

GCI- Condiciones Booleanas


34

Producción Regla Semántica


E0:=E1´or´ E2 E0.After := newlabel;
E0.False := newlabel;
E0.Valor:= newtemp;
E0.Codigo:= E1.Codigo;
gen(IF=, E1.Valor, 0, E0.False)
gen(:=, 1, , E0.Valor)
gen(GOTO, , , E0.After)
gen(LABEL, , , E0.False)
E2.Codigo
gen(:=, E2.Valor, , E0.Valor)
gen(LABEL, , , E0.After)

17
GCI- Condicionales
35

Producción Regla Semántica


S0:=´IF´ E ´THEN´ S1 ´ELSE´ S2 S0.Else:= newlabel;
S0.After:= newlabel;
S0.Codigo:= E.Codigo
gen(IF=, E.Valor, 0, S0.Else)
S1.Codigo
gen(GOTO, , , S0.After)
gen(LABEL, , , S0.Else)
S2.Codigo
gen(LABEL, , , S0.After)

GCI- Bucles
36

Producción Regla Semántica


S0:=´WHILE´ E ´DO´ S1 S0.Begin:= newlabel;
S0.After:= newlabel;
S0.Codigo:= gen(LABEL, , , S0.Begin)
E0.Codigo
gen(IF=, E.Valor, 0, S0.After)
S1.Codigo
gen(GOTO, , , S0.Begin)
gen(LABEL, , , S0.After)

18

Vous aimerez peut-être aussi