Udenar 15 - Analisis Sintáctico Procesamiento Descendente 2
Udenar 15 - Analisis Sintáctico Procesamiento Descendente 2
Udenar 15 - Analisis Sintáctico Procesamiento Descendente 2
Procesamiento Descendente
Nelson Jaramillo Enríquez
Procesamiento Descendente
Análisis
Semántico
Procesamiento Descendente
Introducción
Especificación de lenguajes libres de contexto
Existen 3 diferentes maneras de definir formalmente un language libre de contexto. A lo
largo de esta sección estudiaremos cada una de ellas en detalle y veremos cómo se
puede pasar de cada una a las otras 2
Gramáticas libres
de contexto
› Elementos
R6 : E → n
Cadena de derivación
En cada paso de derivación se transforma siempre el no terminal más a la izquierda de la
forma de frase. Ejemplo derivar la cadena n+n* n
E→E+E→
n+E→
n+E*E→
n+n*E→
n+n*n
Procesamiento Descendente
Analizador descendente
Árbol de análisis sintáctico R1 : E → E + E
Se parte del axioma gramatical y se van aplicando reglas estratégicamente hasta
alcanzar la frase X como nodos hojas del árbol R2 : E → E - E
R3 : E → E * E
R4 : E → E / E
R5 : E → ( E )
R6 : E → n
Procesamiento Descendente
Analizadores sintácticos descendentes
Analizadores determinístas
Analizadores descendentes
Se parte del axioma y se aplica una cadena de derivaciones para construir un árbol sintáctico
Analizadores con retroceso
Se hace una búsqueda en profundidad con retroceso para garantizar que se encuentra la cadena.
Analizadores predictivos
Se determina qué regla aplicar a partir de un análisis de los primeros elementos de la entrada. Dentro de
estos analizadores vamos a tener:
Los analizadores sintácticos predictivos son capaces de decidir qué regla de producción aplicar a cada paso
en función de los elementos terminales que se encuentran en la cabeza de lectura de la cadena de entrada.
Estos analizadores son llamados genéricamente analizadores LL (K)
LL (k)
K es el número de terminales consultados para determinar la regla de producción a aplicar
L Derivación más a la izquierda (Left Most Derivatión)
L Lectura de izquierda a derecha
GRAMATICA-S
Posee las siguientes restricciones:
El lado derecho de cada producción inicia con un símbolo terminal.
Si dos producciones tienen el mismo elemento no terminal izquierdo, entonces sus lados derechos deben iniciar
con diferente símbolo terminal.
Ejemplo:
<S> ab<R>
<S> b<R>b<S>
<R> a
<R> b <R>
Procesamiento Descendente
GRAMATICA-S
Para una gramática–s se puede aplicar una máquina de pila y establecer un diseño de la tabla de control aplicando
las siguientes reglas:
1. El conjunto de símbolos de entrada es el conjunto de terminales de la gramática, al cual se le adiciona la marca
de fin de secuencia.
2. El conjunto de símbolos de la pila consiste de:
Marca de fondo de pila
Símbolos no terminales de la gramática
Los símbolos terminales que aparecen en el lado derecho de la producción después del primer elemento
terminal.
3. La pila inicia con la marca de fondo de pila y el no terminal inicial: <S>
4. El control está descrito por una tabla de control de un estado cuyas filas etiquetadas por
los símbolos de pila y las columnas con los símbolos de entrada.
5. Una entrada en la tabla se determina de la siguiente forma:
Procesamiento Descendente
GRAMATICA-S
5. Una entrada en la tabla se determina de la siguiente forma:
- Si la producción tiene la forma:
<A> b
Donde es una cadena de no terminales y terminales, donde b es un terminal y donde <A> es un no terminal.
Para este caso la transición corresponde a las operaciónes: Reemplace ( r), avance o pop,push( r ), avance
- Si es vacío tenemos producciones de la forma:
<S> b
Para este caso la transición corresponde a las operaciones: pop, avance.
6. Si el terminal b es un símbolo de pila, la entrada en la tabla para la fila b es: pop, avance.
7. La entrada en la tabla para la marca de fondo de pila y la marca de fin de entrada es acepte.
8. Toda la entrada no descrita por los pasos 5,6 y 7 es rechace.
Procesamiento Descendente
GRAMATICA-S
Ejemplo: Realizar la tabla de control para la siguiente gramática-s:
<S> d <S> <A>
<S> b <A>c
<A> d <A>
<A> c
Procesamiento Descendente
GRAMATICA-S
Procesamiento Descendente
GRAMÁTICAS DE TRADUCCIÓN CON PROCESAMIENTO DESCENDENTE GRAMATICA-S
Con una máquina de pila obtenida para la gramática –S, se puede realizar también la traducción y obtener así una
cadena de salida.
<A> a <B>c <D> (producción sin acción)
<A> y a w <B> x c y <D> z (producción con acción)
{ }: Símbolos de acción
SIGUIENTE DE UN NO TERMINAL
El siguiente (<X>), es el conjunto de símbolos de entrada que pueden seguir inmediatamente a <X> dentro de una
cadena intermedia derivada desde el símbolo inicial. Es el conjunto de terminales que aparecen a la derecha de
<X> en alguna forma de frase de las siguientes características.
<S> <X> a <B>
donde a es un terminal siguiente de <X>
El propósito del siguiente de <X> es saber en qué momento aplica la producción nula de una gramática:
<A> .
Recuerde que aplicar esta producción es eliminar el no terminal <A>
Procesamiento Descendente
SIGUIENTE DE UN NO TERMINAL
Ejemplo
1. <S> a <A> <S>
2. <S> b
3. <A> c <A> <S>
4. <A>
Dada la producción 4 y suponiendo que se tiene la siguiente derivación averiguar el siguiente del no terminal <A>.
<S> a <A><S>
a<A>a<A><S>
a<A>a<A>b
El siguiente de (<A>) es {a, b}
En una derivación si <X> puede ser el símbolo más a la derecha, entonces la marca de fin de entrada ¬ también es
un elemento perteneciente al siguiente de <X>. De lo anterior concluimos que es inútil aplicar la producción
vacía 4 (<A> ) si la entrada no está en el conjunto siguiente de <A>.
Procesamiento Descendente
CONJUNTO DE SELECCIÓN DE UNA PRODUCCIÓN
Entrega las entradas para el cual un control de pila debe aplicar una producción.
Si la producción es de tipo:
<A> b ( puede ser nula)
entonces, la selección de esta producción es b
Si la producción es:
<A> , la selección es el siguiente (<A>)
Ejemplo: Averiguar el conjunto de selección para cada producción de la siguiente gramática:
1. <S> a <A> <S> Selección (1) = a
2. <S> b Selección (2) = b
3. <A> c <A> <S> Selección (3) = c
4. <A> Selección (4), siguiente de <A> = a,b
Procesamiento Descendente
GRAMÁTICAS – Q
La gramática–Q es una gramática libre de contexto que tienen las siguientes condiciones:
1. El lado derecho de cada producción puede ser nulo o iniciar con un símbolo terminal.
2. Producciones con el mismo lado izquierdo tienen un conjunto de selección diferente. Es decir, la intersección
entre los conjuntos de selección debe ser vacía:
5. Una producción es aplicada siempre que el símbolo de la pila esté en el lado izquierdo y la entrada
esté en el conjunto de selección de esta producción.
<A>
y por lo tanto producciones de la forma:
<A> ø, donde ø es una cadena de símbolos de acción.
Condiciones LL (1)
Para poder aplicar el análisis descendente predictivo LL(1) es necesario que se cumplan las condiciones LL (1) que
garanticen la predictibilidad absoluta a la hora de seleccionar una regla de producción:
Para cumplir las condiciones LL (1) la gramática debe satisfacer necesariamente 3 requisitos:
› Gramática No ambigua
› Gramática factorizada por la izquierda
› Gramática no recursiva a izquierdas
Las gramáticas S y gramáticas Q son gramáticas LL(1) pero restringidas, para que quede totalmente libres, tan solo
con las condiciones anteriores, se tienen producciones de la siguiente forma:
<A> donde es una cadena de no terminales y terminales que inician con un no terminal.
Ejemplo
<S> <A> b <B>
Procesamiento Descendente
GRAMÁTICAS LL (1)
Para saber cuando se tendría que aplicar esta producción se tendría que derivar para encontrar los
elementos terminales para los cuales tendría sentido aplicar esta producción.
Estos terminales deben aparecer de primeros en la derivación. Esto permite introducir un nuevo concepto:
<A>
Definición:
Se define primero() como el conjunto de símbolos terminales que ocurren al inicio de una cadena
intermedia derivada desde .
Procesamiento Descendente
GRAMÁTICAS LL (1)
Definición:
Se define primero() como el conjunto de símbolos terminales que ocurren al inicio de una cadena intermedia
derivada desde .
Ejemplo 1. Calcular los primeros de la siguiente gramática.
1. <S> <A> b <B> primero (<A>b<B>) = a, c, e, b
2. <S> d
3. <A> <C><A> b Producción 1
4. <A> <B> primero() = primero (<A> b <B>), se deriva <A> b <B> = {a,e,c,b}
5. <B> c <S>d <A> b <B> => (3) <C><A>b b <B>=>(7) a<A>b b <B>
6. <B> <C><A>b b <B>=>(8) ed<A>b b <B>
7. <C> a <A> b <B>=>(4) <B> b <B> => (5) c <S>d b <B>
8. <C> ed <B> b <B> => (6) b<B>
Para las producciones 2 5 7 y 8, encontrar el primero es sencillo no necesitan derivarse , tan solo es el terminal que
aparece de primero
La producción 3 si necesita derivarse como se hizo con la producción 1
El primero de producción 6 que el lado derecho es es { }
Procesamiento Descendente
GRAMÁTICAS LL (1)
Definición:
Ejemplo 1. Calcular los primeros de la siguiente gramática.
Procesamiento Descendente
GRAMÁTICAS LL (1)
Definición:
Ejemplo 1. Calcular los primeros de la siguiente gramática.
Para obtener de esta gramática la máquina de pila se introduce un nuevo concepto ya que
<A>
puede generar la cadena vacía
En esta gramática las producciones 4 y 6 generan la cadena vacía, especialmente la producción 4.
Producción anulable: cuando el lado derecho de la producción es anulable, es decir, se llega a la cadena vacía, la
producción es anulable.
Es importante identificar las producciones anulables ya que estas permiten determinar el conjunto selección de
cada producción, de la siguiente forma.
Procesamiento Descendente
Definición gramática LL(1):
Una gramática se denomina LL(1) si y solo si producciones con igual lado izquierdo los conjuntos
de predicción o selección son disjuntos (no tienen elementos en común).
El conjunto de selección para una gramática LL(1) es el siguiente:
: es una cadena de no terminales y terminales que inician con un no terminal
Selección (<A> ) = primero() si y solo si no es anulable.
Selección (<A> ) = primero() U siguiente(<A>) si y solo si es anulable.
En el ejemplo para determinar el conjunto de predicción o selección se hace lo siguiente, ya que las
producciones 4 y 6 son anulables.
Selección (<B> ) = primero() U siguiente(B).
Selección (<A> <B>) = primero(B) U siguiente(A).
Procesamiento Descendente
Ejercicio. Calcular el conjunto selección de la gramática anteriore
Pasos
1. Calcular el conjunto predicción o selección de las producciones o reglas
2. Determinar si producciones con igual no terminal izquierdo sus conjuntos de predicción son disjuntos
producciones 1 y 2
producciones 3 y 4
Producciones 5,6
Producciones 7,8
Si la producción es de la forma A
Pop( ), retiene
Procesamiento descendente
Analizadores descendentes dirigidos por tabla
Ejemplo: Realizar la tabla de control de la gramática LL(1) anterior
Para la implementación se tiene la siguiente evolución de las gramáticas que reconocen expresiones aritméticas
Gramática ambigua Gramática no ambigua Gramática sin recursirvidad
con recursividad por la izquierda por la izquierda
Transformación de la gramática
<E> → <T> <E_L>
<E> → <E> + <T> | <T> = + <T> b = <T> A’ = <E_L> <E_L> → +<T> <E_L> |
<T> → <T> * < F> | <F> = * <F> b = <F> A’ = <E_L> <T> → <F> <T_L>
<F> → ( E ) <T_L> → * <F> <T_L> |
<F> → I <F> → ( E )
<F> → I
Procesamiento descendente
Ejercicio . Implementar una máquina de pila determinística para reconocer expresiones aritméticas con
gramáticas LL(1)
1. <E> <T> <E-L> Selección (<E><T> <E-L>) = primero (<T>< E_L>)= {(, Id}
2. <E-L> Selección (< E-L > +<T>< E-L >) = primero (+<T> < E-L >)=
+ <T> <E-L> {+}
3. <E-L> Selección (< E-L >) = primero () U siguiente (< E-L >) ={ } U { ), ¬ } = { ), ¬ }
5. <T-L> Selección (< T_L > *<F>< T_L >) = primero (*<F>< T_L >)=
* <F> <T-L> {*}
6. <T-L> Selección (< T_L > ) = primero () U siguiente (< T_L >) ={ } U {+,), ¬}= {+,), ¬}
Resumen
Selección (1) = {(, Id} Siguiente <E_L> = <E> <T><E_L>¬ <F><E_L> (<E>)<E_L> (<T><E_L>)
Selección (2) = {+}
Siguiente <T_L> = <E> <T><E_L> <F><T_L><E_L> <F><T_L>¬
Selección (3) = { ), ¬ }
Selección (4) = { (, Id } <E> <T><E_L> <F><T_L><E_L> <F><T_L>+<T><E_L>
Selección (5) = {*}
<E> <T><E_L> <F><T_L><E_L> (<E>)<T_L><E_L>
Selección (6) = {+,), ¬}
Selección (7) = { ( } (<T><E_L>)<T_L><E_L> (<F><T_L><E_L>)<T_L><E_L>
Selección (8) = {I}
(<F><T_L>)<T_L><E_L>
Procesamiento Descendente
Ejercicio . Implementar una tabla de control para la gramática de operaciones aritméticas LL(1)