Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Analisis Sintactico
Analisis Sintactico
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
Uso de gramticas independientes de contexto Especificacin precisa y fcil de entender Construccin automtica de analizadores sintcticos Imparten una estructura al programa fuente, a la que se asigna el significado. Deteccin adecuada de errores Fcil mantenimiento: evolucin del lenguaje <programa> <cabecera> <bloque> <cabecera> program <identificador>; <cabecera> program <identificador> (<ids.archivos>); <bloque> <declaraciones y definiciones de entorno> <def. de subprogramas> <sent. secuencial>. <sent. secuencial> begin <sentencias> end ...
<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
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
tipo
simple
simple
array [
simple ]
of
tipo
simple
simple
simple
integer
char
num
ptpt
num
procedimiento tipo: segn que regla se aplique: ?: { <tipo> <simple> } simple ?: { <tipo> ^ <simple> } parea (^); simple ?: { <tipo> array [ <simple> ] of <tipo> } parea (array); parea ( [ ); simple; parea ( ] ); parea (of); tipo procedimiento simple: segn que regla se aplique: ?: { <simple> integer } parea (integer) ?: { <simple> char } parea (char) ?: { <simple> num ptpt num } parea (num); parea (ptpt); parea (num)
?
num ptpt num num
parea
ptpt
parea
num
parea
parea( ^ ); simple
tipo tipo tipo
?
^ simple ^ simple
?
parea
^ char
^ char
^ char
parea (array); parea ([); simple; parea (]); parea(of); tipo parea(^); simple
tipo tipo tipo
?
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
[ simple ]
of
tipo
array
[ simple ]
of
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.
ENTRADA
PILA
X Y Z $
Programa para
anlisis sintctico predictivo 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
No terminal E E T T F
( E TE
) E
$ E T
T FT T *FT F (E)
ENTRADA SALIDA
$E $ET $ETF $ETid $ET $E $ET+ $ET $ETF $ETid $ET $ETF* $ETF $ETid $ET $E $
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 $ $ $ $
E TE T FT F id T E +TE T FT F id T *FT F id T E
Gramtica: E TE E +TE | T FT
PRIMEROS
T *FT | F (E) | id
SIGUIENTES
E E T T F + * ( + ( * ( + * id id id
( (
) id ) id
E E T T $ $ $ $ ) ) + + ) )
F $ + * )
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
regla E +TE regla E regla T FT regla T *FT regla T
PRIMERO (TE) = PRIMERO (T) = {(, id} M [ E, ( ] = E TE M [ E, id ] = E TE PRIMERO (+TE) = PRIMERO (+) = { + } M [ E, + ] = E +TE SIGUIENTE (E) = { ), $ } M [ E, ) ] = E M [ E, $ ] = E PRIMERO (FT) = PRIMERO (F) = {(, id} M [ T, ( ] = T FT M [ T, id ] = T FT PRIMERO (*FT) = PRIMERO (*) = { * } M [ T, * ] = T *FT SIGUIENTE (T) = { ), +, $ } M [ T, ) ] = T M [ T, + ] = T M [ T, $ ] = T PRIMERO ((E)) = PRIMERO (() = { ( } M [ F, ( ] = F (E) PRIMERO (id) = { id } M [ F, id ] = F id
Smbolo de entrada No terminal id E E E TE error + error E +TE * error error ( E TE error ) error E $ error E
T
T F
T FT
error F id
error
T error
error
T *FT error
T FT
error F (E)
error
T error
error
T 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)
Se construye el rbol de AS para una cadena w a partir de las hojas y se avanza hacia la raz
Proceso: reducir w al smbolo inicial de la gramtica Cada reduccin sustituye una subcadena (asidero o mango) que concuerde con el lado derecho de un regla de produccin por el smbolo no terminal del lado izquierdo de esa regla
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 aAbcde aAde aABe S asidero posicin 2 (regla A b) asidero posicin 2 (regla A Abc) asidero posicin 3 (regla B d) asidero posicin 1 (regla S aABe)
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
aAbcde aunque b es la subcadena situada ms a la izquierda que concuerda con una parte derecha (regla A b) no es un asidero
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 id1 + id2 * id3 E + id2 * id3 E + E * id3 E+E*E E+E E Asidero id1 id2 id3 E*E E+E Regla de Reduccin E id E id E id EE*E EE+E
Repetir hasta que se detecte un error o en la pila solo haya el smbolo inicial (E$) y la entrada est vaca ($)
Desplazar cero o ms smbolos de la entrada a la pila hasta que en la cima haya un asidero Reducir al lado izquierdo de la regla adecuada
pila
entrada
accin
id1 + id2 * id3 $ + id2 * id3 $ + id2 * id3 $ id2 * id3 $ * id3 $ * id3 $ id3 $ $ $ $ $
desplazar reducir por E id desplazar desplazar reducir por E id desplazar desplazar reducir por E id reducir por E E * E reducir por 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
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)
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
id
d5
+
d6 r2 r4
(
d4
$
acep
E
1
T
2
F
3
d7 r4 d4
r2 r4 r6
r2 r4 8 r6 9 3 10 2 3
8
9 10 11
d6
r1 r3 r5 d7 r3 r5
d11
r1 r3 r5 r1 r3 r5
id * id + id $ desplazar
(2) 0 id 5
(3) 0 F 3 (4) 0 T 2 (5) 0 T 2 * 7
* id + id $ reducir por F id
* id + id $ reducir por T F * id + id $ desplazar id + id $ desplazar
(6) 0 T 2 * 7 id 5
(7) 0 T 2 * 7 F 10 (8) 0 T 2 (9) 0 E 1
+ id $ reducir por F id
+ id $ reducir por T T * F + id $ reducir por E T + id $ desplazar
(10) 0 E 1 + 6
(11) 0 E 1 + 6 id 5 (12) 0 E 1 + 6 F 3 (13) 0 E 1 + 6 T 9
id $ desplazar
$ reducir por F id $ reducir por T F $ reducir por E E + T
(14) 0 E 1
$ aceptar