Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2015-I
GUIA VIII
Generacin de cdigo
Acciones semnticas
intermedio
Hans Reichenbach
Alan Mathison Turing (1912-1954)
En 1935, el matemtico y lgico ingles Alan Mathison
Turing (1912-1954) se intereso en el problema de Hilberrt,
que preguntaba si podra haber un mtodo general aplicable
a cualquier enunciado para determinar si este era
verdadero. El enfoque de Turing para la solucin de este
problema
lo
llevo
a
desarrollar
lo
que
ahora
se
conoce
como la maquina de Turing. Durante la segunda Guerra
Mundial, Turing trabajo en la oficina para asuntos externos
de Bletchley Park, donde hizo un amplio uso del
criptoanlisis de los mensajes nazis. Sus esfuerzos
produjeron una maquina descifradora mecnica, Enigma,
elemento muy importante que contribuyo a la cada del
Tercer Reich.
Objetivos de aprendizaje
1. Conocer tcnicas para generacin de cdigo intermedio
2. Conocer cmo se realiza el anlisis sintctico dirigido por la sintaxis
3. Conocer las acciones semnticas asociadas a la gramtica
CODIGO INTERMEDIO
A partir de rbol sintctico generado por el analizador sintctico, cuando una secuencia es
reconocida, se construye el cdigo intermedio de la secuencia. Este cdigo puede estar
codificado de varias formas[TEUFFEL].
CODIGOS
INTERMEDIO
Pag.1/17
Lenguajes y Traductores
2015-I
NOTACION POSTFIJA
NOTACION PREFIJA
CODIGO DE DOS DIRECCIONES
CODIGO DE TRES DIRECCIONES
NOTACION PREFIFA
(a - b) / (a + b)
/-ab+ab
NOTACION POSTFIJA
(a - b) / (a + b)
ab-ab+/
Por ejemplo si a = 2 b = 3
1
2
3
4
5
6
7
Empila 2
Empila 3
Saca los dos elementos superiores, aplica el operando y empila el resultado.
Empila 2
Empila 3
Saca los dos elementos superiores, aplica el operando + y
empila el resultado.
/ requiere dos operandos, saca los dos superiores y aplica / y el resultado se empila.
arg1
Arg2
TRIPLES
Ejemplo 1
c=a-b+a*b
1:
2:
3:
4:
SUB a b
MUL a b
ADD (1) (2)
STO (3) c
1:
2:
3:
4:
(-, a, b)
(*, a, b)
(+, (1), (2))
(:=, (3), c)
1:
2:
3:
4:
(*, r, s)
(*, s, t)
(+, (1), (2))
(:=, (3), w)
Ejemplo 2
w := r * s + s * t
1:
2:
3:
4:
MUL r s
MUL s t
ADD (1) (2)
STO (3) w
OP
OPE_1
OPE_2
RES
Pag.2/17
Lenguajes y Traductores
2015-I
Donde
OP
OPE_1
OPE_2
RES
Ejemplo 3
1:
2:
3:
4:
:
:
:
:
operador
operando 1
operando 2
resultado
c=a-b+a*b
SUB a b
V1
MUL a b
V2
ADD V1 V2 V3
STO V3
c
1:
2:
3:
(-, a, b, V1)
(*, a, b, V2)
(+, V1, V2, V3)
4:
(:=, V3, c, -)
Ejemplo 4
z := a + b - a * b
w := a * b
TRIPLES
(1)
(2)
(3)
(4)
(5)
ADD a b
MUL a b
SUB (1) (2)
STO (3) z
STO (2) w
CUADRUPLOS
1
2
3
4
5
ADD a b
MUL a b
SUB V1 V2
STO V3
STO V2
V1
V2
V3
z
w
Ejercicio 1
Construya triples y cuadruplos para las frases
o rea= (base *altura)/2
o Volumen = (2*PI*R)*Altura
o (a*b-c)*(x / (a*b))
La proposicin SUM = SUM + VALOR
Puede representarse mediante los cudruplos
+ , SUM , VALOR , i
= , i1
,
, SUM
La i1 especifica un resultado intermedio (SUM + VALOR); el segundo cudruplo
asigna el valor de este resultado intermedio a SUM. La asignacin se trata como una
operacin de asignacin aparte (=) , para permitir posibilidades adicionales a la
optimacin de cdigo.
ACCIONES SEMANTICAS
Son acciones que se asocian con las acciones de una gramtica independiente del
contexto
Pag.3/17
Lenguajes y Traductores
ACCION
SEMANTICA
2015-I
Ejemplo 5
x
y*z
(A)
E
T
F
E
E
E
T
T
T
F
F
T
E+T
E-T
F
T*F
T/F
id
(E)
Anlisis de la frase
E
T/E+T/E-T
F/T*F/T/F
id / (E)
a+b-a*b
E-T
E + T1 - T2
T3 + T1 - T2
F + T1 - T2
id + T1 - T2
id + F - T
id + id - T
id + id - T * F
id + id - F1 * F2
id + id - id * F
id + id - id * id
a+b-a*b
(T)
(E T ADD)
(E T SUB)
(F)
(T F MUL)
(T F DIV)
(Load id)
(E)
(E T SUB)
(E T1 ADD T2 SUB)
(T3 T1 ADD T2 SUB)
(F T1 ADD T2 SUB)
(Load id T1 ADD T2 SUB)
(Load id F ADD T SUB)
(Load id Load id ADD T SUB)
(Load id Load id ADD T F MUL SUB)
(Load id Load id ADD F1 F2 MUL SUB)
(Load id Load id ADD Load a F MUL SUB)
(Load id Load id ADD Load id Load id MUL SUB)
Load a Load b ADD Load a Load b MUL SUB
Pag.4/17
Lenguajes y Traductores
2015-I
Ejercicio 2
verifique las frases
(a+b)*(a-b)
a+b* a b
(a+b) * a b
a+b * (a b)
TRADUCCION A CUADRUPLOS
La generacin de cdigo de tres direcciones (cudruplos) considera una gramtica G y el
anlisis por desplazamiento y reduccin . Para ello se supone que existe una matriz infinita
V en donde se almacenan las variables auxiliares. Cada vez que se usa una nueva variable
auxiliar, la variable K se incrementa. Se utilizan tambin los apuntadores PtroE, PtroT y
PtroF para apuntar al lugar donde se encuentran rel valor de una expresin, un factor o un
trmino.
El procedimiento GENERA produce un cudruplo segn sus parmetros
Ejemplo 7
1
2
E
E1
T
E2 + T
(PtroE = PtroT)
(INC(K); PtroE1 := V(K)
GENERA(ADD, PtroE2, PtroT, V(K)))
E1
E2 - T
4
5
T
T1
F
T2 * F
T1
T2 / F
7
8
9
F
F
F
x
y
(E)
Ejemplo 8
Anlisis de frase x + y - x * y
1
2
3
4
5
6
Entrada
Pila
Accin
x+y-x*y
+y-x*y
+y-x*y
+y-x*y
+y-x*y
y-x*y
$
$x
$F
$T
$E
$E +
d
r7
r4
r1
d
d
Cdigo
comentario
desplaza x a la pila
reduce x a F por regla 7
reduce F a T por regla 4
reduce T a E por regla 1
desplaza + a la pila
desplaza y a la pila
Pag.5/17
Lenguajes y Traductores
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-x*y
-x*y
-x*y
-x*y
x*y
*y
*y
*y
y
2015-I
$E + y
$E + F
$E + T
$E
$E $E - x
$E - F
$E - T
$E - T *
$E - T * y
$E - T * F
$E - T
$E
$
r8
reduce y a F por regla 8
r4
reduce F a T por regla 4
r2 ADD a b V(1)
d
desplaza - a la pila
d
desplaza x a la pila
r7
reduce x a F por regla 7
r4
reduce F a T por regla 4
d
desplaza * a la pila
d
desplaza y a la pila
r8
reduce y a F por regla 7
r8
reduce T a F por regla 5
r5 MUL a b V(2) reduce T*F a T por regla 5
r3 SUB V(1) V(2) V(3)
acepta
Ejemplo 9
Hacer el anlisis para (a + b) / (a - b)
Anlisis
Entrada
1 a+b/a-b
2 +b/a-b
3
+b/a-b
4
+b/a-b
5
+b/a-b
6
b/a-b
7
/a-b
8
/a-b
9
/a-b
10
/a-b
11
a-b
12
-b
13
-b
14
-b
15
-b
16
b
17
18
19
20
21
22
23
24
25
Pila
Accin
$
$a
r7
$F
$T
$E
$E +
$E + b
$E + F r4
$E + T r2
$E
$E/
$E/a
$E/F
$E/T
$E/E
$E/E$E/E-b
$E/E-F
$E/E-T
$E/E
$F/E
$T/E
$T/F
$T
$E
Cdigo
d
r4
r1
d
d
r8
ADD a b V(1)
d
d
r7
r4
r1
d
d
r8
r4
r3
SUB a b V(2)
r9
r4
r9
r6
DIV V(1) V(2) V(3)
r1
Acepta
Ejercicio 3
Realice el anlisis para las frases siguientes
(a+b)*(a-b)
Augusto Cortez Vsquez
Pag.6/17
Lenguajes y Traductores
2015-I
a+b* a b
(a+b) * a b
a+b * (a b)
Ejemplo 10
Consideremos la gramtica simplificada de lenguaje C
P
void main(){ L_Decl L_Prop }
L_Decl
D; L_Decl / Decl;
Decl
Tipo L_Id
Tipo
int / float
L_Id
Id , L_Id / Id
L_Prop
Prop; L_Prop / Prop;
Prop
P_Asg /P_Lect /P_Escr /P_Decis / P_Iter
P_Asg
Id = Expr
P_Lect
cin >> Id
P_Escr
cout <<Id
P_Decis
if EL B_Sent / if EL B_Sent else B_Sent
B_Sent
{ L_Prop} / Prop;
P_Iter
While EL B_Sent
Expr
Expr + Termino / Expr - Termino / Termino
Termino
Termino * Factor / Termino Div Factor /Factor
Factor
Id / Cn / ( Expr) / - Expr
EL es considerado terminal
Ejercicio 4
Amplie la gramtica para que acepte la sentencia for
Amplie la gramtica para que acepte la sentencia switchr
void main()
{
int I, SUM,PROM,VAL;
SUM = 0;
I=1 ;
while ( I < =10 )
{ cin>>VALOR;
SUM= SUM + VALOR;
i++;
}
PROM = SUM/10;
cout<<SUM;
cout<<PROM;
}
Augusto Cortez Vsquez
Pag.7/17
Lenguajes y Traductores
2015-I
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
Componente
Lxico
cdigo
patrn
void
main
for
cin
cout
(
)
{
}
Id
cn
int
float
>>
<<
,
;
=
+
*
/
<
++
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void
main
(
)
{
Pag.8/17
Lenguajes y Traductores
2015-I
Tipo de
Comp.lexico
01
02
06
07
08
12
10
16
10
16
10
16
10
17
10
18
11
17
03
06
10
18
11
17
10
23
11
17
10
24
04
14
10
17
10
18
10
19
10
17
09
10
18
10
22
11
05
15
10
17
05
15
10
17
09
2
3
8
9
10
11
12
Designador
Comp. lexico
*I
*SUM
*PROM
*VAL
*SUM
#0
*I
#1
*I
#10
*I
*VALOR
*SUM
*SUM
*VALOR
*PROM
*SUM
#10
*SUM
*PROM
Pag.9/17
Lenguajes y Traductores
2015-I
La operacin JGT del cuadruplo (3) compara los valores de sus dos operandos y salta al
cuadruplo (11) si el primer operando es mayor que el segundo
La operacin J del cuadruplo(10) salta incondicionalmente al cuadruplo (3)
(1) =
,
(2) =
,
(3) JGT
,
(4) CALL
,
(5) PARAM ,
(6) +
,
(7) =
,
(8) +
,
(9) =
,
(10) J
,
(11) DIV
,
(12) =
,
(13) CALL ,
(14) PARAM ,
(15) CALL ,
(16) PARAM ,
#0
#1
I
XCIN
VALOR
SUM
I1
I
I2
SUM
I3
XCOUT
SUM
XCOUT
PROM
,
,
, 10
,
,
, VALOR
,
, #1
,
,
, #10
,
,
,
,
,
,
,
,
SUM
I
(11)
// SUM = 0
// for ( I = 1; I <= 10 ; I++)
// cin>>VALOR
,
,
,
,
,
,
,
,
I1
SUM
I2
I
(3)
I3
PROM
,
// cout<<PROM;
,
Ejercicio 5
Int A[1..10]
Si cada variable entera ocupa una palabra de memoria, entonces, se debe asignar 10
palabras para almacenar el vector.
En general
Int A[i..f] deben asignarse f-i+1 palabras de almacenamiento para el
vector
En el caso de una matriz
El primer subindice debe ocupar 6 valores y el segundo subindice debe ocupar 7 valores.
Para almacenar toda la matriz deben asignarse un total de 6* 7 = 42 palabras
Pag.10/17
Lenguajes y Traductores
2015-I
En general
Int A[i1..f1 , i2..f2]
Para almacenar la matriz se requieren (f1 - i1 + 1) * , (f2 - i2 + 1) palabras
Cuando se genera la generacin de cdigo para la referencia a matrices, es importante
conocer el elemento de la matriz que corresponde a cada palabra de almacenamiento
asignado. Para los vectores la primera palabra contendra A[1], la segunda palabra
contendra A[2] y as sucesivamente. En el caso de matrices no es tan obvio. Esto depender
de cmo se represente la matriz en memoria, por filas o por columnas. Si la representacin
de la matriz es por filas, todos los elementos de la matriz que tienen el mismo valor del
primer ndice se almacenan en localidades contiguas. Si la representacin de la matriz es por
columnas, todos los elementos de la matriz que tienen el mismo valor del segundo ndice se
almacenan en localidades contiguas.
Int A[i..f]
Supongamos :
*
=
i
i1
#5
#1
#3
i1
i2
A[i2]
i
j
i1
i3
#5
#7
#1
i2
#3
i1
i2
i3
i4
A[i4]
(1)
(2)
(3)
(4)
(5)
*
+
*
=
Pag.11/17
Lenguajes y Traductores
2015-I
Int A[10,10],B[10,10];
...
...
for(i=1 ; i =10 ; i++)
A[i , 2*j-1] = B[i , 2*j]
Fig. YY Segmento de codigo
(1) =
(2) JGT
(3) (4) *
(5) *
(6) (7) (8) +
(9) *
(10) (11) *
(12) *
(13) (14) +
(15) *
(16) =
(17) +
(18) =
(19) J
(20)
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#1
I
I
I1
#2
I3
I4
I2
I6
I
I8
#2
I10
I9
I12
B[I13]
#1
I14
,
, #10
, #1
, #10
, J
, #1
, #1
, I5
, #3
, #1
, #10
,J
, #1
, I11
, #3
,
,I
,
,
,
(20)
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
I
// I = 1
// Ir a la prop. 20
I1
// calculo del subindice para A
I2
I3
I4
I5
I6
I7
I8
// calculo del subindice para B
I9
I10
I11
I12
I13
A[I7]
I14
I
(2)
siguiente proposicin
los cudruplos 5 y 12 son iguales, con excepcin del nombre del resultado intermedio
producido.El operando J no cambia de valor entre los cuadruplos 5 y 12. Esto significa que se
puede eliminar el cuadruplo 12 y reemplazar cualquier referencia a su resultado I10
Pag.12/17
Lenguajes y Traductores
(1) =
(2) JGT
(3) (4) *
(5) *
(6) (7) (8) +
(9) *
(10) +
(11) *
(12) =
(13) +
(14) =
(15) J
(16)
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#1
I
I
I1
#2
I3
I4
I2
I6
I2
I12
B[I13]
#1
I14
2015-I
,
, #10
, #1
, #10
, J
, #1
, #1
, I5
, #3
, I4
, #3
,
,I
,
,
,
(16)
,
,
,
,
,
,
,
,
,
,
,
,
,
I
// I = 1
// Ir a la prop. 16
I1
// calculo del subindice para A
I2
I3
I4
I5
I6
I7
I12
// calculo del subindice para B
I13
A[I7]
// operacin de asignacion
I14
I
(2)
siguiente proposicin
(1) *
(2) (3) (4) =
(5) JGT
(6) (7) *
(8) +
(9) *
(10) +
(11) *
(12) =
(13) +
(14) =
(15) J
(16)
,
,
,
,
,
,
,
,
,
,
,
,
,
,
#2
I3
I4
,
#1
I
I
I1
I2
I6
I2
I12
B[I13]
#1
I14
, J
, #1
, #1
,
,
,
,
, #10
, #1
, #10
, I5
, #3
, I4
, #3
,
,I
,
,
I3
I4
I5
,
,
I1
I2
I6
I7
I12
I13
,
,
,
,
,
,
, A[I7]
,
I14
,
I
,
(5)
I
// I = 1
(16) // Ir a la prop. 16
// calculo del subindice para A
siguiente proposicin
Pag.13/17
Lenguajes y Traductores
2015-I
Ejercicio 6
realizar el anlisis para la frase
int A[10,10],B[10,10];
...
...
for(i=1 ; i =5 ; i++)
A[2*i -k , j] = B[2*i , 2*j]
Optimizar el cdigo
Ejemplo 12
SL
LISTA_ID
Leer (LISTA_ID)
Id / LISTA_ID, Id
Procedimiento Lectura()
Inicio
Encontro = Falso
Si Token = Leer
Lexico(Token)
Si Token = (
Lexico(Token)
Si LISTA_ID devuelve xito
Si Token = )
Enccontro = verdad
Lexico(Token)
FinSi
FinSi
FinSi
FinSi
Si Encontro = Verdad
Retornar xito
Sino
Retornar Fracaso
FinSI
Fin Lectura
Pag.14/17
Lenguajes y Traductores
Leer
Lectura
Procedi
miento
Lectura(
)(
Inicio
Encontr
o=
Falso LISTA_ID()
Procedimiento
Inicio
S
Encontro
i Token = Falso
Token = Id
=SiLeer
2015-I
Lectura
Procedi
miento
Lectura(
Lectura
Leer ) (
Inicio Procedi
miento
Encontr Lectura(
)Id
o=
Falso Inicio
(valor)
Leer
S
i Token Encontr
= Leer o =
Encontro = verdad
Falso
Lexico(Token)
S
Mientras Token = , y Encontro = verdad
i
Token
Lexico(Token)
Lexico(
Lexico(
Si Token = IdToken) = Leer
Token)
S
i Token
= ( FinSi
S
Encontro = Fracaso
Lexico(
FinSi
Si Encontro = Verdad
Retornar xito
Sino
Lexico( Retornar Fracaso
FinSI
Token)
Fin LISTA_ID
EXP
S
i Token
Lexico( = (
Token)
S
i Token
Lexico(= (
Token)
Procedimiento
Asignacion()
Lexico(
S Lexico(
S
Inicio
Token)
Token)
Encontro = Falso
i
i
Si Token = Id
LISTA_
LISTA_
Lexico(Token)
ID
ID
S Si Token = =
S
devuelv
devuelv
Lexico(Token)
i
i
e xito
e xito
Si EXP
devuelve xito
LISTA_
LISTA_
Enccontro
= verdad
ID S
ID
FinSi
S
devuelv
FinSi
devuelvi
i
FinSi
e xito
e xito
Si Encontro = Verdad
T
T
Retornar xito
S
Sino
o
o
i
Retornar
Fracaso
k
k
FinSI
e
e
Fin Lectura
T
S
SA
S
i TokenLexico(
= ( Token)
i Token
Token)
= (
FinSi
i
ID = EXP
LISTA_
ID
devuelv
e xito
S
i
T
o
k
e
n
)
Augusto Cortez Vsquez
S
i TokenEncontr
o=
= Leer
Falso
S
i
Token
Lexico(
Token) = Leer
Lexico(Token)
Sino
Lectura
Procedi
miento
Lectura(
Lectura
)(
Inicio Procedi
miento
EncontrLectura(Id
)
o=
Falso Inicio
o
k
e
n
S
i
T
o
k
e
n
)
=
Pag.15/17
Lenguajes y Traductores
2015-I
Asignacio
nnectura
Asignacio
Asignacio
a
Procedi
Procedi
miento
miento
EXPRESI
Lectura(
ID
=
ID Lectura(
=
ID
ONctura
)
)
Inicio
Inicio Procedi
E miento
ProcedimientoEEXP()
Inicio ncontro
ncontro Lectura(
Encontro
=
Falso
= Falso
= Falso )(valor)
Si TERMINO devuelve exito
S Encontro = verdad
S Inicio
E
i Token Mientras Token = +i Token
o Token = - y Encontro
= verdad
= Leer
Lexico(Token)
= Leer ncontro
= Falso
Si TERMINO devuelve ffracaso
Encontro
=
Falso
S
L
L
FinSi
i
Token
exico(To FinMientras
exico(To
= Leer
ken)
ken)
FinSi
Si Encontro = Verdad
S Retornar xito
Sino
i Token
Retornar Fracaso
= (
FinSI
Fin LISTA_ID
7
L
exico(To
Procedimiento
TERMINO()
ken)
Inicio
a
Procedi
miento
EXPRES
Lectura(
=
Lectura
)
Inicio Procedi
Emiento
ncontro Lectura(
= Falso )
SInicio
E
i Token
ncontro
= Leer
= Falso
S
L
i
Token
exico(To
ken) = Leer
L
S
i Token exico(To
ken)
= (
L
S
exico(To
i Token
= ( ken)
S
L i Token
exico(To = (
ken)
S
iL Token
= (
exico(To
ken)
L
L
exico(To
S //
S exico(To
S
Se procede de forma similar
a EXPRESION
ken)
ken)
i
i
i
LISTA_I
LISTA_I
LISTA_I
D 7
D
D
Ejercicio
S
S
devuelve
devuelve
devuelve
Construya el cdigo para la sentencia While
i
i
xito
xito
xito
LISTA_I
LISTA_I
D
D S
S
S
Ejercicio
9
Fin TERMINO
devuelve
devuelve
i
i
i
xito
xito
Modifique la gramtica
del ejemplo 6 Tpara que reconozca la frase T5*( a+b)
T
S
S
Realice el anlisis
o para la frase 5*( a+b)
o
o
i
i
k
k
k
e
e
e
Ejercicio 10
T
T
n
n
n
o
o
a) Construya una
gramtica
para
reconocer
Frases
del
clculo
proposicional.
k
k
=
=
=
e
(a b) , (a^b-->c)
e
n
n
)
)
)
=
=
E
)
E
)
Lenguajes y Traductores
2015-I
b) Asigne acciones semnticas para las reglas de produccin que genere cdigo
en postfijo. Realice el anlisis para una frase no trivial ( ver ejemplo 6)
c) Asigne acciones semnticas para las reglas de produccin que genere cdigo
con cudruplos. Realice el anlisis para una frase no trivial ( ver ejemplo 7)
REFERENCIAS BIBLIOGRAFICAS
[1]
[2]
[3]
[4]
[CORTEZ 2012] Augusto .Cortez Vsquez. Lenguajes y Compiladores, Edit UCSS Lima
2012
[5]
[CORTEZ 2011] Augusto .Cortez Vsquez. Algoritmica, Edit EsVega Lima Per 2011
[6]
[7]
[CORTEZ 2011] Augusto .Cortez Vsquez. Matemticas Discretas, Edit San Marcos Lima
2011.
[8]
[CORTEZ 2009] Augusto .Cortez Vsquez, Procesamiento del lenguaje natural. Revista RISI
Vol 6 N 2 2009 , Pg 45-54 ISSN 1815-0268 Lima Per www.openjournal.unmsm.edu
[9]
[10]
Pag.17/17