You are on page 1of 58

Temario.

Unidad 1. Repaso de sintaxis.


1.1 Gramtica de un lenguaje.
1.2 Descenso recursivo.

Unidad 2. Semntico.
2.1 Forma interna del programa fuente.

Notacin polaca.

Cudruplos.

2.2 Rutinas semnticas.

Expresiones aritmticas.

Estatutos condicionales.

Unidad 3. Generacin de cdigo.


3.1 Cudruplos.
3.2 Notacin polaca.

Expresiones aritmticas.

Expresiones condicionales.

3.3 Optimizacin de cdigo.

Unidad 4. Administracin de la memoria principal.


4.1 Paginacin.
4.2 Segmentacin.
4.3 Paginacin-Segmentacin.

Gramtica.
Conjunto de reglas que determinan un un lenguaje.

Sintxis.
Verifica que la secuencia de tokens sea vlida para un lenguaje.

Tipos de gramtica.
1. Irrestricta.
x y en donde x tiene por lo menos un elemento no terminal.
2. Contexto sensitivo o sensitiva al contexto.
x y
x <= y (en cuanto al nmero de elementos de y)
y > 0 (no permite producciones con el elemento vacio)

3. Libre de contexto.
x y
x =1

y es un elemento no terminal.

y >= 0

Tipos de gramtica libre de contexto.

Lineal izquierdo.

Lineal derecho

Recursiva izquierdo

Recursiva derecho

Recursiva central

Lineal izquierdo.
Es la derivacin en donde tan solo el no terminal de ms a la izquierda de cualquier
forma de frase se sustituye a cada paso.
<S>
<S> <Y> x
<Z> <W> z

<Z>

<Z>
<W> w

<Y>

<Y> <Z> y

<W>
w

wzyx

Lineal derecha.
Es la derivacin en donde tan solo el no terminal de ms a la derecha de cualquier
forma de frase se sustituye a cada paso.
<S>

<S> x <Y>
<Y> y <Z>

<Y>

<Z> z <W>

<Z>

<Z>
z

<W> w

<W>
w

xyzw
Recursiva izquierda.

Es la derivacin en donde tan solo el no terminal de ms a la izquierda se sustituye


a cada paso recursivamente es decir a si misma.
<S>
<S> <S> a | <S> d
<S>
a
<S> <S> b
<S> c
<S> <S>

<S>
<S>
c

b
cbaa

Recursivo derecho.
Es la derivacin en donde tan solo el no terminal de ms a la derecha se sustituye a
cada paso recursivamente es decir a si misma.
<X> <S>

<X>

<S> a <S> | d <S>

<S>

<S> b <S>

<X> c

<S>
a

<S>
<S>

aabc

Recursiva central.

Es la derivacin en donde tan solo el no terminal del centro se sustituye a cada


paso recursivamente es decir a si misma.
<X> <S>

<X>

<S> a <S> b

<S>

<S> c <S> d

<S> e

c
acedb

<S>

<S>

Ejemplos:
Libre de contexto.
<S> if <X> then <Y>

x y

<X> a <op> b

|x|=1

<op> > | <

| Y | >= 0

<Y> x <opA> y
<opA> =

Puede tener vacio

Contexto sensitivo.
<S> <X> <Y>

xy

<X> a <Z>

y no permite vacio

a<Z> b <W>
<Y> d
<W> c
Irrestricta.
<X> <A> <B>

Sin restricciones.

<A> a
<B> b
Derivacin.
Consiste en sustituir los elementos no terminales por sus producciones.
Ejemplo:
<S> IF <X> then <Y>

Se sustituye de izquierda a derecha

<S> IF a <OP> b then <Y>


<S> IF a<b then <Y>
<S> IF a<b then x <OPA> y
<S> IF a<b then x=y

El resultado es solo con terminales

Componentes de la gramtica.
G={P, S, V, V} o bien G={P, S, T, N}
En donde: P=producciones.
S=produccin inicial
V=los elementos terminales
V=los elementos no terminales

De el ejemplo anterior........

P={S, X, Y, op, opA}


S={S}
V={a, if, b, then, x, y, =, >, >}
V={S, X, Y, op, opA}

Cmo se representa una gramtica grficamente?

Diagrama de sintxis.

Direccin

Terminales

No terminales

Patrones ms comunes.

a) Secuencia de smbolos.
<S>
a

<S> a <X> b

b) Alternativa de smbolos.
<TIPOS>
real
char
int
<TIPOS> real | char | int
c) Repeticin de smbolos.

<X>
a

<X> a <X>
<X> a
Ejemplos:

<PROGRAM>

PARAM

fun

id

proc

id

;
PARAM

TIPO

<PROGRAM> fun id <X> ; <TIPO>


<X> <PARAM> |
<PROGRAM> prac id <X>

<PARAM>

