Sunteți pe pagina 1din 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 r2 r1
R2. E := id

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
• Por el lado derecho
Ejemplo

Gramática Entrada “abbcde”


S => aABe se reduce a S por:
A => Abc | b abbcde
B => d
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.
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.
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.
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.
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).
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]

S-ar putea să vă placă și