Udenar 15 - Analisis Sintáctico Procesamiento Descendente 2

Descargar como pptx, pdf o txt
Descargar como pptx, pdf o txt
Está en la página 1de 42

Análisis Sintáctico

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

› Gramáticas libres de contexto


› Diagramas de sintaxis
Lenguajes › Autómatas a pila
libres de
contexto
Diagramas de Autómatas a
sintaxis pila
Procesamiento Descendente
Clasificación de analizadores sintácticos

Analizadores no deterministas Cualquier tipo de


gramática
Son analizadores generales que imponen
pocas restricciones sobre la naturaleza Analizadores en
sintáctica del lenguaje. backtracking

Analizadores sintácticos descendentes


Gramáticas LL
Se parte del axioma y se aplica
Analizadores deterministas una cadena de derivaciones para
Son analizadores que imponen construir un árbol sintáctico Reconocimiento por
restricciones sobre la naturaleza vaciado de pila
lenguajes que soportan

Analizadores sintácticos ascendentes Gramáticas


Se parte de los terminales y se LR
construye la inversa de una Reconocimiento
derivación para intentar alcanzar por estados
el axiona finales
Procesamiento Descendente
Analizador descendente
El análisis sintáctico descendente es una técnica de análisis sintáctico que intenta comprobar si
una cadena x pertenece al lenguaje definido por una gramática L (G) aplicando los siguientes R1 : E → E + E
criterios:
› Partir del axioma de la gramática R2 : E → E - E
› Escoger reglas gramaticales estratégicamente R3 : E → E * E
› Hacer derivaciones por la izquierda (Left Most Derivation)
› Procesar la entrada de izquierda a derecha R4 : E → E / E
› Obtener el árbol de análisis sintáctico o error R5 : E → ( E )

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:

Analizadores predictivos LL(1)


Determinan que regla de producción aplicar en cada paso en función de la entrada que se encuentra en
cada momento en la cabeza de lectura
Analizadores predictivos LL(k)
Determinan que regla de producción aplicar en cada paso en función de los k primeros tokens que se
encuentra en cada momento en la cabeza de lectura
Procesamiento Descendente
Análisis sintáctico descendente predictivo LL(K) – LL(1)

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

Algunos analizadores predictivos LL (1)


Determinan que regla de producción aplicar en cada paso en función de la entrada que se
encuentra en cada momento en la cabeza de lectura
Procesamiento Descendente
Análisis sintáctico descendente predictivo LL(K) – LL(1)
Algunos analizadores predictivos LL (1)

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

Las reglas para construir la máquina de pila son:


 
1. El conjunto de entrada o símbolos de entrada es el conjunto de terminales de la gramática más el carácter de fin
de secuencia.
2. El conjunto de símbolos de pila consiste del símbolo de fondo de pila, todos los no terminales, los símbolos
terminales que parecen a la derecha del primer no terminal y todos los símbolos de acción especificados en la
regla 5.
3. El inicio de la pila consiste en el fondo de pila y el no terminal inicial.
4. La tabla de control de un estado tiene en las filas los símbolos de pila y en las columnas los símbolos de
entrada.
Procesamiento Descendente
GRAMÁTICAS DE TRADUCCIÓN CON PROCESAMIENTO DESCENDENTE GRAMATICA-S
 
5. Las entradas en la tabla de control dependen de las producciones de la gramática, si hay producciones de la
siguiente forma:
 
<A>  €a  donde: a no terminal
€ : símbolos de acción (pueden ser nulos)
: secuencia de no terminales, terminales y símbolos de acción, que no inicia con símbolo de acción.
- Para este caso la transición es: out(€, ) reemplace (r), avance
- Si € y  , son nulas se omite OUT.
- Si  es nula entonces la transición es: pop, avance
 
6. Si el terminal b está en el tope de la pila y corresponde al símbolo de entrada entonces la acción es pop,
avance.
7. Si en la pila hay fin de pila y la entrada es fin de secuencia , es acepte.
8. Si en el tope de la pila hay un símbolo de acción, se realiza out, pop, retiene
9. Todas las demás entradas de la tabla de control no descritas en los pasos 5, 6, 7 y 8 son rechace.
 
Procesamiento Descendente
GRAMÁTICAS DE TRADUCCIÓN CON PROCESAMIENTO DESCENDENTE GRAMATICA-S
 
Ejemplo 1, Gramática-S con traducción. Teniendo la siguiente gramática-s, elaborar la tabla de control:
 
<A>  y a w <B> x c y <D> z
<A>  b
<B>  c r
<B>  a m<A>
<D>  c <D> n
<D>  s b
 
Procesamiento Descendente
GRAMATICA-Q - Introducción
 