var
(

id
X

;
Y

<PARAM> ( <X> <Y> : <TIPO> )


<X> var |
<Y> id <Z>
<Z> ; id <Z>
<Z>
<TIPO> char | int | real
Validar la siguientes cadenas:
(var id;id:real)
<PARAM> (<X> <Y> : <TIPO>)
<PARAM> (var <Y> : <TIPO>)
<PARAM> (var id <Z> : <TIPO>)
<PARAM> (var id ; id <Z> : <TIPO>)
<PARAM> (var id ; id : <TIPO>)
<PARAM> (var id ; id : real)

TIPO

fun id (id : char); real

<PROGRAM> fun id <X> ; <TIPO>


<PROGRAM> fun id <PARAM> ; <TIPO>
<PROGRAM> fun id (<X> <Y> : <TIPO>) ; <TIPO>
<PROGRAM> fun id (<Y> : <TIPO>) ; <TIPO>
<PROGRAM> fun id ( id <Z> : <TIPO>) ; <TIPO>
<PROGRAM> fun id ( id : <TIPO>) ; <TIPO>
<PROGRAM> fun id ( id : char ) ; real

Anlisis Sintctico Descendente.


Anlisis Sintctico por descenso recursivo.
Anlisis Sintctico recursivo. (predictivo).

Anlisis Sintctico Ascendente.


Anlisis sintctico LR-Simple.
Anlisis sintctico LR-Cannico.
Anlisis sintctico LALR (lookahead-LR)

Anlisis sintctico
Buffer de
entrada

Y
+
Z

Programa Sintctico

Salida de
producciones

X
$
<X> --> <Y>+<Z>
<Z> --> b
<Y> --> a

PILA
Tabla de anlisis sintctico predictivo
(Matriz predictiva)

Un analizador sintctico esta guiado por tablas, tiene un buffer de entrada, una pila,
y una tabla de anlisis sintctico y tambin una salida.

El buffer de entrada contiene la cadena que se va a analizar seguida de un smbolo


de pesos ($), un smbolo utilizado como delimitador derecho para indicar el fin de la
cadena.

La pila contiene una secuencia de smbolos gramaticales con un smbolo de pesos


en la parte inferior que indica la base de la pila, al principio la pila contiene el
smbolo inicial de la gramtica encima del signo de pesos. La tabla de anlisis
sintctico es una matriz bidimensional de la forma M [A,a] en donde A es un no
terminal y donde a es el smbolo terminal o bien el signo de $, se controla el
analizador sintctico mediante un programa que se comporta como sigue:

Sea X el smbolo superior de la pila y a el smbolo en curso de la entrada: estos


dos smbolos determinan la accin del analizador y tienen las siguientes acciones:

1)Si x = a = $ El string es vlido.


2)Si x = a $
Se saca x de la pila
Se mueve el apuntador al siguiente smbolo o analizador en curso.

3)Si x es un no terminal el programa consulta la entrada de M [X,a] de la tabla de la


matriz de anlisis sintctico.

Esta entrada ser o una produccin de x de la gramtica o una entrada de error. Si,
por ejemplo, M [X,a] es igual a x que produce uvw osea M [X,a] =
{X<y>+<z>} el analizador sintctico sustituye la x de la cima de la pila por
<z>+<y> quedando en la parte de encima de la <y> como salida, se sabe que el
analizador sintctico solo imprime la produccin utilizada; ah se podra utilizar
cualquier otro cdigo. Si M [X,a] = error ; el analizador sintctico llama a una rutina
de recuperacin de error e indica el tipo de error que a ocurrido.

Ventajas:
1.

Programacin medianamente corta.

2.

Medianamente fcil de programar.

Desventajas.
1.

Un mantenimiento no sencillo.

Restricciones.
1.

Solo para gramticas libres de contexto.

2.

Se tiene que eliminar la recursividad izquierda y factorizar si es necesario.


(No debe haber 2 elementos en una sola de las casillas de la matriz
predictiva)

Ejemplo:
1) <E> <T> <E>
2) <E> + <T> <E>
3) <E>
4) <T> <F> <T>
5) <T> * <F> <T>
6) <T>
7) <F> id
8) <F> (<E>)
Validar la siguiente cadena:
Id + id

A continuacin se dar una corrida a la gramtica para saber si la cadena es vlida

PILA

ENTRADA

SALIDA

$<E>

Id+id$

1) <E> <T><E>

$<E><T>

Id+id$

4) <T> <F> <T>

$<E><T><F>

Id+id$

7) <F> id

$<E><T> id

Id + id $

6) <T>

$<E>

2) <E> + <T><E>

$<E><T>+

+ id $

4) <T> <F> <T>

$<E><T><F>

Id $

7) <F> id

$<E><T>id

Id $

$<E><T>

6) <T>

$<E>

3) <E>

Cadena vlida

Primeros y siguientes.
Se facilita la construccin de una analizador sintctico predictivo con 2 funciones
asociadas a una gramtica (G).
Estas funciones P y S permiten rellenar siempre que sea posible las entradas de una
tabla de anlisis sintctico predictivo para una gramtica.
Tambin se puede utilizar los conjuntos de componentes lxicos devueltos por la
funcin S como componentes lxicos de sincronizacin durante la recuperacin de
errores.
Si es una cadena de smbolos gramaticales se considera primeros de como el
conjunto de terminales que inician las cadenas derivadas de .
Si entonces el vaco tambin est en primeros de .
Se define siguientes de A para el no terminal de A, como el conjunto de terminales
de A que pueden aparecer inmediatamente a la derecha de A en alguna forma de
frase, es decir, el conjunto de terminales de A tal que halla una derivacin de la
forma S Aa para algn y .
Primeros.
Primero () es el conjunto de smbolos terminales que inician cualquier derivacin
de .

