Está en la página 1de 33

Teoría de lenguajes y compiladores

Unidad III

Analizador Semántico

Semana 12

Traducción dirigida por la sintaxis


Objetivo General

El alumno al finalizar el curso desarrollará


aplicaciones que le permitan determinar si
una sentencia corresponde a la estructura
gramatical de un lenguaje de
programación. Así mismo estará
capacitado para proponer nuevas formas
estructurales en la definición de lenguajes
de programación.
Objetivo Específico

Desarrollar un analizador semantico


Objetivo Instruccional

Implementa procedimientos para el


procesamiento semántico basado en
traducción dirigida por la sintaxis
Contenidos Procedimentales

Comprender el esquema de traducción


dirigida por la sintaxis
Contenidos Generalidades

Traducciones

Formas de traducción dirigida por la sintaxis

Grafo de dependencias
Traducción Dirigida por la Sintaxis

• El análisis semántico puede efectuarse en


paralelo con el análisis sintáctico; es decir, puede
Generalidades

realizarse el análisis semántico cada vez que el


analizador sintáctico reconoce una estructura
sintáctica, o sea; una producción.

• Las acciones del análisis semántico relacionadas


con las producciones se incorporan al proceso de
análisis sintáctico y generan código intermedio
cada vez que se ejecutan.
Traducción Dirigida por la Sintaxis

• Asocia información a la construcción del


lenguaje.
Generalidades

• Asocia atributos en los símbolos de la gramática.


• Los valores de los atributos se calculan mediante
“reglas Semánticas” asociadas a las
producciones gramaticales.
Traducción Dirigida por la Sintaxis
Generalidades
Reglas semánticas
• Las reglas semánticas establecen dependencias
entre los atributos de los diferentes símbolos.
Generalidades

• Esas dependencias se reflejan en un grafo con el


fin de establecer un orden de evaluación de las
reglas.

• La evaluación de las reglas asigna valor a los


atributos.

Un árbol de análisis sintáctico que contiene también


los atributos y su valores se llama un árbol anotado o
decorado.
Acciones semánticas
Se asocian con las producciones de una gramática
independiente del contexto. Pueden considerarse
como un fragmento de código que se ejecutara
Generalidades

cuando el analizador sintáctico reconozca la


producción apropiada.

Ejemplo: Considerando la producción de la


gramática G0

TERMINO  TERMINO * FACTOR (* A *)

En el caso de un analizador sintáctico descendente,


se ejecutara A al expandir TERMINO o FACTOR.
Traducción a cuádruplos
La generación del código de tres direcciones se
ilustra en el siguiente ejemplo donde se considera la
gramática G0 y el análisis por desplazamiento y
Traducciones

reducción de la frase: x + y – x * y.

Para ello se supone que existe una matriz infinita de


variables auxiliares (va[k]), de tal forma que cada
vez que se usa una nueva variable auxiliar, la
variable k se incrementa.

Se utilizan también los apuntadores ApuntE, ApuntT y


