Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Analisis Sintactico
Analisis Sintactico
<programa> ...
?
num ptpt num num ptpt num
parea parea
parea
num ptpt num ... ... num ptpt num ... .... num ptpt num ... ...
parea( ^ ); simple
?
^ simple ^ simple
?
parea
?
array [ simple ] of tipo array [ simple ] of tipo
?
array [num ptpt num] of char array [ num ptpt num ] of char array [ num ptpt num ] of char
tipo tipo
array [ num ptpt num ] of char array [ num ptpt num ] of char
Eleccin de regla a aplicar:
tipo simple | ^ simple | array [ simple ] of tipo
simple integer | char | num ptpt num
tipo:
regla 1: preanalisis in [integer, char, num]
regla 2: preanalisis = ^
regla 3: preanalisis = array
simple:
regla 4: preanalisis = integer
regla 5: preanalisis = char
regla 6: preanalisis = num
const INTEGER = 257; CHAR = 258; ...
var preanalisis: TCompLex;
function StgteCompLex(): TCompLex;
procedure parea(...)...;
procedure simple;
begin
if preanalisis = INTEGER then
parea (INTEGER)
else if preanalisis = CHAR then
parea (CHAR)
else if preanalisis = NUM then
begin parea(NUM); parea(PTPT); parea(NUM); end
else
error
end;
procedure tipo;
begin
if preanalisis in [INTEGER, CHAR, NUM] then simple
else if preanalisis = ^ then
begin parea(^); simple end
else if preanalisis = ARRAY then
begin
parea(ARRAY); parea([); simple;
parea (OF); tipo
end
else error
end;
begin
preanalisis := SgteCompLex(); tipo;
end.
Anlisis Sintctico Predictivo
no Recursivo
Utilizan una pila en lugar de llamadas
recursivas
Guiado por una tabla
Las tablas se construyen directamente
slo para ciertos tipos de gramticas
ENTRADA a + b $
Tabla de anlisis
Sintctico M
Inicialmente:
Buffer: cadena de entrada finalizada con
el smbolo $
Pila: smbolo $ y en la cima el smbolo
inicial de la gramtica
Tabla M: Si A es un no terminal y a un
terminal, M[A,a] contiene una regla de
produccin de la gramtica
X: Cima de la pila
A: smbolo de la entrada (preanalisis)
Anlisis Sintctico Predictivo no recursivo
Si X terminal
Si X <> a
Llamar a la rutina de recuperacin de error
Si X = a
Si X = a = $
Fin con xito
Si X = a <> $
Sacar X de la pila
Obtener siguiente smbolo de la entrada
Si X no terminal
Si M [X, a] contiene una regla
Sacar X de la pila
Meter en la pila la parte derecha de la regla en orden inverso
Si M [X, a] no contiene una regla
Llamar a la rutina de recuperacin de error
Smbolo de entrada
No terminal
id + * ( ) $
E E TE E TE
E E +TE E E
T T FT T FT
T T T *FT T T
F F id F (E)
PRIMEROS SIGUIENTES
E E T T F + * ( ) id E E T T F
( + ( * ( + * ( ) id $ $ $ $ $
id id id ) ) + + +
) ) *
)
ALGORITMO DE CONSTRUCCIN DE TASP
Entrada: Una gramtica G
Salida: La tabla de anlisis sintctico M
Para cada regla X de G
1. Para terminal t de PRIMERO ()
Aadir X a M[X, t]
2. Si PRIMERO ()
Aadir X a M[X, b], b SIGUIENTE (x)
Si PRIMERO () y $ SIGUIENTE (X)
Aadir X a M[X, $]
3. Poner error en todas las entradas no definidas
de M
regla E TE PRIMERO (TE) = PRIMERO (T) = {(, id}
M [ E, ( ] = E TE
M [ E, id ] = E TE
regla E +TE PRIMERO (+TE) = PRIMERO (+) = { + }
M [ E, + ] = E +TE
regla E SIGUIENTE (E) = { ), $ }
M [ E, ) ] = E
M [ E, $ ] = E
regla T FT PRIMERO (FT) = PRIMERO (F) = {(, id}
M [ T, ( ] = T FT
M [ T, id ] = T FT
regla T *FT PRIMERO (*FT) = PRIMERO (*) = { * }
M [ T, * ] = T *FT
regla T SIGUIENTE (T) = { ), +, $ }
M [ T, ) ] = T
M [ T, + ] = T
M [ T, $ ] = T
regla F (E) PRIMERO ((E)) = PRIMERO (() = { ( }
M [ F, ( ] = F (E)
regla F id PRIMERO (id) = { id }
M [ F, id ] = F id
Smbolo de entrada
No
terminal
id + * ( ) $
a1 ... ai ... an $
Sm
Xm Programa para anlisis SALIDA
sintctico LR
S m-1
X m-1
...
S0
accin ir_a
ALGORITMO DE ANLISIS SINTCTICO LR
Entrada
Cadena de entrada w
Tabla de AS LR con las funciones accin e ir_a para
la gramtica G
Salida
Si w est en L(G) una derivacin ascendente
Si no indicacin de error
Mtodo
Inicialmente:
La pila contiene S0 (estado inicial)
El buffer de entrada contiene w$ (la cadena de entrada
seguida de la marca de fin de cadena)
Ejecucin del programa de anlisis hasta encontrar
una accin de aceptacin o de error
PROGRAMA DE ANLISIS
apuntar ae al primer smbolo de w$
repetir
sea S el estado en la cima de la pila y
a el smbolo apuntado por ae
si accion [S,a]= desplazar S entonces
meter a y despus S en la cima de la pila
avanzar ae al siguiente smbolo de entrada
si_no
si accin [S, a] = reducir A entonces
sacar 2 * || smbolos de la pila
sea S el estado que hay ahora en la cima de la pila
meter en la cima de la pila A y despus ir_a [S, A]
emitir la produccin A
si_no
si accin [S, a] = aceptar entonces
fin con xito
si_no error
fin_repetir
EJEMPLO
Gramtica
Cdigos de las acciones
(1) E E + T 1. di significa desplazar y
(2) E T meter en la pila el estado i