Clculo:
a)

Si X es un smbolo terminal, entonces primeros () = X

b)

Si X es un smbolo no terminal, entonces para cada produccin del tipo

x 1, 2........ n
1) Incluir primeros de (i) el primeros de (X)
2) De i=1 hasta n-1
Si est incluido en primeros de (i) incluir en primeros de (i+1).
3) Tomando como base el punto anterior, si vaco est incluido en
primeros de (i) hasta primeros de (n) incluir vacio en primeros de (X).

Ejemplo:
<S> <E> a
<E> op
<E>
P<S> = {P<E>} = {op, }
P<E> = {op, }
Siguientes.
X YZ
1)
2)

Si X es la primera produccin de la gramtica se incluye $ en siguientes de X.


Los siguientes de Y son:

a) Si Z es un terminal se incluyen los primeros (Z) en siguientes (Y) a excepcin del


vaco.
b) Si Z es un no terminal se incluyen los primeros (Z) en siguientes de Y a excepcin
del vaco.
3) Los siguientes de Z son, si Z es el ltimo trmino de la produccin, se incluyen
los siguientes de esa produccin en siguientes de Z.

No se incluye el vaco en vez de esto se incluyen los siguientes de la produccin que


genera el vaco.
Ejemplo:
1) <E> <T> <E>
2) <E> + <T> <E>
3) <E>
4) <T> <F> <T>
5) <T> * <F> <T>
6) <T>
7) <F> id
8) <F> (<E>)

Primeros.
P(<E>) = {P(<T>)} = {id, ( }
P(<E>) = {+, }
P(<T>) = {P(<F>)} = {id, ( }
P(<T>) = { *, }
P(<F>) = {id, ( }

Siguientes.

S(< E>) = { $, )}
S(<E>) = {S(<E>), S(<E>) } = { $, ) }
S(<T>) = {P(<E>)} = { +, S(<E>)} = { +, $, ) }
S(<T>) = {S(<T>), S(<T>)} = { +, $, ) }
S(<F>) = {P(<T>)} = { *, S(<T>) } = { *, +, $, ) }

Construccin de la matriz predictiva.

Para cada produccin A realizar lo siguiente:


a) Para cada smbolo terminal en primero de () agregar A en M[A, ]
b) Si esta contenido en primero (), entonces para cada smbolo terminal
en sig (A), agregar M en [A,$]

2. Cada espacio de la matriz indefinido hace error.

A continuacin se muestra un ejemplo de cmo construir la matriz predictiva, se utiliz


la gramtica anterior para obtener los first y los follows.

id

<E>

error

error

error

error

<E>

error

error

error

<T>

error

error

error

error

<T>

error

error

<F>

error

error

error

error

PILA

ENTRADA

SALIDA
(producciones)

$<E>

Id*id+id$

$<E><T>

Id*id+id$

$<E><T><F>

Id*id+id$

$<E><T>id

Id *id+id$

$<E><T><F>*

*id+id$

$<E><T>id

id+id$

$<E>

$<E><T>+

+id$

$<E><T><F>

Id$

$<E><T>id

Id$

$<E>

Cadena vlida

Ejercicio:
Realizar primeros, siguientes, matriz predictiva y validar las siguientes cadenas:
bmdm, fd, fdm
1) <A> <B> d <A>
2) <A> m
3) <B> <C> <D>
4) <C> b <A>
5) <C>

checar gramatica

6) <D> f
7) <D> g
Primeros.

P(<A>) = {P(<B>), m, } = {b, m, }


P(<B>) = {P(<C>)} = {b, }
P(<C>) = {b, }
P(<D>) = {f, g}
Siguientes.
S(<A>) = {S(<A>), S(<C>)} = {f, g, $}
S(<B>) = {d}
S(<C>) = {P(<D>)} = {f, g}
S(<D>) = {S(<B>)} = {d}
T
N

f
1

G
1

<A>

error

error

<B>

error

error

error

<C>

error

error

error

<D>

error

error

error

error

bmdm
PILA

ENTRADA

SALIDA

$<A>

bmdm$

$<A>d<B>

bmdm$

$<A>d<D><C>

bmdm$

$<A>d<D><A>b

bmdm$

$<A>d<D>m

mdm$

error

fd
PILA

ENTRADA

SALIDA

$<A>

fd$

$<A>d<B>

fd$

$<A>d<D><C>

fd$

$<A>d<D>

fd$

$<A>df

fd$

$ <A>

Cadena no vlida

fdm
PILA

ENTRADA

SALIDA

$<A>

fdm$

$<A>d<B>

fdm$

$<A>d<D><C>