Ejemplo 2. Con la siguiente gramática procesar la secuencia a a c b b
<S>  a <A> <S>
<S>  b
<A>  c <A> <S>
<A>  
 
Procesar la secuencia a a c b b
 
Solución: El árbol de derivación es el siguiente:
 

Esta no es gramática–S porque la cuarta


producción, <A>  , no inicia con elemento
terminal. Se debe hacer la tabla considerando
la mejor posibilidad
 
Procesamiento Descendente
GRAMATICA-Q - Introducción
 
Ejemplo 2. Con la siguiente gramática procesar la secuencia a a c b b
1. <S>  a <A> <S>
2. <S>  b
3. <A>  c <A> <S>
4. <A>  
 
Procesar la secuencia a a c b b
 Tabla de control
Procesamiento Descendente
GRAMATICA-Q - Introducció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:

3. <S> a <A> <S> Selección (1) = a


4. <S> b Selección (2) = b
5. <A> c <A> <S> Selección (3) = c
6. <A>  Selección (4), siguiente de <A> = a,b

Selección (1)  Selección(2) = {a}  {b} = { }

Selección(3)  Selección(4) = c  a, b= 


 
Por lo tanto, la gramática si es gramática-Q
Procesamiento Descendente
GRAMÁTICAS – Q
 
Una gramática–Q también puede ser representada por una máquina de pila.

¿Cómo se llena la tabla de control?


 
Se utilizan las reglas 1,2,3 y 4 definidas en la gramática–S, además de la regla 5:
 
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.
Procesamiento Descendente
GRAMÁTICAS – Q

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.

- Para aplicar una producción de la forma: <A> b,


reemplace ( r), avance
- Para aplicar a una producción de la forma <A>  b,
pop, avance
Si la producción es de la forma <A>  
pop, retiene
6. Si el terminal b está en el tope de la pila y corresponde al símbolo de entrada entonces la acción es pop,
avance.
7. Si en la pila hay fin de pila y la entrada es fin de secuencia , es acepte.
8. Todas las demás entradas de la tabla de control no descritas en los pasos 5, 6 y 7
 
Procesamiento Descendente
GRAMÁTICAS – Q
Ejemplo – obtener la tabla de control para esta gramática Q
 
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ÁTICA DE TRADUCCIÓN UTILIZANDO LA GRAMÁTICA –Q
Se mantiene todo lo especificado en la gramática-S, teniendo en cuenta que se van a tener producciones de la forma

<A>  
 
y por lo tanto producciones de la forma:
<A>  ø, donde ø es una cadena de símbolos de acción.

En este caso se tiene lo siguiente:


 
OUT (ø), POP, Retiene
 
Ejemplo:
 
<A>x Out (x), pop, retiene
 
Procesamiento Descendente
GRAMÁTICAS LL (1)

 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)

1. <S>  <A> b <B>

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:

Elemento primero de una producción , si las producciones son genéricas se tendría

<A>  

Y se lo determina como primero():

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.

Los primeros de cada producción son los siguientes


 
1. <S>  <A> b <B> primero (<A>b<B>) = a, c, e, b
2. <S>  d primero (d)= d
3. <A>  <C><A> b primero (<C><A>b) = a, e
4. <A>  <B> primero (<B>) = c
5. <B>  c <S>d primero (c<S>d) = c
6. <B>   primero () =  
7. <C>  a primero (a)= a
8. <C>  ed primero (ed)= e

Según esto se tiene que


Para la producción 1:
1. <S>  <A> b <B> primero (<A>b<B>) = a, c, e, b
 Si hay una <S> en el tope de la pila y la secuencia inicia con a,c,e,b se aplica:
reemplace (<B>b<A>) , retiene.
 

 
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.

En la gramática las producciones 4 y6 son producciones anulables.

Es importante identificar las producciones anulables ya que estas permiten determinar el conjunto selección de
cada producción, de la siguiente forma.

Selección (A ) = primero() si y solo si  no es anulable.


Selección (A ) = primero() U siguiente(<A>) si y solo si  es anulable.

 
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).

Selección (<B> ) = primero() U siguiente(<B>) = {} U {¬, b, d} = {¬, b, d}


Selección (<A> <B>) = primero(<B>) U siguiente(<A>) = {c} U {b} = {b,c}

 
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

3. Calcular el conjunto selección

4. <S> <A> b <B> selección(1)= primero (<A> b <B>) = a, c, e, b


5. <S> d selección(2)= primero (d)= d
6. <A> <C><A> b selección(3)= primero (<C><A> b) = a, e
7. <A> <B> selección(4)= primero (<B>) U siguiente(<A>)= {c} U {b} = {c,b}
8. <B> c <S>d selección(5)= primero (c<S>d) = c
9. <B>  selección(6)= primero () U siguiente(<B>)=  U {¬, b, d} = {¬, b, d}
10. <C> a selección(7)= primero (a)= a
11. <C> ed selección(8)= primero (ed)= e
 
