Escolar Documentos
Profissional Documentos
Cultura Documentos
ANLISIS SINTCTICO
Funcin
Entrada: sucesin de componentes lxicos
<clex, vlex>
Salida: la entrada es o no correcta
sintcticamente
Adems:
si la entrada es correcta, rbol de derivacin
si no indicacin de errores
<cabecera>
...
<bloque>
<cabecera>
...
....
program
id
...
program
id
begin ...
ERRORES: TIPOS
Lxicos
(a!b, begon)
Sintcticos
(X := a *(b-(c+d);;)
Semnticos
(3 div sqrt(2))
Lgicos
(bucle infinito)
Consideraciones
La mayora de los errores son simples
La mayora son o se manifiesten en la fase de
anlisis sintctico
La deteccin de errores lgicos es muy difcil o
imposible
A veces el error est mucho antes de que se
pueda detectar
No retrasar significativamente la
traduccin de programas correctos
Mecanismos sencillos de recuperacin
ERRORES: ESTRATEGIAS
En modo pnico: descartar smbolos de
entrada (hasta que alguno permita la
recuperacin: elementos de sincronizacin)
A nivel de frase: correccin local segn el error
concreto (borrar, sustituir, insertar: peligro de
bucle infinito)
De producciones de error: prever errores
(frecuentes o probables) ampliando la gramtica
con reglas especficas de error
De correccin global: hallar el programa
correcto ms cercano al de entrada: costoso y
no necesariamente se encuentra el deseado
simple
tipo
simple
tipo
simple
simple
simple
integer
char
simple
| ^ simple
| array [simple] of tipo
integer
| char
| num ptpt num
tipo
array [
simple ]
simple
num
ptpt
num
of
tipo
simple
simple
?
num
ptpt
num
num
parea
ptpt
num
parea
parea
parea( ^ ); simple
tipo
tipo
tipo
?
^
simple
simple
?
parea
^ char
^ char
^ char
tipo
tipo
?
array
[ simple ]
of
tipo
array
[ simple ]
of
tipo
?
array [num ptpt num] of char
tipo
array
[ simple ]
tipo
of
tipo
array
[ simple ]
of
tipo
?
array [ num ptpt num ] of char
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.
ENTRADA
PILA
Programa para
anlisis sintctico
predictivo
$
Tabla de anlisis
Sintctico M
SALIDA
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)
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
Smbolo de entrada
No terminal
E
E
T
T
F
id
E TE
E TE
E +TE
T FT
T FT
T
T *FT
F id
F (E)
PILA
Gramtica:
E TE
E +TE |
T FT
T *FT |
F (E) | id
$E
$ET
$ETF
$ETid
$ET
$E
$ET+
$ET
$ETF
$ETid
$ET
$ETF*
$ETF
$ETid
$ET
$E
$
ENTRADA
id + id * id $
id + id * id $
id + id * id $
id + id * id $
+ id * id $
+ id * id $
+ id * id $
id * id $
id * id $
id * id $
* id $
* id $
id $
id $
$
$
$
SALIDA
E TE
T FT
F id
T
E +TE
T FT
F id
T *FT
F id
T
E
Gramtica:
E TE
T *FT |
E +TE | F (E) | id
T FT
SIGUIENTES
PRIMEROS
E E T T F + *
( + ( * ( + *
id id id
(
(
) id
) id
E E T T
$ $ $ $
) ) + +
) )
F
$
+
*
)
Smbolo de entrada
No
terminal
id
E TE
error
error
error
E +TE
error
error
T FT
error
error
T FT
error
T *FT
F id
T
error
error
(
E TE
error
error
error
error
error
F (E)
error
error
GRAMTICAS LL(1)
Si una gramtica es recursiva por la izquierda o
ambigua la TASP tendr al menos una entrada
con definicin mltiple. Recurso: Transformar la
gramtica
Una gramtica cuya TASP no tiene entradas con
definiciones mltiples se define como LL(1)
Ninguna gramtica ambigua o recursiva por la
izquierda puede ser LL(1)
G es LL(1), si y solo si, cuando A | siendo dos
reglas distintas de G se cumple:
PRIMERO () PRIMERO () =
Solo puede derivarse de o de
Si deriva , no deriva ninguna cadena que
comience con un terminal de SIGUIENTE (A)
ANLISIS ASCENDENTE
Estilo general: Anlisis sintctico por
desplazamiento y reduccin
Por precedencia de operadores (gramticas muy
especficas)
LR (generadores automticos de AS)
ASIDEROS O MANGOS
Un asidero de una cadena es una subcadena
que concuerda con el lado derecho de una
produccin y cuya reduccin al no terminal del
lado izquierdo de la regla es un paso de una
derivacin por la derecha
Ejemplo
S aABe
A Abc
Ab
Bd
abbcde
a Ab c d e
a Ad e
a AB e
ASIDEROS O MANGOS
La produccin situada ms a la izquierda de
que concuerda con el lado derecho de una
produccin A no es un asidero si la
reduccin por esa regla genera una cadena no
reducible al smbolo inicial
Ejemplo
S aABe
A Abc
Ab
Bd
a Ab c d e
a A A c d e No se puede reducir a S
ASIDEROS O MANGOS
Formalmente, un asidero de una forma de frase derecha
es una regla A y una posicin de donde la
cadena podra encontrarse y sustituirse por A para
producir la forma de frase derecha previa en una
derivacin por la derecha de
Ejemplo
EE+E
EE*E
E(E)
E id
Formas de Frase
Derecha
Asidero
Regla de
Reduccin
id1
E id
E + id2 * id3
id2
E id
E + E * id3
id3
E id
E+E*E
E*E
EE*E
E+E
E+E
EE+E
FUNCIONAMIENTO DEL
ANALIZADOR
Inicialmente:
pila
$
entrada
accin
$ id1
$E
$E+
$ E + id2
$E+E
* id3 $ desplazar
$E+E*
id3 $ desplazar
$ E + E * id3
$ reducir por E id
$E+E*E
$ reducir por E E * E
$E+E
$ reducir por E E + E
$E
$ aceptar
PREFIJOS VIABLES
Este mtodo de anlisis garantiza que el asidero
siempre aparecer en la cima de la pila, nunca
dentro
Los prefijos de las formas de frase derecha que
pueden aparecer en la pila se denominan
prefijos viables
Un prefijo viable es un prefijo de una forma de
frase derecha que no continua ms all del
extremo derecho del asidero situado ms a la
derecha de esta forma de frase
CONFLICTOS
Existen gramticas independientes de contexto
para las que no se pueden utilizar analizadores
sintcticos por desplazamiento y reduccin
(gramticas no LR)
En esas gramticas se puede llegar a una
configuracin en la que, conociendo el
contenido de la pila y el siguiente smbolo de
entrada, no se puede decidir si
Desplazar o reducir (conflicto de
desplazamiento/reduccin)
Que tipo de reduccin efectuar (conflicto de
reduccin/reduccin)
ANALIZADORES SINTCTICOS LR
Se pueden construir AS LR para casi todos los
lenguajes que se pueden describir con GLC
Es el mtodo de anlisis por desplazamiento y
reduccin sin retroceso ms general pero
eficiente
La clase de gramticas aplicables es un
supraconjunto de las que se pueden analizar con
ASP
Detectan los errores sintcticos tan pronto como
sea posible en un examen de izquierda a
derecha
Inconveniente: costosos de construir a mano
...
ai
...
an
Sm
Xm
S m-1
X m-1
...
S0
accin
ir_a
SALIDA
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)
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
(1) E E + T
(2) E T
(3) T T * F
(4) T F
(5) F (E)
(6) F id
id
d5
ir_a
)
d4
d6
r2
d7
r2
r2
r4
r4
r4
r4
d4
r6
acep
d5
r6
r6
d5
d4
d5
d4
r6
10
d6
d11
r1
d7
r1
r1
10
r3
r3
r3
r3
11
r5
r5
r5
r5
ENTRADA
ACCION
id * id + id $ desplazar
(2) 0 id 5
* id + id $ reducir por F id
(3) 0 F 3
* id + id $ reducir por T F
(4) 0 T 2
* id + id $ desplazar
(5) 0 T 2 * 7
id + id $ desplazar
(6) 0 T 2 * 7 id 5
+ id $ reducir por F id
(7) 0 T 2 * 7 F 10
+ id $ reducir por T T * F
(8) 0 T 2
+ id $ reducir por E T
(9) 0 E 1
+ id $ desplazar
(10) 0 E 1 + 6
id $ desplazar
(11) 0 E 1 + 6 id 5
$ reducir por F id
(12) 0 E 1 + 6 F 3
$ reducir por T F
(13) 0 E 1 + 6 T 9
$ reducir por E E + T
(14) 0 E 1
$ aceptar