fdm$

$<A>d<D>

fdm$

$<A>df

m$

$m

m$

Cadena vlida

1) <S> if <COND> then <OPERACION> else <ASIG> end


2) <COND> id <OR> id
3) <OR> >
4) <OR> <
5) <OPERACION> id <OA> id
6) <OA> +
7) <OA> 8) <OA> *
9) <ASIG> id <A> id
10) <A> :=
Para la gramtica anterior validar la siguiente cadena: if id < id

Primeros.
P(<S>) = { if }
P(<COND>) = { id }
P(<OR>) = { >, < }
P(<OPERACION>) = { id }
P(<OA>) = { +, -, * }
P(<ASIG>) = { id }
P(<A>) = { := }
Siguientes.
S(<S>) = { $ }
S(<COND>) = { then }
S(<OR>) = { id }
S(<OPERACION>) = { else }
S(<OA>) = { id }
S(<ASIG>) = { end }
S(<A>) = { id }
If

the
n

else

end

id

>

<

:=

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

10

error

PILA

ENTRADA

SALIDA

$<S>

If id < id then $

$end<ASIG>else<OPERACION>then<COND>if

id < id then $

$end<ASIG>else<OPERACION>then id<OR> id

< id then $

$end<ASIG>else<OPERACION>then id

error

Tcnicas de anlisis ascendentes para analizadores sintcticos.

LR- Simple

LR- Cannico

LALR

Constituyen un rbol de derivacin para un string de entrada, iniciando por las


y avanzando a la raz.

Ventajas.
1.

Se detectan errores tan pronto como se van obteniendo las entradas.

2.

No importan la recursividad de las gramticas ni deben estar factorizadas.

Desventajas.
1.

Cuesta ms trabajo implementar la tcnica.

Mtodo LR-Simple.
Entrada

0
$

Programa
Analizador
LR

SALIDA

PILA

TABLA
DE
ACCIONES

TABLA
DE SALTOS

En este mtodo la pila almacena smbolos terminales y no terminales en el tope de


la pila siempre se debe encontrar un estado (que va a ser el estado actual del
analizador). Cada espacio resume la informacin contenida en la pila.

La combinacin del smbolo de estado en el tope se la pila y el smbolo de estado


En el tope de la pila y el smbolo de entrada actual se utiliza para indexar la tabla
de acciones a la tabla de saltos, inicialmente la pila contiene el estado cero.

Agregar apuntes pag 90 libro de


fundamentos de compiladores

Tabla de acciones.
Es un arreglo bidimensional con un arreglo para cada posible estado y una
columna para cada smbolo terminal de la gramtica y para el signo de pesos.
Cada casilla de la tabla contienen las siguientes acciones.
a)

ACC. Aceptacin.

b)

ERR. Error.

c)

SN. Desplazamiento en introduccin del estado no terminal de la pila.

d)

RN. LA reduccin utilizando la produccin no terminal.

Tabla de saltos.
Es un arreglo bidimensional con un rengln para cada posible estado y una
columna para cada smbolo no terminal de la gramtica, cada casilla contiene
un estado.
TABLA DE ACCIONES
TERMINALES

TABLA DE SALTOS
NO TERMINALES

id

error

error

error

error

ACC

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

error

S1

error

error

error

error

error

R1

error

error

error

S2

error

error

error

error

R3

error

error

R2

error

error

error

error

error

etc

error

error

error

error

error

error

error

error

error

Ejemplo Mtodo LR.


0) <E> . <E>
1) <E> .<E>+<T>
2) <E> .<T>
3) <T> .<T>* <F>
4) <T> . <F>
5) <F> .id
6) <F> .(<E>)
Primeros.
P(<E>) = {P(<E>) } = { id, ( }
P(<E>) = {P(<E>), P(<T>)} = { id, ( }
P(<T>) = {P(<T>), P(<F>)} = { id, ( }
P(<F>) = { id, ( }

Siguientes.
S(<E>) = { $ }
S(<E>) = {S(<E>), +, ) } = { $,+, ) }
S(<T>) = {S(<E>), *} = { $,+, ), * }
S(<F>) = { $,+, ), * }
0

<E> .<E>

<E> .<E> + <T>


<E> .<T>
<T> .<T> * <F>
<T> .<F>
<F> .id
<F> .(<E>)

<E>
<E>
<T>
<T>
<F>
id
(

1
1
2
2
3
S4
S5

<E> <E>.
<E> <E>. + <T>

<E> <T>.
<T> <T>. * <F>

<T> <F>.

<F> id.

ACC

Sig E
+

S6

+, $, )

R2

Sig E

S7

$, +, ), *

$, +, ), *
Sig F

<F> (.<E>)

<E>

<E> .<E> + <T>

<E>

<E> .<T>

<T>

<T> .<T> * <F>

<T>

<T> .<F>

<F>
id

<F> .id
<F> .(<E>)

R4

R5

8
8
2
2
3
S4
S5

<T> .<F>

<F> .id

id

<F> .(<E>)

<T> <T> * .<F>


<F> .(<E>)