Siguiente (<A>); <S>  <A>b<B> = {b]
Siguiente (<B>): <S>  <A>b<B>¬ <B>b<B> <B>bc<S>d <B>bc<A>b<B>d = { ¬,b,d]
 
Procesamiento Descendente
Ejercicio. Determinar si la siguiente gramática es LL(1)
Pasos
1. Determinar si producciones con igual no terminal izquierdo sus conjuntos de predicción son disjuntos

producciones 1 y 2

Selección(1) ∩ Selección(2) = {a,c,e,b} ∩ {d} = Ø

producciones 3 y 4

Selección(3) ∩ Selección(4) = {a, e} ∩ {c,b} = Ø

Producciones 5,6

Selección(5) ∩ Selección(6) = {c} ∩ {¬,b,d} = Ø

Producciones 7,8

Selección(7) ∩ Selección(8) = {a} ∩ {e} = Ø

La gramática es gramática LL(1)


Procesamiento Descendente
Analizadores descendentes dirigidos por tabla
Una vez determinada que la gramática si es LL(1) se puede implementar el analizador sintáctico con la
implementación de una máquina de pila.
Analizadores descendentes dirigidos por tabla
La pila se da soporte a través de una representación explicita. La selección de reglas se realiza con ayuda de una
tabla que representa la gramática del lenguaje
La gramática LL(1) se la puede trabajar con un autómata de un solo estado, donde este estado se lo trabaja con una
tabla de control asi:

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 no aparecen de primeros en el lado derecho de la producción.
3. La pila inicia con la marca de fondo de pila  y el no terminal inicial o axioma:  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.
Procesamiento Descendente
Analizadores descendentes dirigidos por tabla
Una vez determinada que la gramática si es LL(1) se puede implementar el analizador sintáctico
con analizadores sintácticos recursivos o con analizadores descendentes dirigidos por tabla.
Analizadores descendentes dirigidos por tabla

5. Esta regla está conformada a su vez por dos subrreglas:


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.
Para aplicar una producción de la forma A 
reemplace ( R), retiene o pop(),push( R ), retiene

Para aplicar una producción de la forma: A b,


reemplace ( R), avance o pop(),push( R ), avance

Para aplicar a una producción de la forma A  b,


Pop( ), avance

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

#1: pop,push (<B>b<A>), retiene


#2: pop, avance
#3: pop,push(b<A><C>), retiene
#4: pop,push (<B>), retiene
#5: pop,push (d<S>), avance
#6: pop, retiene
#7: pop, avance
#8: pop,push (d), avance
Procesamiento descendente
Ejercicio . Implementar una máquina de pila determinística aumentada para reconocer expresiones
aritméticas infijas con gramáticas LL(1) y reconocer la secuencia (8*2)+4 = (I8*I2)+I4

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

1. <E> → <E> + <E> 1. <E> → <E> + <T> 1. <E> <T> <E-L>


2. <E> → <T> 2. <E-L>+ <T> <E-L>
2. <E> → <E> * <E>
3. <T> → <T> * < F>
3. <E> → ( <E> ) 4. <T> → <F> 3. <E-L>
4. <E> → n 5. <F> → ( E ) 4. <T> <F> <T-L>
6. <F> → n 5. <T-L> * <F> <T-L>
6. <T-L> 
7. <F> (<E>)
8. <F> I
 
Procesamiento Descendente
GRAMÁTICAS LL (1)
Garantizar la no recursividad por la izquierda - procedimiento

1. <E> → <E> + <T>


2. <E> → <T>
3. <T> → <T> * < F>
4. <T> → <F>
5. <F> → ( E )
6. <F> → I

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 { ), ¬ } = { ), ¬ }

4. <T> <F> <T-L> Selección (<T><F><T_L>) = primero (<F>< T_L >) = { (, Id }

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 {+,), ¬}= {+,), ¬}

7. <F> (<E>) Selección (<F>(<E>) = primero (<E>) = {(}

8. <F> Id Selección (<F>Id) = primero (Id) = {I}

 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)

Resumen #1: pop, push (<E_L><T> ), retiene


Selección (1) = {(, I} #2: pop, push (<E_L><T>), avance
Selección (2) = {+} #3: pop, avance
Selección (3) = { ), ¬ } #4: pop, push (<T_L><F>), retiene
Selección (4) = { (, Id } #5: pop, push (<T_L><F>), avance
Selección (5) = {*} #6: pop, retiene
Selección (6) = {+,), ¬} #7: pop, push ( )<F>), avance
Selección (7) = { ( } #8: pop, avance
Selección (8) = {I}  
Gracias por su atención
Muchos éxitos

También podría gustarte