Análisis Sintáctico Ascendente y Análisis Sintáctico Descendente(Jenny Imacaña F.)

7
Universidad Nacional de Loja Área de Energía, las Industrias y los Recursos Naturales, No Renovables Nombre: Jenny P. Imacaña F. Fecha: 14 de Diciembre del 2010 Módulo: IX “B” Docente: Ing. Edison L. Coronel Análisis Sintáctico Ascendente Análisis ascendente: se construye el árbol de análisis sintactico de la cadena de entrada desde las hojas hasta la raíz. En las hojas tenemos la cadena a analizar (los símbolos terminales) que se intentan reducir al axioma, que se encontrara en la raíz, si la cadena es correcta sintácticamente. Parte de la cadena de entrada para construir la inversa de una derivación por la derecha. Genera el árbol de de una derivación por la derecha. Genera el árbol de análisis sintáctico partiendo de las hojas hasta alcanzar análisis sintáctico partiendo de las hojas hasta alcanzar el axioma el axioma. R1. E := E + E R2. E := id r2 r2 r1 id + id id + id <- E + id <- E + E <- E ¿Cuándo puede reducirse por una parte izquierda lo que parece ser la parte derecha de una regla? Puede haber partes derechas comunes Puede haber partes derechas comunes Puede haber producciones Puede haber producciones ε ε Por desplazamiento y reducción La entrada se “reduce” al símbolo inicial Desplazando elementos de la entrada Llegar de las hojas hacia la raíz Procedimiento A partir de la entrada -Se sustituye una subcadena Adecuadamente elegida Que concuerde con un lado derecho -Por el no terminal del lado izquierdo Trazando una derivación inversa

Transcript of Análisis Sintáctico Ascendente y Análisis Sintáctico Descendente(Jenny Imacaña F.)

Page 1: Análisis Sintáctico Ascendente y Análisis Sintáctico Descendente(Jenny Imacaña F.)

Universidad Nacional de Loja Área de Energía, las Industrias y los Recursos

Naturales, No Renovables

Nombre: Jenny P. Imacaña F. Fecha: 14 de Diciembre del 2010

Módulo: IX “B” Docente: Ing. Edison L. Coronel

Análisis Sintáctico Ascendente

Análisis ascendente: se construye el árbol de análisis sintactico de la cadena de entrada desde

las hojas hasta la raíz. En las hojas tenemos la cadena a analizar (los símbolos terminales) que

se intentan reducir al axioma, que se encontrara en la raíz, si la cadena es correcta

sintácticamente. Parte de la cadena de entrada para construir la inversa de una derivación por

la derecha. Genera el árbol de de una derivación por la derecha. Genera el árbol de análisis

sintáctico partiendo de las hojas hasta alcanzar análisis sintáctico partiendo de las hojas hasta

alcanzar el axioma el axioma.

R1. E := E + E

R2. E := id

r2 r2 r1

id + id id + id <- E + id <- E + E <- E

¿Cuándo puede reducirse por una parte izquierda lo que parece ser la parte derecha de una

regla?

Puede haber partes derechas comunes Puede haber partes derechas comunes

Puede haber producciones Puede haber producciones ε ε

Por desplazamiento y reducción

La entrada se “reduce” al símbolo inicial

Desplazando elementos de la entrada

Llegar de las hojas hacia la raíz

Procedimiento

A partir de la entrada

-Se sustituye una subcadena

• Adecuadamente elegida

• Que concuerde con un lado derecho

-Por el no terminal del lado izquierdo

• Trazando una derivación inversa

Page 2: Análisis Sintáctico Ascendente y Análisis Sintáctico Descendente(Jenny Imacaña F.)

• Por el lado derecho

Ejemplo

Ejemplo:

Supongamos la siguiente gramática que permite generar expresiones aritméticas donde

aparece el operador suma y potencia y combinar números e identificadores.

Para la entrada id + id + id

Tipos De Conflictos

¿Que acción realizar: desplazar o reducir?

¿Que producción elegir al reducir cuando hay varias posibles?

Conflicto desplaza-reduce:

Para la entrada 2 ˆ3ˆ2

Conflicto reduce-reduce:

Supongamos una sencilla gramática que permite generar sentencias que son bien llamadas a

procedimientos o asignaciones.

Gramática

S => aABe

A => Abc | b

B => d

Entrada “abbcde”