<F> (<E>.)
<E> <E> .+ <T>

<E> <E> + <T>.


<T> <T> .* <F>

10

<T> .<T> * <F>

<F> .id

<E> <E> + .<T>

<T> <T> * <F>.

F
id
(

S4
S5

10
S4
S5

)
S11
+

S6

$, +, )
Sig. E
*

R1
S7

$, +, ), *
R3
Sig. T

11

<F> (<E>).

$, +, ), *
R6
Sig. F

TABLA DE ACCIONES
TERMINALES

TABLA DE SALTOS
NO TERMINALES

id

error

error

S5

S4

error

error

S6

error

error

error

error

ACC

error

error

error

R2

R2

error

error

S7

R2

error

error

error

R4

R4

error

error

R4

R4

error

error

error

R5

R5

error

error

R5

R5

error

error

error

error

error

S5

S4

error

error

error

error

S5

S4

error

error

error

error

error

S5

S4

error

error

error

error

10

S6

11

error

error

error

error

error

error

error

R1

R1

error

error

error

R1

error

error

error

10

R3

R3

error

error

R3

R3

error

error

error

11

R6

R6

error

error

R6

R6

error

error

error

Verificar si la siguiente cadena es vlida: id + id$

PILA

ENTRADA

SALIDA

$0

id + id$

S4

$0id4

+ id$

R5

F id

$0F3

+ id$

R4

T F

$0T2

+ id$

R2

E T

$0E1

+ id$

S6

desplaza

$0E1+6

Id$

S4

desplaza

$0E2+6id4

R5

F id

$0E1+6F3

R4

T F

$0E1+6T9

R1

E E+T

$0E1

ACC

Eliminacin de la recursividad por la izquierda.


A A | B
Ejemplo:
1)

Aquellas que no contengan al elemento recursivo se agrega una


produccin nueva (A) al lado derecho.
A

2)

BA

Aquellas producciones que si contengan al elemento recursivo se pasa el


elemento recursivo como la produccin nueva al lado derecho y se agrega
una produccin de la misma que produce .
A A

1) A BA

2) A A
3) A

Ejemplos:

Gramatica original.

Eliminacin de la recursividad.

S Aa | b

S Aa | b

A Ac | Sd |

A bd A
A
A cA
A adA
A

Gramatica original.

Eliminacin de la recursividad.

1)

E E+T

1) E T E

2)

E T

2) E + T E

3)

T T*F

3) E

4)

T F

4) T F T

5)

F id

5) T * F T

6)

F (E)

6) T
7) F id

El cdigo intermedio forma un lenguaje de bajo nivel, sin llegar al nivel ms


primitivo.

Tipos de cdigo intermedio.


CONVERTIDA
Notacin polaca.

A:=B+C*D

Triplos.

A:=B+C*D

Cudruplos.

Cdigo P.

A:=B+C*D

A:=B+C*D

ABCD*+:=

oper

op1

op2

T1

:=

R2

oper

op1

op2

res

T1

T1

T2

:=

T2

Cargar B
Cargar C
Cargar D
Multiplicar , Suma
almacena A

Triplos.
Este tipo de cdigo utiliza instrucciones en un formato de 3 campos.

Oper

Op1

Op2

En donde:
Oper = Cdigo de operacin.
Op1 = Operando 1
Op2 = Operando 2

Ejemplo:
A+B
3

<S>

<OP1>

OP1

id

cte

TRIPLO

B
A

Pila de
operandos

Pila de
operadores

Acciones.
1

Insertar en la pila de operandos.


PUSH_pilaop(pos_act) = id cte
pos_act+1

Insertar en la pila de operadores.


PUSH_pilaoper(pos_act) = +
pos_act+1

Genera triplo de la siguiente forma.


Op2 = tope pila_op

sacar

Op1 = tope pila_op

sacar

Oper = tope pila_oper sacar


Comparacin de los diversos modos expuestos.
En cuanto a la cantidad de memoria que requiere para su almacenamiento
podramos ordenarlos de mayor a menor.

Notacin polaca.

Cdigo P.

Triplos.

Cudruplos.

En cuanto a la velocidad de su ejecucin de menor a mayor.

Cudruplos.

Triplos y cdigo P.

Notacin polaca.

Si lo que se requiere es convertir el cdigo intermedio a cdigo objeto,


ordenado de menor a mayor grado de dificultad .

Cudruplos.

Triplos.

Cdigo P.

Notacin polaca.

Las ventajas de los modelos que vamos a estudiar para generar el cdigo
intermedio es que su implementacin podr ser modular.

Ejercicio.
A:=B-C+D
<S>
1
id

2
:=

<OP2>

4
OP2

<OP1>

OP1

id

cte

TEMP2
D
TEMP
C
B
A
Pila de
operandores

Oper

Op1

Op2

TEMP=

TEMP2 =

TEMP

TRIPLO =

:=

TEMP2

+
:=

Pila de
operandos

Acciones.
1

Insertar en pila_operandos.
PUSH pila_op(pos_act) = id
pos_act + 1

Insertar en pila de operadores.


