Procesadores de Lenguaje Tema 4: Analizador sintáctico ...
Procesadores de Lenguaje Tema 4: Analizador sintáctico ...
Procesadores de Lenguaje Tema 4: Analizador sintáctico ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Procesadores</strong> <strong>de</strong> <strong>Lenguaje</strong><br />
<strong>Tema</strong> 4: <strong>Analizador</strong> <strong>sintáctico</strong><br />
3 er curso<br />
2º cuatrimestre<br />
Alfonso Ortega: alfonso@ii.uam.es<br />
<strong>Analizador</strong> <strong>sintáctico</strong><br />
Conceptos<br />
• Se ocupa específicamente <strong>de</strong>l tratamiento <strong>de</strong> la parte <strong>de</strong>l lenguaje <strong>de</strong> programación<br />
que es in<strong>de</strong>pendiente <strong>de</strong>l contexto<br />
• Recuer<strong>de</strong> el alumno la <strong>de</strong>finición que vio en TALF <strong>de</strong> gramáticas in<strong>de</strong>pendientes <strong>de</strong>l<br />
contexto<br />
• < Σ T<br />
, Σ N<br />
, axioma, reglas ><br />
• Don<strong>de</strong><br />
• axioma ∈ Σ N<br />
• reglas ∈ ℘(Σ N<br />
×Σ * ),, Σ * = Σ T<br />
∪Σ N<br />
• Es <strong>de</strong>cir, las reglas <strong>de</strong> producción tienen la forma<br />
A→v,,A ∈ Σ N<br />
∧ v ∈ (Σ T<br />
∪Σ N<br />
) *<br />
• También recibe el nombre <strong>de</strong> “parser”<br />
• Suele ser el que gobierna todo el proceso <strong>de</strong> análisis.<br />
• El proceso <strong>de</strong> análisis pue<strong>de</strong> enten<strong>de</strong>rse como el mecanismo para obtener el “árbol<br />
<strong>sintáctico</strong> <strong>de</strong> <strong>de</strong>rivación <strong>de</strong>l programa (en caso <strong>de</strong> ser correcto) que es una manera<br />
<strong>de</strong> po<strong>de</strong>r reducir el programa completo al axioma <strong>de</strong> la gramática.<br />
• Recuér<strong>de</strong>se que, tras el paso <strong>de</strong> análisis morfológico, los símbolos terminales para<br />
este paso son las unida<strong>de</strong>s sintácticas reconocidas por el analizador morfológico<br />
<strong>Analizador</strong> <strong>sintáctico</strong><br />
Conceptos: clases <strong>de</strong> estrategias <strong>de</strong> análisis <strong>sintáctico</strong><br />
• Las diferentes técnicas para resolver el problema se pue<strong>de</strong>n agrupar <strong>de</strong> la siguiente<br />
forma:<br />
• Primer enfoque<br />
• A partir <strong>de</strong>l axioma <strong>de</strong> la gramática y el programa (transformado en secuencia<br />
<strong>de</strong> “tokens” por el analizador morfológico):<br />
• Probar con las distintas opciones <strong>de</strong> <strong>de</strong>rivación para cada no terminal que<br />
encontremos<br />
• Ir avanzando simultáneamente en el programa y en las hojas <strong>de</strong>l árbol <strong>de</strong><br />
<strong>de</strong>rivación que estamos construyendo, cuando haya coinci<strong>de</strong>ncia entre el<br />
terminal actual en el programa y el terminal <strong>de</strong> la hoja actual <strong>de</strong>l árbol.<br />
• Hasta que<br />
• O bien se recorra por completo la ca<strong>de</strong>na y coincida con las hojas <strong>de</strong>l árbol<br />
y, por tanto, el programa es sintácticamente correcto<br />
• O bien se intentan todas las opciones posibles para cada no terminal<br />
(incluido el axioma) y no se pue<strong>de</strong> completar el análisis por lo que el<br />
programa es sintácticamente incorrecto.<br />
3<br />
4
<strong>Analizador</strong> <strong>sintáctico</strong><br />
Conceptos: clases <strong>de</strong> estrategias <strong>de</strong> análisis <strong>sintáctico</strong><br />
• Segundo enfoque:<br />
• A partir <strong>de</strong> la ca<strong>de</strong>na <strong>de</strong> “tokens” <strong>de</strong>vueltos por el analizador morfológico, se<br />
comienza a leer intentando i<strong>de</strong>ntificar las partes <strong>de</strong>rechas <strong>de</strong> las reglas <strong>de</strong> la<br />
gramática.<br />
• Cuando esto ocurre se sustituye la ca<strong>de</strong>na <strong>de</strong> “tokens” por el no terminal <strong>de</strong> la<br />
parte izquierda <strong>de</strong> la regla y se continúa el mismo análisis teniendo en cuenta<br />
esta sustitución<br />
• Si en algún momento ninguna secuencia <strong>de</strong> la ca<strong>de</strong>na se correspon<strong>de</strong> con la<br />
parte <strong>de</strong>recha <strong>de</strong> ninguna regla tal vez se tenga que <strong>de</strong>shacer alguna elección<br />
para probar si con otra <strong>de</strong>cisión se consigue terminar el análisis<br />
• Cuando se han probado sistemáticamente todas las opciones sin po<strong>de</strong>r terminar<br />
el análisis se concluye que el programa es sintácticamente incorrecto.<br />
• La otra forma <strong>de</strong> terminar el análisis es cuando se consigue obtener por el<br />
mecanismo <strong>de</strong>scrito el axioma <strong>de</strong> la gramática.<br />
• En este último caso se concluye que el programa es sintácticamente correcto.<br />
<strong>Analizador</strong> <strong>sintáctico</strong><br />
Conceptos: clases <strong>de</strong> estrategias <strong>de</strong> análisis <strong>sintáctico</strong><br />
• Al primer enfoque, por la manera y el or<strong>de</strong>n en que proce<strong>de</strong> se le conoce también<br />
como análisis <strong>de</strong>scen<strong>de</strong>nte o “top down”.<br />
• Por la misma razón al segundo enfoque se le conoce también como análisis<br />
ascen<strong>de</strong>nte o “bottom up”.<br />
5<br />
6<br />
Análisis <strong>sintáctico</strong> <strong>de</strong>scen<strong>de</strong>nte<br />
Introducción<br />
• El alumno pue<strong>de</strong> imaginar alguna solución a este problema con las herramientas que<br />
ha adquirido en otras materias <strong>de</strong> la carrera.<br />
• Se está ante una situación en la que se <strong>de</strong>be encontrar una <strong>de</strong>rivación (secuencia <strong>de</strong><br />
aplicación <strong>de</strong> reglas <strong>de</strong> la gramática en lugares concretos) que lleve <strong>de</strong>s<strong>de</strong> el no<br />
terminal inicial (el axioma) hasta la situación final (el programa proporcionado como<br />
entrada)<br />
• A<strong>de</strong>más, el número <strong>de</strong> posibles <strong>de</strong>rivaciones es muy gran<strong>de</strong> (potencialmente infinito)<br />
• Esta situación pue<strong>de</strong> a los problemas <strong>de</strong> búsqueda <strong>de</strong> un camino que llevara <strong>de</strong> una<br />
situación inicial a otra final atravesando un espacio enorme <strong>de</strong> posibles situaciones.<br />
• Ya se ha estudiado en asignaturas como IA la existencia <strong>de</strong> estrategias generales<br />
(para cualquier problema) <strong>de</strong> búsqueda ciega y sus propieda<strong>de</strong>s <strong>de</strong> las que se<br />
mencionan algunas:<br />
• Las dos estrategias básicas son en anchura y en profundidad<br />
• En anchura siempre se pue<strong>de</strong> conseguir encontrar la solución óptima (aquella<br />
para la que se requiere un menor número <strong>de</strong> pasos)<br />
• En profundidad, excepto árboles infinitos, se suele tener oportunidad <strong>de</strong><br />
encontrar alguna solución con menos esfuerzo<br />
Análisis <strong>sintáctico</strong> <strong>de</strong>scen<strong>de</strong>nte<br />
“Top-down” con vuelta atrás lenta: conceptos<br />
• Podríamos consi<strong>de</strong>rar el análisis <strong>sintáctico</strong> top-down con vuelta atrás lenta como un<br />
caso particular <strong>de</strong> búsqueda ciega en profundidad (se <strong>de</strong>sempate <strong>de</strong> izquierda a<br />
<strong>de</strong>recha)<br />
• El criterio para <strong>de</strong>cidir si una regla es aplicable en una posición es la coinci<strong>de</strong>ncia <strong>de</strong><br />
esa posición con el no terminal que está en la parte izquierda <strong>de</strong> la regla.<br />
• No podremos continuar por un camino cuando tengamos terminales que discrepen<br />
con el programa (po<strong>de</strong>mos suponer el or<strong>de</strong>n <strong>de</strong> recorrido natural <strong>de</strong>l programa (<strong>de</strong><br />
izquierda a <strong>de</strong>recha)<br />
• Habremos terminado el proceso en dos situaciones:<br />
• Si el árbol <strong>de</strong> <strong>de</strong>rivación “se cierra” porque se ha llegado a eliminar todos los no<br />
terminales y se obtiene la misma secuencia <strong>de</strong> terminales <strong>de</strong>l programa. En este<br />
caso se ha construido un árbol <strong>sintáctico</strong> para el programa que resulta ser<br />
correcto<br />
• Si no se ha podido “cerrar” el árbol <strong>de</strong> <strong>de</strong>rivación pero se ha probado todas las<br />
reglas en cada posición y no se pue<strong>de</strong> aplicar ninguna otra opción. En ese caso<br />
se ha <strong>de</strong>mostrado que el programa es sintácticamente incorrecto.<br />
• Describiremos esta técnica mediante los siguientes ejemplos<br />
7<br />
8
Análisis “top-down”, vuelta atrás lenta<br />
Ejemplos previos<br />
• Análisis <strong>sintáctico</strong> <strong>de</strong> la palabra aaabbb<br />
Análisis “top-down”, vuelta atrás lenta<br />
Ejemplos previos<br />
G=<br />
S<br />
aaabbb<br />
G=<br />
a<br />
a<br />
S<br />
S<br />
S<br />
b<br />
b<br />
aaabbb<br />
a<br />
b<br />
ACEPTADA<br />
9<br />
21<br />
Análisis “top-down”, vuelta atrás lenta<br />
Análisis “top-down”, vuelta atrás lenta<br />
Ejemplos previos<br />
• Análisis <strong>sintáctico</strong> <strong>de</strong> la palabra abbb<br />
Ejemplos previos<br />
G=<br />
S<br />
abbb<br />
G=<br />
a<br />
S<br />
b<br />
a<br />
S<br />
S<br />
b<br />
S<br />
a b<br />
abbb<br />
RECHAZADA<br />
22<br />
31
• Análisis <strong>de</strong> la palabra i+--i<br />
Análisis “top-down”, vuelta atrás lenta<br />
Ejemplos previos<br />
Análisis “top-down”, vuelta atrás lenta<br />
Ejemplos previos<br />
G=<br />
E<br />
i+--i<br />
G=<br />
E<br />
- E<br />
E<br />
E +<br />
i -<br />
E<br />
E E<br />
i - E<br />
E<br />
i+--i<br />
- E E<br />
i<br />
- E<br />
ACEPTADA<br />
32<br />
48<br />
Análisis “top-down”, vuelta atrás lenta<br />
Ejemplos previos<br />
• Consi<strong>de</strong>rar el análisis para i++i<br />
G=<br />
E<br />
i+--i<br />
Análisis “top-down”, vuelta atrás lenta<br />
Conclusiones<br />
• Como el alumno habrá observado, la presencia en la gramática <strong>de</strong> reglas recursivas<br />
por la izquierda hace que este tipo <strong>de</strong> análisis encuentre bucles infinitos <strong>de</strong> los que<br />
no pue<strong>de</strong> salir.<br />
• En las siguientes transparencias se sacará provecho <strong>de</strong> este <strong>de</strong>scubrimiento y se<br />
presentará otras propieda<strong>de</strong>s <strong>de</strong> las gramáticas interesantes para la construcción <strong>de</strong><br />
analizadores <strong>sintáctico</strong>s <strong>de</strong>scen<strong>de</strong>ntes eficientes.<br />
49<br />
50
Propieda<strong>de</strong>s <strong>de</strong> las gramáticas para los analizadores <strong>de</strong>scen<strong>de</strong>ntes<br />
Propieda<strong>de</strong>s<br />
• Uno <strong>de</strong> los objetivos <strong>de</strong> este tema es <strong>de</strong>mostrar que se pue<strong>de</strong> construir fácilmente<br />
analizadores <strong>de</strong> tipo LL(1) (la entrada se lee <strong>de</strong>s<strong>de</strong> la izquierda – left – las<br />
<strong>de</strong>rivaciones en el árbol se hacen <strong>de</strong> izquierda – left – a <strong>de</strong>recha y se necesita<br />
conocer sólo 1 símbolo <strong>de</strong> la entrada por anticipado) si la gramática se pue<strong>de</strong><br />
expresar en forma a<strong>de</strong>cuada<br />
• Propieda<strong>de</strong>s necesarias para expresar la gramática <strong>de</strong> esa forma<br />
• Eliminar recursividad por la izquierda (por su relación suele consi<strong>de</strong>rarse un<br />
paso auxiliar para la cuarta propiedad)<br />
• Eliminar símbolos inaccesibles (por su relación suele consi<strong>de</strong>rarse un paso<br />
auxiliar para la cuarta propiedad)<br />
• Eliminar reglas <strong>de</strong>l tipo A→λ<br />
• Expresión <strong>de</strong> la gramática en forma normal <strong>de</strong> Greibach<br />
• Factorización por la izquierda (que es una condición necesaria para LL(1))<br />
G=<br />
E<br />
E<br />
+<br />
i -<br />
E<br />
Forma normal <strong>de</strong> Greibach<br />
Eliminación <strong>de</strong> recursividad a izquierdas: ejemplo previo<br />
• Analícese el siguiente ejemplo<br />
E<br />
- E<br />
i+--i<br />
E<br />
i E’<br />
+ E E’<br />
- E E’<br />
- E E’<br />
i E’<br />
G=<br />
i<br />
λ<br />
51<br />
52<br />
Forma normal <strong>de</strong> Greibach<br />
Eliminación <strong>de</strong> recursividad a izquierdas: conclusiones previas<br />
• Del ejemplo anterior no parece po<strong>de</strong>r <strong>de</strong>ducirse i<strong>de</strong>a intuitiva alguna<br />
• Sin embargo la técnica se pue<strong>de</strong> generalizar<br />
Forma normal <strong>de</strong> Greibach<br />
Lema: eliminación <strong>de</strong> recursividad a izquierdas<br />
Toda gramática in<strong>de</strong>pendiente <strong>de</strong>l contexto pue<strong>de</strong> reducirse a otra equivalente sin<br />
reglas recursivas a izquierdas<br />
• Una regla recursiva a izquierdas tiene el siguiente aspecto<br />
A→Ax,,A ∈ Σ N<br />
∧ x ∈ (Σ T<br />
∪Σ N<br />
) *<br />
• El lema se <strong>de</strong>muestra <strong>de</strong> forma constructiva realizando para cada regla recursiva el<br />
siguiente tratamiento:<br />
• Sea < Σ T<br />
, Σ N<br />
, S, P> una gramática que tiene reglas recursivas <strong>de</strong> la siguiente<br />
forma:<br />
• A→Aα 1<br />
|...|Aα n<br />
|β 1<br />
|...|β m<br />
• Don<strong>de</strong> {β i<br />
} n i=1 representa todas las partes <strong>de</strong>rechas no recursivas<br />
• Se sustituye el subconjunto anterior <strong>de</strong> reglas por<br />
• A→β 1<br />
X|...|β m<br />
X<br />
• X→α 1<br />
X|...|α n<br />
X|λ<br />
53<br />
54
Forma normal <strong>de</strong> Greibach<br />
Eliminación <strong>de</strong> recursividad a izquierdas: ejemplo 1<br />
G=<br />
A→Aα 1<br />
|...|Aα n<br />
|β 1<br />
|...|β m<br />
A→β 1<br />
X|...|β m<br />
X<br />
X→α 1<br />
X|...|α n<br />
X|λ<br />
G’=<br />
55