ApuntF que referencian al lugar donde puede
hallarse el valor de una Expresion, un Termino, etc.
Traducción a cuádruplos
(1) E  T (* ApunE := ApunT *)
(2) E1  E2 + T (* INC(k)
ApunE1 := va[k];
Traducciones

Genera(ADD, ApunE2,ApunT,va[k] *)
(3) E1  E2 - T (* INC(k);
ApunE1 := va[k];
Genera(SUB, ApunE2, ApunT, va[k] *)
(4) T  F (* ApunT := ApunF *)
(5) T1  T2 * F (* INC(k);
ApunT1 := v a[k];
Genera(MUL, ApunT2, ApunF, va[k] *)
(6) T1  T2 / F (* INC(k);
ApunT1 := va[k];
Genera(DIV, ApunT2, ApunF, va[k] *)
(7) F  x (* ApunF := x; *)
(8) F  y (* ApunF := y; *)
(9) F  (E) (* ApunF := ApunE; *)
Traducción a cuádruplos
Análisis de frase: x + y – x * y

Entrada Pila Acción Código Comentario


Traducciones

x+y–x*y$ Desplazar Desplaza x a la pila


+y–x*y$ x Reducir (7) Reduce x a F por regla 7
+y–x*y$ F Reducir (4) Reduce F a T por regla 4
+y–x*y$ T Reducir (1) Reduce T a E por regla 1
+y–x*y$ E desplazar Desplaza + a la pila
y–x*y$ E+ desplazar Desplaza y a la pila
–x*y$ E+y Reducir (8) Reduce y a F por regla 8
–x*y$ E+F Reducir (4) Reduce F a T por regla 4
–x*y$ E+T Reducir (2) ADD x y va[1] Reduce E+T a E
–x*y$ E Desplazar Desplaza – a la pila
x*y$ E- Desplazar Desplaza x a la pila

Continua…
Traducción a cuádruplos
Análisis de frase: x + y – x * y

Entrada Pila Acción Código Comentario


Traducciones

*y$ E-x Reducir (7) Reduce x a F por regla 7


*y$ E-F Reducir (4) Reduce F a T por regla 4
*y$ E- T Desplazar Desplaza * a la pila
y$ E–T* Desplazar Desplaza y a la pila
$ E–T*y Reducir (8) Reduce y a F por regla 8
$ E–T*F Reducir (5) MUL x y va[2] Reduce T*F a T por
regla 5
$ E-T Reducir (3) SUB va[1] va[2] va [3] Reduce E-T a E por
regla 3
$ E Aceptar
Traducción a notación posfija
Volveremos a usar la gramática anterior G0, para
mostrar las acciones semánticas que generan
notación posfija.
Traducciones

A cada producción se añade la acción semántica


A respectiva en la forma (* A *); ADD, SUB, MUL y DIV
son operaciones obvias, mientras que LOD es una
operación de carga para meter operandos en la
pila.
Traducción a notación posfija
(1) EXPR  TERM (* T *)
(2) EXPR  EXPR + TERM (* E T ADD *)
(3) EXPR  EXPR – TERM (* E T SUB *)
Traducciones

(4) TERM  FACTOR (* F *)


(5) TERM  TERM * FACTOR (* T F MUL *)
(6) TERM  TERM / FACTOR (* T F DIV *)
(7) FACTOR  x (* LOD x *)
(8) FACTOR  y (* LOD y *)
(9) FACTOR  ( EXPR ) (* E *)
Traducción a notación posfija
Análisis de frase: x + y – x * y

Entrada Derivación Código


Traducciones

EXPR  EXPR - TERM (* E T SUB *)


EXPR + TERM1 – TERM2 (* E T1 ADD T2 SUB *)
TERM3 + TERM1 – TERM2 (* T3 T1 ADD T2 SUB *)
FACTOR + TERM1 – TERM2 (* F T1 ADD T2 SUB *)
x + TERM1 - TERM2 (* LOD x T1 ADD T2 SUB *)
x + FACTOR – TERM (* LOD x F ADD T SUB *)
x + y - TERM (* LOD x LOD y ADD T SUB *)
x + y – TERM * FACTOR (* LOD x LOD y ADD T F MUL SUB *)
x + y – FACTOR1 * FACTOR2 (* LOD x LOD y ADD F1 F2 MUL SUB *)
x + y – x * FACTOR (* LOD x LOD y ADD LOD x F MUL SUB *)
x+y–x*y (* LOD x LOD y ADD LOD x LOD y MUL SUB *)
Notación posfija de la frase
Gramáticas de atributo
Formas de traducción dirigida por la sintaxis

Definición

Las gramáticas de atributo son


gramáticas independientes del contexto
a las que se añaden atributos y reglas de
evaluación de atributos (funciones/reglas
semánticas).
Funciones/Reglas Semánticas
Formas de traducción dirigida por la sintaxis

Calculan los valores de los atributos después del


análisis sintáctico. También pueden tener efectos
secundarios (escribir algo, actualizar una variable global ,crear
un árbol de derivación,…)

Sintaxis Semántica
E0 := E1 + T E0.Value := E1.Value+ T.Value

E := T E.Value := T.value

T0 := T1 * F T0.Value := T1.Value * F.Value

T := F T.Value := F.Value

F := (E) F.Value := E.Value

F := numero F.Value := ValorLex(numero)


Atributos semánticos
Formas de traducción dirigida por la sintaxis

• A cada símbolo de la gramática se le pueden


asignar variables con sus correspondientes valores.

• Hay dos tipos de atributos:

o Sintetizados (locales)
Se definen en un determinado nodo del árbol de
derivación y permiten asignar un valor a un nodo
dependiendo del valor de los nodos hijos

o Heredados
Se pasan a niveles inferiores del árbol. Su valor depende
del valor de los hermanos y del padre. Sirven, por ejemplo,
para saber si hay que utilizar el valor de un identificador o
su dirección según aparezca en la parte izquierda o
derecha de su asignación.
Atributos Sintetizados (1/4)
Formas de traducción dirigida por la sintaxis

El valor del atributo en un nodo del árbol


depende de los valores de los atributos
asociados a sus nodos hijos.

X0

X1 Xi Xn
Formas de traducción dirigida por la sintaxis
Atributos Sintetizados (2/4)
Ejemplo
• calculadora

Producción Reglas Semánticas


L  E „\n‟ print (E.val)
E  E1 + T E.val := E1.val + T.val
ET E.val := T.val
T  T1 * F T.val := T1.val * F.val
TF T.val := F.val
F(E) F.val := E.val
F  dígito F.val := dígito.valex
Atributos Sintetizados (3/4)
Formas de traducción dirigida por la sintaxis

• La definición con atributos sintetizados del ejemplo


especifica una calculadora que lee una línea de entrada
que contiene una expresión aritmética que incluye dígitos,
paréntesis, los operadores + y *, seguida de un carácter de
nueva línea „\n‟, e imprime el valor de la expresión.
• Por ejemplo, dada la expresión 3*5+4 seguida de una nueva
línea, el programa imprime el valor 19
• La figura contiene un árbol de análisis sintáctico con
anotaciones para la entrada 3*5+4\n. El resultado, que se
imprime en la raíz del árbol, es el valor de E.val en el primer
hijo de la raíz.
Atributos Sintetizados (4/4)
Formas de traducción dirigida por la sintaxis

Para ver cómo se calculan los valores de los atributos, considérese


el nodo situado en el extremo de la izquierda, que corresponde al
uso de la producción F  digito. La regla semántica
correspondiente, F.val := digito.valex, establece que el atributo
F.val en el nodo tiene el valor 3 porque el valor de digito.valex en
el hijo de este nodo es 3. De forma similar, en el padre de este
nodo F, el atributo T.val tiene el valor 3.
Formas de traducción dirigida por la sintaxis
Atributos Heredados (1/4)

Se calculan a partir de los valores de


atributos de su nodo padre o sus
nodos hermanos.
Formas de traducción dirigida por la sintaxis
Atributos Heredados (2/4)
Ejemplo

• Información de tipos
Producción Reglas Semánticas
DTL L.her := T.tipo
T  int T.tipo := integer
T  real T.tipo := real
L  L1,id L1.her := L.her
añadetipo (id.entrada, L.her)
L  id añadetipo (id.entrada, L.her)
Formas de traducción dirigida por la sintaxis
Atributos Heredados (3/4)
• Una declaración generada por el terminal D en la definición dirigida
por sintaxis en la figura 4.4 consta de la palabra clave INT o REAL,
seguida de una lista de identificadores.
• El no terminal T tiene un atributo sintetizado tipo, cuyo valor viene
determinado por la palabra clave de la declaración.
• La regla semántica L.her:= T.tipo, asociada con la regla de
producción D  T L, asigna al atributo heredado L.her el tipo de la
declaración.
• Entonces las reglas pasan este tipo por el árbol de análisis sintáctico
utilizando el atributo heredado L.her. Las reglas asociadas con las
producciones de L llaman al procedimiento añadetipo para añadir
el tipo de cada identificador a su entrada en la tabla de símbolos
(apuntada por el atributo ptr_tds).
Formas de traducción dirigida por la sintaxis
Atributos Heredados (4/4)
En la figura 4.5 se muestra un árbol de análisis sintáctico con
anotaciones para la frase real id1, id2, id3. El valor de L.her en los tres
nodos de L da el tipo de los identificadores id1, id2, id3. Estos valores se
determinan calculando el valor del atributo T.tipo en el hijo izquierdo
de la raíz y evaluando después L.her de forma descendente en los tres
nodos de L en el subárbol derecho de la raíz. En cada nodo de L
también se llama al procedimiento añadetipo para insertar en la tabla
de símbolos el hecho de que el identificador en el hijo derecho de
este nodo tiene tipo real.
• Las interdependencias entre atributos
heredados y sintetizados de un árbol de
Grafo de dependencias

análisis sintáctico se pueden representar


mediante un grafo dirigido llamado Grafo
de Dependencias

• Se utiliza un grafo de dependencias para


saber el orden en el que se tienen que
evaluar las reglas semánticas.

• Si un atributo b en un nodo depende de un


atributo c, entonces se debe evaluar la
regla semántica para b después de la regla
semántica que define a c
Algoritmo de Construcción
Para cada nodo n en el árbol de análisis sintáctico
hacer
Grafo de dependencias

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;

Producción Regla Semántica


E->E1+E2 E.val:=E1.val+E2.val
Ejemplo
real id1, id2, id3
Grafo de dependencias
Teoría de lenguajes y compiladores

Unidad III

Analizador Semántico

Semana 12

Traducción dirigida por la sintaxis

También podría gustarte