PUSH pila_oper(pos_act) = := +
pos_act+1

Mientras el tope de la pila_operadores sea igual a un + un entonces


generar triplo temporal.
Op2 = tope pila_op

sacar

Op1 = tope pila_op

sacar

Oper = tope pila_oper sacar


TEMP = OP, OP1, OP2 TEMP= OP1, OPER, OP2
Insertar en pila de operandos
p_operandos(pos_act) = TEMP
pos_act + 1

Generar triplo
Op2 = tope pila_op sacar de la pila
Op1 = tope pila_op sacar de la pila
Oper = tope pila_oper sacar de la pila

Realizar el siguiente ejercicio tomando en cuenta los diagramas de sintaxis y las


acciones del ejercicio anterior.

X:=A+B+C*D

TEMP2
D
TEMP1
C

TEMP

TEMP1

TEMP

TEMP1

:=

TEMP2

TEMP
+
B
A
X

Pila de
operadores

TEMP2

+
:=

Pila de
operandos

TRIPLO

Generacin de cudruplos para operaciones aritmticas.

Cudruplos.
Estructura de tipo registro que tiene 4 campos que son : llamados: operador,
operando1, operando2, resultado.
En donde:
Operador: cdigo interno para la operacin.
Operando1 y operando 2: valor o variables que intervienen en la operacin.
Resultado: registro donde se guarda el resultado.

Nota: Op1 y Op2 normalmente son apuntadores a una tabla de smbolos y su valor
puede ser nulo.
Ejemplo:
C:=1

Oper

Op1

:=

Op2

Res
1

nulo

Ejemplo:
(A*B) + (C*D)
4

<OPER2>
<S>

EST
2

OPER1

*
4

<OPER1>

/
OPER2

2
+
-

<EST>
id

