Académique Documents
Professionnel Documents
Culture Documents
Anlisis semntico I
Traduccin dirigida por la
sintaxis
Javier Vlez Reyes
jvelez@lsi.uned.es
Departamento de Lenguajes Y Sistemas Informticos
UNED
Objetivos Generales
Aprender qu es la semntica de un lenguaje de programacin
Entender cmo funciona la semntica operacional y distinguirla de otros tipos de semntica
Aprender cmo se inyecta informacin semntica en una gramtica
Aprender el principio de traduccin dirigido por la sintaxis
Conocer las gramticas con atributos y las reglas y acciones semnticas
Aprender a distinguir los diferentes tipos de atributos que existen
Aprender a construir y analizar grafos de dependencia
Aprender a identificar compiladores de simple y doble pasada
Conocer los distintos tipos de formalismos de traduccin que existen
Aprender a especificar definiciones dirigidas por la sintaxis
Aprender a especificar esquemas de traduccin dirigidos por la sintaxis
ndice
Introduccin
Formalismos para la especificacin de traducciones
Definiciones dirigidas por la sintaxis
Reglas semnticas
Atributos
Grafos de dependencia
Diseo de definiciones dirigidas por la sintaxis
Gramticas con atributos por la izquierda
Esquemas de traduccin dirigidas por la sintaxis
Acciones semnticas
Atributos
Diseo de esquemas de traduccin
Traduccin dirigida por la sintaxis en la prctica
Bibliografa
Javier Vlez Reyes jvelez@lsi.uned.es
Qu es la semntica de un lenguaje?
Tema 2
Tema 3 - 5
Tema 6 - 7
S
WHILE
DO
E > E
Cmo es el lenguaje?
Las dos primeras fases conceptuales de un
compilador atienden a responder la
pregunta de cmo es un lenguaje en
trminos de su estructura sintctica y sus
elementos lxicos constituyentes
S
WHILE
DO
E > E
LD a t1
LD b t2
GRT t3 t1 t2
BRZ t3 L1
Cdigo final
<WHILE, PR>
Cdigo intermedio
Analizador lxico
While ( a > b ) do
a := a + 1;
Analizador
semntico
Etapa de sntesis
Analizador sintctico
Etapa de anlisis
eli hw
Tema 10 - 11
Tema 8 - 9
0000 0011
0000 0011
0100 0001
0100 0000
0001 0010
Qu es el lenguaje?
Las tres fases subsiguientes tratan de dar
un significado nico, preciso y computable
a cada construccin del lenguaje de
manera que el programador sepa definir
programas
semnticamente
tiles
y
coherentes
Qu es la semntica de un lenguaje?
El anlisis sintctico de un cdigo fuente comprueba que la secuencia de tokens llegada desde el
analizador lxico se corresponde con la esperada de acuerdo a las prescripciones gramaticales y se
obtiene como resultado un rbol de anlisis sintctico. Hemos obtenido por tanto una secuencia
correcta de tokens pero nada sabemos acerca de qu significado intencional subyace a la misma
PROGRAM BubbleSort;
BEGIN
ReadVector (v);
sort (v, MAX);
END.
Qu es la semntica de un lenguaje?
Es necesario definir computacionalmente la semntica de un lenguaje para que el compilador sepa
interpretar cada posible cdigo fuente del mismo. La forma ms sencilla de hacer esto es asociar a
cada posible construccin gramatical ciertas reglas que permitan traducirla en trminos computables.
Esto slo es posible si se cumple el principio de traduccin dirigido por la sintaxis
Qu es la semntica de un lenguaje?
Es necesario definir computacionalmente la semntica de un lenguaje para que el compilador sepa
interpretar cada posible cdigo fuente del mismo. La forma ms sencilla de hacer esto es asociar a
cada posible construccin gramatical ciertas reglas que permitan traducirla en trminos computables.
Esto slo es posible si se cumple el principio de traduccin dirigido por la sintaxis
Tema 7
Tipos de acciones
de traduccin
semntica
Tema 8, 9
Qu es la semntica de un lenguaje?
Es necesario definir computacionalmente la semntica de un lenguaje para que el compilador sepa
interpretar cada posible cdigo fuente del mismo. La forma ms sencilla de hacer esto es asociar a
cada posible construccin gramatical ciertas reglas que permitan traducirla en trminos computables.
Esto slo es posible si se cumple el principio de traduccin dirigido por la sintaxis
Ejemplo
Traduccin semntica
Tiempo de compilacin
Tiempo de ejecucin
Declaracin de
constantes
Registrar
MAX
como
constante entera de valor
100
Declaracin de
tipos
Declaracin de
variables
VAR v : TVector;
Declaracin de
procedimientos
Qu es la semntica de un lenguaje?
Es necesario definir computacionalmente la semntica de un lenguaje para que el compilador sepa
interpretar cada posible cdigo fuente del mismo. La forma ms sencilla de hacer esto es asociar a
cada posible construccin gramatical ciertas reglas que permitan traducirla en trminos computables.
Esto slo es posible si se cumple el principio de traduccin dirigido por la sintaxis
Sentencia For
Ejemplo
Traduccin semntica
Tiempo de compilacin
Tiempo de ejecucin
Adicionalmente al caso de
procedimientos registrar que
el tipo de retorno es INTEGER
Generar
cdigo
para
recuperar de memoria el
valor de las sub-expresiones
y aplicar la comparacin
entre ambos con los
operadores del lenguaje de
bajo nivel
FOR j := 1 TO i DO
...
Generar
cdigo
para
inicializar j a 1. Generar
cdigo de salto para iterar
la ejecucin del bloque
dentro de FOR i veces.
Generar
cdigo
para
actualizar a cada paso el
valor de j a j + 1
Qu es la semntica de un lenguaje?
Es necesario definir computacionalmente la semntica de un lenguaje para que el compilador sepa
interpretar cada posible cdigo fuente del mismo. La forma ms sencilla de hacer esto es asociar a
cada posible construccin gramatical ciertas reglas que permitan traducirla en trminos computables.
Esto slo es posible si se cumple el principio de traduccin dirigido por la sintaxis
Sentencia de
asignacin
Sentencia de
llamada a
procedimiento
Ejemplo
Traduccin semntica
Tiempo de compilacin
Tiempo de ejecucin
Generar
cdigo
para
evaluar
la
expresin
durante
la
ejecucin.
Generar cdigo de salto que
ejecute el bloque THEN si la
evaluacin da TRUE en
ejecucin
tmp := v[j];
Generar
cdigo
para
evaluar el valor de v[j] y
copiar su valor en la
posicin
de
memoria
apuntada por tmp
Generar
cdigo
para
gestionar memoria que
permita la activacin del
procedimiento
Sort.
Generar cdigo de salto
para su ejecucin
, Rs2
E
E
{::}
{::}
{::}
Subndice de
diferenciacin
Reglas semnticas
declaracion
lVariables.tipo := tipo.tipo
lVariables
::= lVariables1 , ID
lVariables1.tipo := lVariables.tipo
<<registrar ID como variable de tipo tipo>>
lVariables
::= ID
tipo
::= INTEGER ;
tipo.tipo := ENTERO
tipo
::= REAL ;
tipo.tipo := REAL
atributo
declaracion
[]
lVariables1.tipo := lVariables.tipo
lVariables
[tipo]
tipo
[tipo]
Atributos
Un atributo es un espacio de informacin con tipificacin implcita que sirve
para albergar una caracterstica propia del proceso de traduccin y que
puede ser transferida a otras producciones gramaticales para que pueda
ser utilizada desde all por sus reglas semnticas
I. Atributos sintetizados
tipos de
atributos
A a
B
A a
B
Reglas semnticas
Una regla semntica es una expresin formal asociada a una regla de
produccin que permite definir la semntica de la construccin gramatical
asociada a la misma en trminos de los smbolos de la regla de produccin
atributo
tipos de
reglas
semnticas
lVariables1.tipo := lVariables.tipo
No terminal
Terminal o
No terminal
asignacin
Grafos de dependencias
Un grafo de dependencias refleja, sobre un rbol de anlisis sintctico las
dependencias entre los atributos gramaticales establecidas en virtud de las
reglas semnticas que les asignan valor
La aplicacin de las ecuaciones de atributos de
las
reglas
semnticas
inducen
ciertas
dependencias entre los mismos. En efecto, si un
atributo se calcula a partir de otros, es natural
pensar que existe una dependencia del primero
para con los segundos. Esta dependencia se
dibuja en el grafo como un arco de cada uno de
los segundos al primero
a A
Calcular D.d
Calcular B.b
en cualquier
orden
Calcular despus
Grafos de dependencias
Un grafo de dependencias refleja, sobre un rbol de anlisis sintctico las
dependencias entre los atributos gramaticales establecidas en virtud de las
reglas semnticas que les asignan valor
Algoritmo de clculo
a A
Grafos de dependencias
declaracion
lVariables.tipo := tipo.tipo
a, b : INTEGER;
lVariables
::= lVariables1 , ID
lVariables1.tipo := lVariables.tipo
<<registrar ID como variable de tipo tipo>>
lVariables
::= ID
tipo
::= INTEGER ;
tipo.tipo := ENTERO
tipo
::= REAL ;
tipo.tipo := REAL
lVariables.tipo
tipo.tipo
declaracin
lVariables .tipo
[Heredado]
[sintetizado]
tipo .tipo
:
ENTERO
ENTERO
ENTERO
lVariables .tipo
,
ID
INTEGER
ID
<<registrar ID con tipo>>
I. Especificacin gramatical
Construya la gramtica sobre la cual desea
articular la definicin dirigida por la sintaxis.
Asegrese de que esta gramtica es correcta y
no ambigua
V. Grafo de dependencias
Dibuje el grafo de dependencias que debera
producirse para asegurar que la informacin
fluya adecuadamente. Considere siempre un
procesamiento descendente
Ejemplo
E.value
T.value
F.value
n.value
E ::= E + T
T ::= T * F | T / F | F
E ::= E T
F ::= ( E ) | n
E ::= T
E.value := T.value
T ::= T * F
T ::= T / F
T ::= F
T.value := F.value
F ::= ( E )
F.value := E.value
F ::= n
F.value := n.value
2 + 3 * 5
E .value
2
E .value = 17
15
T .value
3
[Sintetizado]
[Sintetizado]
[Sintetizado]
[Sintetizado]
T .value
T
T .value
2
F
F
n
F .value
2
n .value
n
F .value
F .value
n.value
n .value
Ejercicios
A continuacin se muestra una gramtica de
operadores no ambigua. Especifique sobre ella
una DDS para pasar expresiones aritmticas infijas
a notacin postfija
E ::= E + T | E T | T
T ::= T * F | T / F | F
B ::= D B | D
F ::= ( E ) | n
D ::= 0 | 1
declaracion
N ::= D N | D
lVariables
::= lVariables1 , ID
D ::= 0 | 1 | 2 | 3 | 4
lVariables
::= ID
tipo
::= INTEGER ;
tipo
::= REAL ;
5 | 6 | 7
lVariables
::= lVariables1 , ID
lVariables
::= ID
tipo
::= INTEGER ;
tipo
::= REAL ;
declaracin
lVariables .tipo
tipo .tipo
:
ENTERO
a, b : INTEGER;
ENTERO
ENTERO
lVariables .tipo
,
ID
<<registrar ID con tipo>>
INTEGER
Tipos de
traductores
Gramtica C
declaracin
lVariables .tipo
tipo .tipo
Gramtica Pascal
declaracin
lVariables .tipo
tipo .tipo
ENTERO
ID
::= ID , declaracion1
::= ID :
tipo
ENTERO
declaracion.tipo = declaracion1.tipo
<<registrar ID con tipo>>
declaracion
declaracin .tipo
a, b : INTEGER;
declaracion
declaracin
declaracion.tipo = tipo.tipo
<<registrar ID con tipo>>
tipo
::= INTEGER ;
tipo.tipo :=ENTERO
tipo
::= REAL ;
tipo.tipo := REAL
ID
tipo .tipo
ENTERO
INTEGER
X1
X2
X3
Subndice de diferenciacin
Accin semntica
Atributo
[trad]
[trad]
[trad]
num
[lexema]
{: E.trad := T.trad :}
E {: E.trad := E.trad :}
Atributos
Un atributo es un espacio de informacin con tipificacin explcita que sirve
para albergar una caracterstica propia del proceso de traduccin y que
puede ser transferida a otras producciones gramaticales para que pueda
ser utilizada desde all por sus reglas semnticas
I. Atributos sintetizados
tipos de
atributos
A a
B
A a
B
Accin semntica
Una accin semntica es un fragmento de cdigo ejecutable, insertado en
algn punto de la parte derecha de una regla de produccin, encargado de
realizar cierta lgica de traduccin a partir de la informacin soportada por
los atributos de los smbolos gramaticales de dicha regla
El contenido de la accin se
expresa, frecuentemente, en el
lenguaje
de
programacin
anfitrin del compilador que se
est construyendo
E {: E.trad := E.trad :}
{: E.trad := T.trad :}
E ::= T
I. Especificacin gramatical
Construya la gramtica sobre la cual desea
articular la traduccin dirigida por la sintaxis.
Asegrese de que esta gramtica es correcta y
no ambigua
V. Grafo de dependencias
Dibuje el grafo de dependencias que debera
producirse para asegurar que la informacin
fluya adecuadamente. Considere siempre un
procesamiento descendente
Ejemplo
E
num
(9)
{: T.trad := 9 :}
num
(5)
{: E.trad := 9 :}
{: E1.trad := 9 5 - :}
{: T.trad := 5 :}
num
(2)
{: E.trad := 9 5 2 + :}
{: E.trad := 9 5 2 + :}
{: E1.trad := 9 5 2 + :}
{: T.trad := 2 :}
{: E.trad := 9 5 2 + :}
{: E.trad := 9 5 2 + :}
El siguiente paso para construir el compilador es articular en cup un esquema de traduccin dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuacin damos la
secuencia de pasos que deben realizarse
I. Construccin de la clase
Para implementar la clase asociada a cada no
terminal recomendamos que se utilice el mismo
nombre que se us para nombrarlo en cup,
eliminando caracteres extraos y siguiendo los
criterios de nombrado de Java. Si lo cree
conveniente crese un script para automatizar
la construccin de estas clases
con un
esqueleto vaco. Adems considere la
posibilidad de extender de una clase base para
factorizar cierto cdigo comn a todas las
clases de no terminales
El siguiente paso para construir el compilador es articular en cup un esquema de traduccin dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuacin damos la
secuencia de pasos que deben realizarse
El siguiente paso para construir el compilador es articular en cup un esquema de traduccin dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuacin damos la
secuencia de pasos que deben realizarse
TypeIF type;
TemporalIF temporal;
...
public List<QuadrupleIF> getCode () {...}
public void setCode (List<QuadrupleIF> code) {...}
El siguiente paso para construir el compilador es articular en cup un esquema de traduccin dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuacin damos la
secuencia de pasos que deben realizarse
long hashcode () {
return 67 * 67 * code.hashcode() +
67 * type.hashcode()
+ temporal.hascode();
}
boolean equals (Object o) {
if (!(o instanceof Expresion)) return false;
else {
Expression e = (Expresion) o;
return e.code.equals(this.code) &&
Recomendamos
encarecidamente
la
implementacin de estos tres mtodos puesto
que puede simplificar considerablemente la
construccin del compiladores en fases
subsiguientes
e.type.equals(this.type) &&
e.temporal.equals(this.temporal); }
}
public String toString () {...}
}
Consltese el documento
directrices de implementacin
El siguiente paso para construir el compilador es articular en cup un esquema de traduccin dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuacin damos la
secuencia de pasos que deben realizarse
El siguiente paso para construir el compilador es articular en cup un esquema de traduccin dirigido por
la sintaxis. Esta herramienta ya provee un mecanismo para llevar esto a cabo. A continuacin damos la
secuencia de pasos que deben realizarse
Uso de constructor
Acciones semnticas
...
RESULT = e; :}
Asignacin de reduccin
Material de estudio
Bibliografa bsica
Construccin de compiladores: principios y prctica
Kenneth C. Louden International Thomson Editores,
2004 ISBN 970-686-299-4
Material de estudio
Bibliografa complementaria
Compiladores: Principios, tcnicas y herramientas.
Segunda Edicin Aho, Lam, Sethi, Ullman
Addison Wesley, Pearson Educacin, Mxico 2008