22.11.2014 Views

Procesadores de Lenguaje Tema 4: Analizador sintáctico ...

Procesadores de Lenguaje Tema 4: Analizador sintáctico ...

Procesadores de Lenguaje Tema 4: Analizador sintáctico ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!