se reduce a S por:

abbcde

Page 3: Análisis Sintáctico Ascendente y Análisis Sintáctico Descendente(Jenny Imacaña F.)

Para la entrada suma:= 3, equivalente a los componentes léxicos: id:= núm., tenemos las

posibilidades

Analizadores LR

Vamos a analizar una técnica eficiente de análisis sintáctico ascendente que se puede utilizar

para analizar una amplia clase de gramáticas de contexto libre. La técnica se denomina

análisis sintáctico LR (k); la “L” es por el examen de la entrada de izquierda a derecha (en

inglés, left-to-right), la “R” por construir una derivación por la derecha (en inglés, rightmost

derivation) en orden inverso, y la k por el número de símbolos de entrada de examen por

anticipado utilizados para tomar las decisiones del análisis sintáctico.

El análisis LR es atractivo por varias razones.

Pueden reconocer la inmensa mayoría de los lenguajes de programación que puedan

ser generados mediante gramáticas de contexto-libre.

El método de funcionamiento de estos analizadores posee la ventaja de localizar un

error sintáctico en el mismo instante que se produce con lo que se adquiere una gran

eficiencia de tiempo de compilación frente a procedimientos menos adecuados como

puedan ser los de retroceso.

Gramáticas LR

Los métodos de analisis sintáctico LR permiten reconocer la mayoría de las construcciones

de los lenguajes de programación. Son métodos muy potentes, con mayor poder de

reconocimiento que los métodos LL (Las gramáticas LL son un subconjunto de las

gramáticas LR).

Las gramáticas LR (k) se caracterizan porque:

L: Procesamos la cadena de entrada de izquierda a derecha (from left-to-right)

R: proporcionan la derivación más a la derecha de la cadena de entrada en orden inverso

(rigth-most derivation)

k: se examinan k-símbolos de la entrada por anticipado para tomar la decisión sobre la

acción a realizar.

Page 4: Análisis Sintáctico Ascendente y Análisis Sintáctico Descendente(Jenny Imacaña F.)

Análisis Sintáctico Descendente LL (1)

Especificacion de la sintaxis de un lenguaje mediante gramáticas independientes del contexto

(GIC). Estas gramáticas permiten recursividad y estructuras anidadas. Por ejemplo:

sentencias if-else anidadas, paréntesis anidados en expresiones aritméticas, que no pueden

ser representadas mediante expresiones regulares.

Es del tipo LL1 porque empieza derivando por la izquierda, y los caracteres son leídos de

izquierda a derecha, el 1 por que se lee 1 solo elemento de entrada.

Partir del axioma de la gramática

Escoger reglas gramaticales

Hacer derivaciones por la izquierda

Procesar la entrada de izquierda a derecha

Obtener el árbol de análisis sintáctico o error

También se puede considerar como un intento de construir un árbol de análisis sintáctico

para la entrada comenzando desde la raíz y creando los nodos del árbol en orden previa.

Bueno primeramente para trabajar el análisis sintáctico descendente se debe realizar

primeramente algunas operaciones para que la gramática sea LL1 las cuales son:

- Eliminar Ambigüedad

- Eliminar Recursividad por la Izquierda

- Factorizar

- Primeros y siguientes

Ambigüedad

Una gramática es ambigua cuando genera más de un árbol de derivación.

Para eliminar la ambigüedad se debe reescribir la gramática.

Recursividad por la Izquierda

Una gramática es recursiva por la izquierda si tiene un no Terminal A tal que existe una

derivación A->Aα para alguna cadena. Es decir por simple observación podemos identificar.

Page 5: Análisis Sintáctico Ascendente y Análisis Sintáctico Descendente(Jenny Imacaña F.)

La recursividad va a implicar:

Algoritmos de reconocimiento más complejos, que hagan uso de llamadas recursivas

o usen explícitamente una pila, la pila de análisis sintáctico.

La estructura de datos usada para representar la sintaxis del lenguaje ha de ser

también recursiva (el árbol de análisis sintáctico), en vez de lineal (caso de un vector

de caracteres para almacenar los lexemas en el analizador léxico).

Fundamento de los métodos descendentes: autómata predice/concuerda

En cada paso del proceso de derivación de la cadena de entrada se realiza una predicción de

la posible producción a aplicar y se comprueba si existe una concordancia entre el s´