5
(

OPER1
3

R2
D

C
Oper

Op1

Op2

R1

R2

R1

R2

R3

R1
B

Acciones.
Insertar en la pila de operandos.
PUSH Pila_operandos (pos_act) = id
pos_act+1
2

Insertar en la pila de operadores.


PUSH Pila_operadores (pos_act) = + * /
pos_act+1

Insertar en pila de operadores.


PUSH Pila_operadores(pos_act) = marca fondo falso
pos_act+1

Mientras que el tope de la pila sea = + * /


entonces :
Generar cudruplo
Op2 = tope Pila_operandos sacar de la pila
Op1 = tope Pila_operandos sacar de la pila
Operador = tope Pila_operadores sacar de la pila
Resultado = Resultado de operaciones Rn + 1
Resul = Op1 Oper Op2

A
Pila_op

Pila_oper

e Insertar en la pila de operandos


PUSH Pila_operandos (pos_act) = Rn + 1
Pos_act + 1
5

Sacar Pila_operadores la marca de fondo falso.


POP -Pila_operadores(pos_act) = M.F.F

Ejemplo:
W:=A + B

<S>

1
id

:=

<OP1>
OP2

OP1

2
+

<OP2>

1
id
Cte_num

Cudruplos

R1
B
A

:=

Pila operandos

Pila operadores

:=

R1

R1

Acciones.

Insertar en la pila de operandos.


PUSH Pila_operandos (pos_act) = id
pos_act + 1

Insertar en pila de operadores.


PUSH Pila_operadores (pos_act) = + :=
pos_act + 1

Mientras el tope de la pila de operadores sea igual a +


Generar cudruplo.
Op2 = Tope Pila_operandos sacar
Op1 = Tope Pila_operandos sacar
Oper = Tope Pila_operadores sacar
Res = Resultado Obt = Rn + 1
Res = Op1 Oper Op2
Rn + 1
e Insertar en la pila de operandos
PUSH pila_operandos (pos_act) = Rn + 1
pos_act + 1

Generar cudruplo (Asignacin).


Op2 = nulo
Op1 = Tope pila_operandos sacar de la pila
Oper = Tope pila_operadores sacar de la pila
Res = Tope pila_operandos sacar de la pila

Ejemplo:
W:= A / B +C
<S>

1
id

:=

<OP1>
OP2

OP1

2
+
-

<OP2>
EST

<EST>

id

Constante

C
B

:=

Pila de
operandos

Pila de
operadores

Acciones.
1

Insertar en la pila de operandos


PUSH pila_operandos (pos_act) = id
pos_act + 1

R1

R1

R2

:=

R2

Inserta en la pila de operadores.


PUSH pila_operadores (pos_act) = + / * =

Mientras que el tope de la pila de operadores se igual a + / * =


Generar cudruplo.
Op2 = Tope Pila_operandos sacar
Op1 = Tope Pila_operandos sacar
Oper = Tope Pila_operadores sacar
Res = Resultado Obt = Rn + 1
Res = Op1 Oper Op2
* Inseratar en la pila de operandos
PUSH pila_operandos (pos_act) = Rn + 1
pos_act + 1

4.

Generar cudruplo (Asignacin)


Op2 = nulo
Op1 = Tope pila_operandos sacar de la pila
Oper = Tope pila_operadores sacar de la pila
Res = Tope pila_operandos sacar de la pila

Generacin de cdigo para estatutos.

Se requiere una nueva pila; una pila de saltos adems nuevas instrucciones para
el cdigo como son:
SF

Salto en falso.

SV

Salto verdadero.

SI

Salto incondicional.

Nota: Normalmente al generar un salto, aun no sabemos la direccin a la cual


ser el salto entonces dejamos la direccin pendiente por rellenar utilizando.
Rellenar(direccin a rellenar, valor con que se rellenar)
Adems utilizaremos un contador el cual contendr la direccin del siguiente
cudruplo a analizar.

Estatuto IF THEN ELSE


5

<X>

if

then

<E>

<OP1>
OP1

else

<

OP1
*

cte

>

<S>

1
id

2
:=

4
OP2

10

endif

<OP2>

id

Acciones.

Insertar en la pila de operandos.


PUSH pila_operandos(pos_actual) = id
pos_act + 1

Insertar en pila de operadores.


PUSH pila_oper(pos_actual) = + :=
pos_act + 1

Mientras el tope de la pila de operadores sea igual a + *


entonces
Generar cudruplo
Op2 = tope pila_operandos sacar
Op1 = tope pila_operandos sacar
Oper = tope pila_operadores sacar
Res = result = Rn + 1
Insertar en la pila de operandos PUSH pila_operandos (pos_act) = Rn
pos_act + 1

Generar cudruplo de asignacin.


Res = Tope pila_operandos
Op1 = Tope pila_operandos
Op2 = Nulo
Oper = Tope pila_operadores

Insertar en pila de operadores (pos_act) = Marca fondo falso

Generar cudruplo
Op2 = tope pila_operandos sacar
Op1 = tope pila_operandos sacar
Oper = tope pila_operadores sacar
Res = result = Rn + 1

Insertar Rn en pila de operandos.

Salto en falso con lo que esta en el tope pila_operandos y gurdar la direccin


de cudruplos en pila_saltos.

Salto incondicional (SI_ _)


Rellenar (TOPE_saltos, cont + 1) e inseratr la direccin de SI en P.saltos.

9.

Rellenar (TOPE-saltos, cont + 1)

10.

Sacar marca de fondo falso de pila_operadores.

Ejemplo:
If A>B then
A:=B*C
Else
A:=C*D
endif
Pila
operandos

Pila
operadores

Pila de
saltos

>

R1

:=

:=

R2

5
#

oper

op1

op2

Res

>

R1

SF

R1

R2

:=

R2

SI

R3

:=

R3

R2

Estatuto REPEAT
5

<X>

6
S

Repeat

<S>

Until

id

:=

<OP2>
OP1

OP2

*
<E>

/
OP1
<OP1>

2
>=

id

<=
cte
>

<
Acciones.
1, 2, 3, 4. Son igual a las anteriores del if.
5.

PUSH pila_saltos (la direccin del siguiente cudruplo a analizar) = cont

Generar cudruplo y SF de la sig forma:


Op2 = Tope pila_operandos
Op1 = Tope pila_operandos
Oper = Tope pila_operadores
Rn

= Rn + 1 e insertar en pila_op

Generar un SF con lo que est en el tope pila_operandos y rellenar la direccin de


este salto con tope pila_saltos y sacar.
Ejemplo:
X=1

Y=2

Z=3

Repeat
X:=Y + Z
Z:=Y + 1
Until
Z 10

Y=0
X

Pila de
operandos

R1

Pila de
operadores

:=

:=

:=

Pila de saltos

3
1

R2

10

>=

4
#

oper

op1

op2

Rn

:=

:=

:=

R1

:=

R1

R2

:=

R2

>=

10

R3

SF

R3

10

:=

R3

Estatuto FOR.

<FOR>

FOR

id

:=

EXP

TO

EXP

do

endfor

Acciones.

Insertar en la pila de operandos el siguiente id.

Insertar el id en pila_operandos

Insertar el := en la pila de operadores.

Insertar EXP y generar cudruplo(s) de la sig forma:


Res = Top_pila de operandos sacar de la pila
Op1 = Top_pila de operandos sacar de la pila
Op2 = Nulo
Oper = Top_pila de operadores sacar de la pila

Insertar en la pila de saltos (el siguiente cudruplo a analizar ) . Cont + 1

Insertar la EXP (id) p_oper y generar cudruplo de la siguiente forma:


Op2 = tope pila_operandos. (POP)
Op1 = tope pila_operandos. (POP)
Oper = >
Res = Rn + 1 e insertar Rn + 1 en la pila de operandos.

Hacer un salto verdadero con tope pila_operandos i dejar la direccin


pendiente por rellenar, e insertar pila de saltos su direccin.

Generar cudruplos.

Hacer un SI con TOP 1 (pila_saltos) y rellenar.


Rellenar (top_pila_saltos, cont + 1)

Ejemplo:
For i:= 0 to 10 do
A:=A+1
i:=i+1
endfor
#

oper

op1

>

SV

R1

:=

R2

R3

SI

op2

Res
0

10

R1
9

R2
A

R3
i
2

Pila de
operandos

Pila de
operadores

:=

Pila de
saltos

10

R1

> SV
3

< SF

R2

Estatuto CASE

<CASE>
1

case

EXP

of

OPC

EST

else
5

EST
4

endcase
Acciones.

Insertar EXP en la pila de operandos.

Insertar OPC en la pila de operandos y hacer un cuadruplo de la siguiente


forma:
Op2 = Top_pila de operandos sacar de pila
Op1 = Top_pila operandos utilizar y no sacar de la pila
Oper = =
Res = Rn + 1 e insertar en pila_operandos.
Hacer un SF con Top_pila_operandos y dejar direccin pendiente por rellenar
e insertar la direccin del SF en la pila de saltos.

Generar cudruplos de resultantes.


Hacer un salto incondicional y dejar la direccin pendiente por rellenar e
insertar la direccin del SI en la pila_saltos.
Rellenar(top 1 pila_saltos, cont + 1) y Rellenar (top 1 ,cont).

Generar cudruplos.

6.

Rellenar (top_pila_saltos, cont + 1)

Sacar lo que est en la pila de operandos.

Ejemplo:

Case A of
1: read(B);
2: A:=A+B
Else
write(A);

oper

op1

op2

Res

R1

SF

R1

Read

SI

SF

R2

R2
10

A
R3
B
A
A
R2
2
X

9
Write

R3

:=

NULO

R3

R1

SI

11

read

Pila
operandos

Pila
operadores

10

Write

+
:=

4
2
Pila saltos

Estatuto WHILE

<WHILE>

while

do

<E>

<OP1>
OP1

enddo

id

OP1
2

>

cte

<

<S>

*
/

1
id

<OP2>

2
:=

4
OP2

Acciones.

1, 2, 3, 4. Igual
5.

PUSH pila_saltos(el siguiente cudruplo a analizar) = cont + 1

6.

Generar cudruplo e insertar Rn en la pila.

7.

Generar un salto en falso con tope de pila de operandos dejar la direccin


pendiente por rellenar e insertar la direccin en la pila de saltos.

8.

Generar un salto incondicional con lo que est en el (top-1 pila_saltos) y


rellenar (pila_saltos, cont+1)

Ejemplo:

While X<5 do
X:=Y+Z
Enddo
x:=0

oper

op1

op2

Res

R2

<

R1

SF

R1

R2

:=

R2

SI

:=

X
1

2
1

R1
5
X

Pila de
saltos

Pila de
operandos

+
:=
<

Pila de
operadores

Para incluir los tipos de las variables en la tabla de smbolos podemos efectuar las
siguientes acciones.
1

<V>
id

TIPO

Acciones.

PUSH pila_operandos (direccin de la variable).

Poner el tipo a todas las variables que se metieron en la pila de operandos


y sacarlas de la pila.
1,3

Real

1,2

Real

1,1

entero

Id1 = 1, 1
Id2 = 1, 2

entero

real

real

Id3 = 1, 3

Reglas semnticas.
Utilizaremos como referencia las reglas semnticas de las expresiones en Pascal,
para esto construiremos una tabla donde:

E = entero

R = real

C = caracter

S = string

B = booleano

x = error semntico

Op1

Op2

*, +, -

div
mod

relac

and
or

En esta tabla se omitieron un conjunto de combinaciones que con cualquier operacin


produce error, como por ejemplo ENTERO con STRING.

Ya que un traductor es un autmata (con funcionamiento automtico), es conveniente


que el anlisis semntico tambin se automatice. Las claves para automatizar el
anlisis semntico son:
Utilizar acciones para verificacin semntica.
Escoger una estructura de datos que permita accesarla directamente, encontrar el
resultado de una operacin y descubrir si sta es o no vlida.

De hecho estas claves estn vigentes para todo el proceso de traduccin, en cuanto
a utilizar acciones y estructuras de datos automticas.

Para el anlisis semntico no se recomienda usar la tabla mostrada anteriormente,


debido a que su acceso no es automtico y le faltan muchas combinaciones.

Acciones para verificacin semntica.

Para mostrar un ejemplo de cmo disear las acciones de verificacin semntica,


utilizaremos un subconjunto de expresiones aritmticas. Estas acciones se debern
de aadir a las acciones de generacin de cdigo, y no modificar nada de lo ya visto
en generacin de cdigo.

Para realizar la verificacin semntica se requerir de una pila de tipos.


4

<E>

<T>

3
1
<T>
id

Acciones.
1.

PUSH pila_tipos (tipo de la variable).

2,3.

No llevan accin semntica.

)
7

4.

Si tipos del TOP y TOP 1 de la pila de tipos son permitidos en la operacin


a generar ENTONCES:
POP pila_tipos; POP pila_tipos
PUSH pila_tipos (resultado de la operacin)
SI NO
Marcar error semntico, y aplicar accin correctiva que podra ser:
POP pila_tipos; POP pila_tipos
PUSH pila_tipos (posible resultado de la operacin)

5.

Igual a 4

6.

No llevan accin semntica.

You might also like