Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidad 2. Semntico.
2.1 Forma interna del programa fuente.
Notacin polaca.
Cudruplos.
Expresiones aritmticas.
Estatutos condicionales.
Expresiones aritmticas.
Expresiones condicionales.
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
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.
<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>
<S> b <S>
<X> c
<S>
a
<S>
<S>
aabc
Recursiva central.
<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
| Y | >= 0
<Y> x <opA> y
<opA> =
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>
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........
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
<PARAM>
var
(
id
X
;
Y
TIPO
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.
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.
2.
Desventajas.
1.
Un mantenimiento no sencillo.
Restricciones.
1.
2.
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
PILA
ENTRADA
SALIDA
$<E>
Id+id$
1) <E> <T><E>
$<E><T>
Id+id$
$<E><T><F>
Id+id$
7) <F> id
$<E><T> id
Id + id $
6) <T>
$<E>
2) <E> + <T><E>
$<E><T>+
+ id $
$<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)
b)
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)
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>) } = { *, +, $, ) }
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.
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
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
LR- Simple
LR- Cannico
LALR
Ventajas.
1.
2.
Desventajas.
1.
Mtodo LR-Simple.
Entrada
0
$
Programa
Analizador
LR
SALIDA
PILA
TABLA
DE
ACCIONES
TABLA
DE SALTOS
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)
d)
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
Siguientes.
S(<E>) = { $ }
S(<E>) = {S(<E>), +, ) } = { $,+, ) }
S(<T>) = {S(<E>), *} = { $,+, ), * }
S(<F>) = { $,+, ), * }
0
<E> .<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>
<T>
<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>)
<F> (<E>.)
<E> <E> .+ <T>
10
<F> .id
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
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
2)
BA
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
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
sacar
sacar
Notacin polaca.
Cdigo P.
Triplos.
Cudruplos.
Cudruplos.
Triplos y cdigo P.
Notacin polaca.
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
sacar
sacar
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
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
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
A
Pila_op
Pila_oper
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.
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
R1
R1
R2
:=
R2
4.
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.
<X>
if
then
<E>
<OP1>
OP1
else
<
OP1
*
cte
>
<S>
1
id
2
:=
4
OP2
10
endif
<OP2>
id
Acciones.
Generar cudruplo
Op2 = tope pila_operandos sacar
Op1 = tope pila_operandos sacar
Oper = tope pila_operadores sacar
Res = result = Rn + 1
9.
10.
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.
= Rn + 1 e insertar en pila_op
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 el id en pila_operandos
Generar cudruplos.
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.
Generar cudruplos.
6.
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.
6.
7.
8.
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.
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
De hecho estas claves estn vigentes para todo el proceso de traduccin, en cuanto
a utilizar acciones y estructuras de datos automticas.
<E>
<T>
3
1
<T>
id
Acciones.
1.
2,3.
)
7
4.
5.
Igual a 4
6.