símbolo actual en la entrada con el primer terminal que se puede generar a partir de esa regla

de producción, si existe esta concordancia se avanza en la entrada y en el árbol de derivación,

en caso contrario se vuelve hacia atrás y se elige una nueva regla de derivación.

Ejemplo: la siguiente gramática que permite generar expresiones aritméticas:

Los métodos descendentes se caracterizan porque analizan la cadena de componentes

léxicos de izquierda a derecha, obtienen la derivación mas a la izquierda y el árbol de

derivación se construye desde la raíz hasta las hojas.

Análisis descendente de gramáticas LL (1)

Una gramática LL (1) es aquella en la que su tabla de chequeo de sintaxis no posee entradas

múltiples, o sea, es suficiente con examinar sólo un símbolo a la entrada, para saber qué regla

aplicar. Toda gramática reconocible mediante el método de los diagramas de Conway es

LL(1).

El método consiste en seguir un algoritmo partiendo de:

La cadena a reconocer, junto con un apuntador, que nos indica cual es el token

actual.

Una pila de símbolos ( terminales y no terminales)

Una tabla asociada de forma unívoca a una gramática. En esta asignatura no vamos a

ver como calcular dicha tabla.

Page 6: Análisis Sintáctico Ascendente y Análisis Sintáctico Descendente(Jenny Imacaña F.)

La cadena de entrada acabará en el símbolo $, que consideramos como si fuese un EOF(

End Of File - Fin de Fichero).

Este tipo de análisis tiene el inconveniente de que muy pocas gramáticas son LL(1), aunque

muchas pueden traducirse a LL(1), tras un adecuado estudio.

Por ejemplo:

Esta gramática no es LL(1). La sustituimos por:

que es equivalente y LL(1)

Tabla M :

Diferencia del Análisis Sintáctico Descendente y del Análisis Sintáctico Ascendente

El problema con este tipo de gramáticas es que tienden a generar más oraciones de las

necesarias. Si una gramática puede generar un determinado número de oraciones.

En el primero la construcción se inicia en la raíz de árbol y avanza hacia las hojas. En el

segundo la construcción se inicia en las hojas y avanza hacia la raíz.

La diferencia entre uno y otro es que en el primero se pueden construir manualmente

analizadores más eficiente con mayor facilidad mientras que en el segundo se puede

manejar una mayor cantidad de gramáticas y esquemas de traducción. Poder analizar una frase es necesario encontrar una manera de generar a partir del símbolo

inicial. Básicamente, esto puede hacerse de dos formas diferentes:

1. Análisis descendente: se comienza por el símbolo inicial y se aplican las reglas de la

gramática hacia abajo hasta que los símbolos terminales del árbol se correspondan

con los componentes de la frase analizada (nodos terminales).

Page 7: Análisis Sintáctico Ascendente y Análisis Sintáctico Descendente(Jenny Imacaña F.)

2. Análisis ascendente: se comienza con la frase a analizar y se aplican las reglas de la

gramática hacia arriba hasta producir un único árbol cuyos nodos terminales sean las

palabras de la oración y cuyo nodo raíz sea el símbolo inicial.

La consideración esencial para la elección de uno de estos dos métodos es la de

ramificación, normalmente se usará el método que permita una menor ramificación a partir

de los nodos. Además, estos dos enfoques pueden combinarse, y de hecho es usual, en un

solo parser. Este método se denomina "análisis ascendente con filtraje descendente" (Rich &

Knight 1991) o también "análisis descendente con retrotrazado"; en él el análisis sintáctico

discurre esencialmente de forma descendente, pero el parser tiene la facultad de eliminar

inmediatamente los constituyentes que nunca podrán combinarse en estructuras de alto nivel

sin más que hacer uso de unas tablas que han sido precalculadas para una gramática concreta

mediante un sistema de reglas heurísticas.

Bibliografía:

A. Garrido, J. Iñesta, F. Moreno y J. Pérez. 2002. Diseño de compiladores.

Universidad de Alicante.

Vivancos, E. (2000), Compiladores I: una introduccion a la fase de analisis, Tema 3,

p´ aginas: 51-85. Especialmente para ejercicios.

Analisis Sintactico Ascendente [Seriada en línea].Pág.1-2 Disponible en: URL:

http://es.wikipedia.org/wiki/Compilador, [Consultado Diciembre 07, 2010]