Вы находитесь на странице: 1из 66

Eliminación de la ambigüedad.

Generación de matriz predictiva


(cálculo first y follow)

Análisis Sintáctico

Medina García Gabriel


Ramos Meléndez Daniel
Dudas y Aclaraciones
• Para la explicación de esta temática cambiaremos un poco la jugada
comenzando con las dudas que se puedan tener.
• Para facilitar la comprensión definiremos primeramente los conceptos que
serán necesarios conocer antes de llevar acabo los procedimientos que
veremos durante la presentación. (Eliminación de ambigüedad).

• GLC • Derivación
•  • Árbol de Derivación
•  • Palabra o Cadena
• L(G) • Estructura Sintáctica
•  • Inherentemente Ambigüo.
• Σ
• *
Conceptos de Ambigüedad
• GLC : Gramática Libre de Contexto.
•  : cadena o palabra.
•  : Pertenece.
• L(G) : Lenguaje generado por la gramática.
•  : Incluye , Ejemplo: A  B , A está incluido en B
• Σ : Alfabeto
• * : 1 o más.
Conceptos de Ambigüedad
• Derivación : ir sustituyendo una variable que aparece en la cabeza de
alguna producción por su cuerpo.
• 1. A 1B
• 2. A  0A
• 3. B  1B
• 4. B  0C
• 5. B  0
• 6. C  1B
• 7. C  0A
• Este conjunto de producciones son de la forma de una Gramática
Regular. A partir de A, símbolo inicial, se sustituyen sucesivamente para
generar una cadena formada solo por símbolos terminales que
pertenecen al lenguaje:
• A ==>2 0A ==>2 00A ==>1 001B ==>5 0010
Conceptos de Ambigüedad
• Árbol de Derivación : Es un Árbol formado a partir de la
derivación de una gramática. Sirve para estudiar la
ambigüedad.
• Características:
• - Cada nodo interior es No Terminal.
• - Cada nodo hoja es Terminal o ∈
• - Si existe una producción A  X1X2 …. Xk,
• - Para que el Xi sea λ debe existir la producción Xi  λ
• - La cadena resultado del árbol: las hojas del árbol
concatenadas de izquierda a derecha, recorrido en pre
orden.
• Ejemplo:
• S ==> 1S1 ==> 11S11 ==> 110S011 ==> 1101011
Conceptos de Ambigüedad

• Cadena o Palabra: Dado un alfabeto, podemos formar palabras o cadenas


con los símbolos del alfabeto. Por ejemplo, dado el alfabeto {a, b, c}
podemos formar las siguientes palabras o cadenas: a, b, ab, cab, bb, aaaa.
• Estructura Sintáctica: la gramática no determina la estructura sintáctica
de los elementos de la palabra , esta viene dada por el árbol de derivación.
• Inherentemente Ambigüo: Se dice que un Lenguaje Libre de Contexto es
inherente ambiguo si todas las gramáticas que presentan ese lenguaje son
ambiguas. Los lenguajes independientes del contexto para los cuales todas
las GIC que los generan son ambiguas, se dice que tienen una ambigüedad
inherente.
Ambigüedad
Una vez definidos los conceptos que se utilizarán dentro de la temática de
eliminación de ambigüedad podremos entender meramente lo que
ambigüedad nos trata de decir.

• Ambiguedad: El concepto general nos


dice que es la posibilidad de que algo
pueda entenderse de varios modos o
de que admita distintas
interpretaciones.
• Incertidumbre, duda o, vacilación:
“déjate ya de ambigüedades y
contesta la pregunta”.
Ambigüedad
Una gramática es ambigüa si el lenguaje que genera tiene cadenas que son
ambigüas.
Una cadena es ambigüa si existen
dos árboles de derivación distintos
que la representan.
Ej: G = { { S } , { a , + , * , ( , ) }, P , S}
P/ 1) S  S + S
2) S  S * S
3) S  ( S )
4) S  a
Este concepto puede ser aplicado a tanto a un
lenguaje, cadenas, como a una gramática (Lenguaje
ambigüo, Cadena ambigüa, Gramática ambigüa).
Ambigüedad

El problema de la ambigüedad es muy complejo


ya que no existe ningún algoritmo que permita
reconocer si una gramática es o no ambigua y, en
el caso de que lo sea, tampoco existe ningún
algoritmo que permita eliminar dicha
ambigüedad (nisiquiera es posible eliminarla en
todos los casos).

Entonces por qué el tema es ELIMINACIÓN DE


AMBIGÜEDAD!!!
Gramática ambigüa
Ok, antes de empezar a atacar…, una cosa es segura, tenemos que conocer
de qué se trata y pensar en un modo de solucionar la problemática…

Un ejemplo clásico de gramática


ambigua se presenta en la
definición de las expresiones
aritméticas que aparecen
comúnmente en los lenguajes
deprogramación.
Gramática ambigüa
El siguiente ejemplo simplificado permite definir expresiones en las que
intervienen las cuatro operaciones aritméticas básicas con operandos que
pueden ser identificadores (id) o constantes (cte). Llamaremos a esta
gramática GExp0.
G_Exp_0
Muy bien, paso a paso iremos analizando que tenemos por aquí…
Tenemos nuestros terminales: id,
cte, (, ), +, -…

Nuestros no terminales: <expre> y


<op>

Nuestro símbolo inicial de la


producción. (S) que es una <expre>
G_Exp_0
Y nuestras reglas de producción…

Una expresión consiste en:


Una expresión seguida de
un operador y luego otra
expresión o, una expresión
entre paréntesis, o un
identificador, o, una
constante.

Y un operador puede ser: +,


-, *, o también /.
G_Exp_0
Es fácil demostrar que esta gramática es ambigua construyendo dos árboles
diferentes para generar la misma expresión, concretamente
id+cte*id
id+cte*id ; es nada más y nada menos que nuestra cadena o palabra.
G_Exp_0

En el árbol de la izquierda la
operación suma, entre los dos
primeros operandos, se lleva a cabo
antes que la multiplicación.

Sin embargo, en el árbol de la


derecha se comenzaría
multiplicando los dos últimos
operandos y el resultado de esta
operación se le sumaría el valor del
primer operando
G_Exp_0
Por qué es que se evalúa de esa manera??

Nivel
La forma en que se evalua
Nivel la estructura sintántica de
la palabra es por medio de
los niveles que poseen los
Nivel
terminales según los nodos
en el árbol.

Es decir…
Árbol Izquierdo
Dentro de este nivel
evaluamos una expresión

Que viene a estar compuesta por


una expresión multiplicada por
un identificador :

Y esa expresión consiste en la


suma de un identificador con una
constante:
Es por ello que primero se realiza la
expresión de la suma y a esta finalmente
se le multiplica por el identificador.
Árbol Derecho
Dentro de este nivel
evaluamos una expresión

Que viene a estar compuesta


por un identificador sumado a
una expresión :

Y esa expresión consiste en la


multiplicación de una constante
con un identificador:
Es por ello que primero se realiza la expresión de
la multiplicación y esta finalmente se le suma al
identificador.
Análisis de la situación

Árbol Izquierda Árbol Derecha

Es evidente que a pesar de que la expresión es correcta y es la misma, la


utilización de cada árbol generaría en cada caso resultados diferentes
Solución del problema
Probablemente ya habrás pensado en una solución si ya descifraste la causa
del problema…
La causa del problema es la JERARQUÍA
DE LAS OPERACIONES

Y la solución para resolver este caso de


ambigüedad es IMPONER UNA JERARQUÍA
ENTRE LOS OPERADORES

Como suele ser habitual, consideraremos que la multiplicación y la


división tienen una prioridad más alta que la suma y la resta. Si
aparecen varias operaciones con la misma prioridad se ejecutarán
de izquierda a derecha, aunque en este caso el resultado de la
expresión siempre será el mismo.
Solución del problema
Ahora, para definir la jerarquía se van a introducir en la gramática nuevos
símbolos no terminales:

<término> y <op-adt> (este <factor> y <op-mult> (este estará


estará asociado a los operadores asociado a los operadores
aditivos suma y resta) multiplicación y división)

Así llegamos a la siguiente gramática, equivalente a G_Exp_0:


Nueva gramática
Tenemos nuestros terminales: id,
cte, (, ), +, -…
Nuestros no terminales

Nuestro símbolo inicial de la


producción. (S) que es una <expre>
G_Exp_1
Y nuestras nuevas reglas de
Una expresión consiste en: producción…
Una expresión seguida de un
operador aditivo y luego un
término, o, un término.

Un término consiste en: Un


término seguido de un
operador multiplicativo y
luego un factor, o, un factor.

Un factor consiste en: una


expresión entre paréntesis, o, Un op-adt: + ó –
un identificador, o, una
constante. Y un op-mult: * ó /
G_Exp_1
Con esta nueva grmática, a la
que llamaremos G_Exp_1, la
expresión anterior tendría un Este árbol representa
único árbol de derivación. la estructura de la
expresión

id + cte * id

, obligando a que la
multiplicación se
realice antes que la
suma.
G_Exp_1

Por qué no intentamos


nosotros construir otro árbol
con esa nueva gramática.
Nuevo Árbol
La gramática nos indica comenzar con una expresión S=<expre>
Una expresión consiste en una expresión seguida de un operador aditivo
seguido de un término, o, un término.

En este caso a diferencia del árbol anterior derivará únicamente en un


término.

Un término consiste en un término seguido de un operador multiplicación


seguido de un factor, o, un factor.
Derivaremos en la primera opción.

Un término puede derivar en un factor.

Ahora un factor puede derivar en una


constante, un operador
multiplicación puede ser el símbolo *,
y un factor puede ser un id.
Nuevo Árbol
Bién! Logramos crear otro árbol con éxito!, … Pero????
No es la misma cadena de la cuál quisimos obtener otro árbol de
derivación… Esto es porque recordemos que la estructura
sintáctica de la cadena no viene
determinada por la gramática sino por el
árbol de derivación que es obtenido de la
estructura misma de la cadena.
Volviendo a nuestro objetivo inicial, por más
que intentemos, no lograremos hayar otro
árbol de derivación para la cadena
id + cte * id
Con lo cuál hemos logrado eliminar la
ambigüedad que existía en
dicho lenguaje.
????
Ahora…
Comúnmente estas son las cuestiones existentes que me envían cuando
presento esta temática.
• Introducir nuevos símbolos no terminales en la gramática, no define una nueva
gramática? Ejectivamente, una nueva gramática ha sido creada la cual posee otros elementos
• Al alterar las reglas de producción de la gramática se está generando un nuevo
lenguaje? Un nuevo lenguaje el cuál en este caso ya no posee ambigüedad en sus cadenas.
•Dependiendo
Es necesario reducir o eliminar la ambigüedad siempre que sea posible?
del uso que tu lenguaje vaya a tener, el lenguaje natural es un lenguaje con mucha ambigüedad por ejemplo, pero no es
necesario que sea un lenguaje totalmente estricto, simplemente claro.
• Todos los lenguajes pueden poseer ambigüedad?
Puede ser que así sea, sin embargo se presenta en GLC, donde a la vez todo lenguaje regular es LC.
• Hey!, que hay de un ejemplo de ambigüedad en donde no se trate de jerarquía
de operadores?
• Wow, en verdad estoy entendiendo la temática!!
• Conoce personas solteras cerca de tu ciudad.
Otro ejemplo
La grmática S  AA, A  aSa, A  a representada a continuación es
ambigüa: la palabra a5 tiene dos árboles de derivación distintos.

Es suficiente que haya una palabra


con dos árboles de derivación
distintos para que la gramática sea
ambigüa. Esto quiere decir que existe
otra gramática de tipo 2 no ambigüa
y que genera el mismo lenguaje.
Otro ejemplo
El lenguaje generado es {a2+3i : i >= 0} y otra gramática no
ambigua que también genera este lenguaje es:

S  aa, S  aaU, U  aaaU,


U  aaa Aquí a5 solo tiene
un árbol de derivación asociado
que se muestra en la figura.

Donde podemos apreciar al igual que en la gramática del


ejemplo anterior fué necesario agregar nuevos símbolos
no terminales, en este caso U para eliminar la ambigüedad
que la gramática poseía.
Problemas
El problema de la ambigüedad es que esta suele ser demasiado compleja al
momento de evaluarla.
Lo que nos lleva a la pregunta

Existe un algoritmo para determinar si una gramática es ambigüa o no?


Y la respuesta es NO, no existe un algoritmo, la única forma de identificar si
es ambigüa es desarrollar todas y cada una de las palabras para comprobar
que no existan dos árboles de derivación (O MÁS!) para una misma palabra
.

Además… ni siquiera es posible eliminarla en todos los casos, por ejemplo es


imposible eliminar la ambigüedad para los lenguajes libres de contexto para
los cuales todas las GLC que los generan son ambigüas.

Es lo que conocemos como,… tienen una ambigüedad inherente.


Problemas
Así mismo no debemos confundir que se pueden obtener varias
derivaciones para una palabra y estas con el mismo árbol de derivación, lo
cual NO ES AMBIGÜEDAD! A diferencia de que una misma cadena posea
más de un árbol de derivación…

Ejemplo: sea la gramática


G = ({0, 1, 2, 3, 4, 5, 6, 7, 8, 9},{N,C}, N,
{N::= C | NC, C ::=0|1|2|3|4|5|6|7|8|9})
–Consideraremos la derivación:

N  NC  NCC  CCC  2CC  23C 


234
–El árbol de derivación correspondiente es:
Problemas
Sin embargo podemos realizar las siguientes derivaciones…

N  NC  NCC  CCC  2CC  23C 


234

N  NC  NCC  CCC  C3C  23C 


234

N  NC  NCC  CCC  2CC  2C4 


234

Siendo el mismo árbol de derivación anterior. Por lo cual no


es ambigüedad
Conclusiones
Con esto terminamos lo que es la ambigüedad, pudimos ver a través de esta
presentación una gran serie de conceptos que nos enriquecieron aún más
este tipo de temática ,

• …aprendimos un poco de la simbología que se utiliza


• …los términos involucrados en el tema
• …reforzamos el uso de los árboles de derivación y les dimos una
aplicación dentro de ambigüedad
• …se presentó un ejemplo clásico que es el de las operaciones aritméticas
donde se ve el caso de ambigüedad, como eliminarla, como se desarrolla
la lectura de los árboles, la solución que se le da al problema, comprobar
si esa solución es cierta y qué posibles cuestionamientos se tienen
comunmente en esta ejemplificación
Conclusiones
• …vimos también otro ejemplo distinto a las operaciones
aritméticas
• …con qué problemas se puede enfrentar uno ante la ambigüedad
• Y que no hay que confundir, varias derivaciones con un mismo
árbol, con ambigüedad.
Generación de matriz predictiva
(cálculo first y follow)
• Ahora nos adentraremos un poco más a los misteriosos campos
del análisis sintáctico, que personalmente a mí me intrigó desde el
momento que me dijeron, -- “Van a crear su propio lenguaje de
Programación” -- ,… !!!!!!!!.
• Wow!!!!, se que los gigantes genios de la programación son los
que han hecho esto, y yo, como es obvio, utilizo sus lenguajes de
programación, pero…, almenos yo, como hiba a enseñarle a la
computadora que un if es un if, y tiene que ser utilizado con su
estructura y si es de lo contrario está incorrecto…????
• Bueno, dicen… no hay pero que valga… y así es.
• Vamos a tomar acción y realizar varias de las tareas que
involucran el análisis sintáctico y a generar varios de los
componentes involucrados también.
Dudas y Aclaraciones
• Estoy hablando de la matriz predictiva por medio del cálculo first y
follow.

• Esta técnica de comenzar por el final dió muy buenos resultados,


sigámosla de nuevo, abordando desde un inicio las dudas y aclaraciones
del temá siguiente.
Dudas y Aclaraciones
• Para facilitar la comprensión definiremos primeramente los conceptos que
serán necesarios conocer antes de llevar acabo los procedimientos que
veremos durante la presentación. (Generación de la Matriz Predictiva,
cálculo First y Follow).

• $ • Pila
• M [X,a] • Salida de producciones
• P • Tabla de análisis sintáctico
• S predictivo
• X • Producción de x de la
• β1, β2, … βn gramática.
• Error
Conceptos Matriz Predictiva

• $: Fin de Cadena
• M [X,a]: Posición de la Matriz en X, a
• P: Firsts (Primeros)
• S: Follows (Segundos)
• X: Elemento en análisis.
• a: terminal.
• β1, β2, … βn: En la utilización de… Producción del tipo X  β1
Conceptos Matriz predictiva
• Pila: La pila contiene una secuencia
de símbolos gramaticales con un
símbolo de pesos en la parte
inferior que indica la base de la
pila.

• Salida de Producciones:
El analizador sintáctico posee
una salida, las producciones
utilizadas y resultado del
análisis.
Conceptos Matriz Predictiva

• Seguramente has de pensar…


Caemos en lo mismo!!!, más
conceptualización y nada de
aplicación de estos conceptos
dentro de la práctica…!!???

No trates de enterder, al menos hasta


este punto, meramente de donde
salieron estos componentes, como se
construyeron, como se usan, que pasa
con ellos, como…
Conceptos Matriz Predictiva
Primeramente lo que quiero es que entiendas que un analizador sintáctico
trabaja con una pila, además de otros componentes y como salida muestra
las producciones que utilizó y el resultado.

Que si te parace se te hace más fácil comprenderlo aplicado, por el


momento podemos definir que las producciones son las notaciones BNF de
nuestro lenguaje ya realizadas y el resultado es precisamente si aceptó la
cadena o no la aceptó (ocurrió un error).

Más aplicado…? Nada más y nada menos que así…


Conceptos Matriz Predictiva
Con nuestras reglas de producción
Analizando la siguiente cadenita…
(BNF)…

Durante el análisis las


salidas son la producción
1), la 2), la 4), y devido a
que no existió un “then”
seguido de la condición
del if, la cadena no es
válida y marca error.
Conceptos Matriz predictiva
• Eso en cuanto a salida de producciones…
Producciones…
• Volvamos a los conceptos…
• Tabla de análisis sintáctico predictivo…

M *V’,V+: Posición
de la Tabla en V’, V

M [X,a]: Posición
de la Tabla en X,
a
Conceptos Matriz predictiva
• Producción de x de la gramática:
• Significa sin tanta filosofía que cuando
analizamos el símbolo en cuestion la salida
podrá ser una producción de la gramática.
• Recuerda que te comenté que el analizador
sintáctico posee una salida,…

que son las producciones utilizadas y


el resultado del análisis.

Producción de x de la gramática es la
producción que nos da de salida al
analizar un símbolo.
Conceptos Matriz predictiva
• Y por ahí viste un Error:
• Significa… en la forma en cual es… un error,… Wow!
Sin embargo, como puedieron
ver en la tabla de análisis
predictivo podemos designar
muchos tipos de error, cuando
encuentre cierto no terminal y
<COND> un cierto terminal en la
secuencia.
Suponiendo el if…

Si recibo un no terminal <COND> y poseo en cadena un


end esto produce un error, (más adelante veremos por
qué).
Análisis Sintáctico
Mencionados anteriormente algunos de los componentes del análisis
sintáctico… te explicaré el esquema general que este posee…

Un programa sintáctico
está guiado por tablas.
una pila
un buffer de entrada (la
cadena que se va a
analizar con $ al final)

una tabla de análisis


predictivo
y una salida de
producciónes
Análisis Sintáctico
Se controla el analizador sintáctico mediante un programa que se comporta
como sigue, muchísima atención:

Sea X el símbolo superior de la pila y “a” el símbolo en curso de la entrada:


estos dos símbolos determinan la acción del analizador y tienen las
siguientes acciones:
X a

1)Si x = a = $ El string es válido.

2)Si x = a ≠ $ Se saca x de la pila y Se


mueve el apuntador al siguiente
símbolo o analizador en curso.
Análisis Sintáctico
X a

3)Si x es un no terminal el programa


consulta la entrada de M [X,a] de la
tabla de la matriz de análisis sintáctico.
Esta entrada será o una producción de x de la gramática o una entrada
de error. a

Producción 7 de la
gramática

X
Ejemplo…
Será más claro por medio de un ejemplo recordando que siempre debes
tener muy presentes estas 3 reglas… Las tendremos aquí cerca en todo
momento, no las pierdas de vista.
Comencemos…
Nuestras reglas de producción

La cadena que
1)Si x = a = $ El string es válido.
validaremos
2)Si x = a ≠ $ Se saca x de la pila y
Se mueve el apuntador al siguiente
símbolo o analizador en curso.
3)Si x es un no terminal el
programa consulta la entrada de
M [X,a] de la tabla de la matriz de
análisis sintáctico.
A continuación se dará una corrida a la gramática
Ejemplo… para saber si la cadena es válida

Como estado inicial… PILA ENTRADA SALIDA


$<E> Id+Id$
En pila poseemos el símbolo
inicial de la gramática y $ en
la base. Y en entrada la
cadena con el apuntador al
primer símbolo a analizar

1)Si x = a = $ El string es válido.


2)Si x = a ≠ $ Se saca x de la pila y No es 1)…, No es 2)…,
Se mueve el apuntador al siguiente
símbolo o analizador en curso.
Eso es es !, es 3)…., a
3)Si x es un no terminal el buscar en la tabla…
programa consulta la entrada de
M [X,a] de la tabla de la matriz de
análisis sintáctico.
Ejemplo…
Como X: <E>
Como a: id
La salida es la
producción 1 de la
gramática.!

1)Si x = a = $ El string es válido. PILA ENTRADA SALIDA


2)Si x = a ≠ $ Se saca x de la pila y $<E> Id+Id$ 1)<E><T><E’>
Se mueve el apuntador al siguiente $<E’><T>
símbolo o analizador en curso.
3)Si x es un no terminal el
programa consulta la entrada de Se sustituye la <E> de la cima de la pila por <E’><T>
M [X,a] de la tabla de la matriz de
análisis sintáctico.
Ejemplo…
PILA ENTRADA SALIDA
Siguiente Línea… $<E> Id+Id$ 1)<E><T><E’>
$<E’><T> Id+Id$ 4)<T><F><T’>
Ahora en Pila poseemos símbolo
<T> de la gramática. Y en $<E’><T’><F>
entrada la cadena con el
apuntador al primer símbolo Id
a analizar.

1)Si x = a = $ El string es válido.


2)Si x = a ≠ $ Se saca x de la pila y Regla 3)…
Se mueve el apuntador al siguiente Salida…
símbolo o analizador en curso.
Producción
3)Si x es un no terminal el 4
programa consulta la entrada de
M [X,a] de la tabla de la matriz de
análisis sintáctico.
Ejemplo… $<E>
PILA ENTRADA
Id+Id$
SALIDA
1)<E><T><E’>
$<E’><T> Id+Id$ 4)<T><F><T’>
Ocurre lo mismo para la
siguiente línea con salida $<E’><T’><F> Id+Id$ 7)<F>Id

producción 7 que sustituye a $<E’><T’>id Id+Id$ 6)<T’>


<F>…
Para la próxima línea ocurre la
$<E’> 2)<E’>+<T><E’>
regla 2)… y se mueve el
apuntador a <T’> y +. Y el
proceso continua
Salida 7…
1)Si x = a = $ El string es válido.
Salida 6…
2)Si x = a ≠ $ Se saca x de la pila y
Se mueve el apuntador al siguiente Salida 2…
símbolo o analizador en curso.
3)Si x es un no terminal el
programa consulta la entrada de
M [X,a] de la tabla de la matriz de
análisis sintáctico.
Ejemplo… $<E>
PILA
Id+Id$
ENTRADA SALIDA
1)<E><T><E’>
$<E’><T> Id+Id$ 4)<T><F><T’>
Regla 2)…
Regla 3), Salida 4... $<E’><T’><F> Id+Id$ 7)<F>Id

Regla 3), Salida 7… $<E’><T’>id Id+Id$ 6)<T’>


Regla 2)…
Regla 3), Salida 6…
Regla 3), Salida 3… $<E’> 2)<E’>+<T><E’>
Finalmente Regla 1
$<E’><T>+ +Id$ 4)<T><F><T’>
Cadena Valida!!!!!!!

$<E’><T’><F> Id $ 7) <F>  id

$<E’><T’>id Id $

$<E’><T’> $ 6) <T’>  

$<E’>ℇ $ 3) <E’>  

$ $ Cadena válida
Generación de matriz predictiva
(cálculo first y follow)
Puedo mostrarte ciento y un miles de estos ejemplos y seguiremos la misma
dinámica… ciertamente este ejemplo fue sencillo. SALIDA

Como son y 1)<E><T><E’>

Pero aún hace falta una parte te dirás… que se hace 4)<T><F><T’>

7)<F>Id

PILA con las 6)<T’>


$<E>
Conozco salidas del 2)<E’>+<T><E
’>
$<E’><T>

como
$<E’><T’><F>
analizador.
4)<T><F><T’>

7) <F>  id

trabaja la
$<E’><T’>id
ENTRADA
$<E’>

pila Id+Id$
Pero… 6) <T’>  
$<E’><T>+
Id+Id$
3) <E’>  
$<E’><T’><F>
Id+Id$ De donde surgió esto…? Cadena válida
$<E’><T’>id
Id+Id$

$<E’><T’>

$<E’>ℇ 1)Si x = a = $ El string es válido.


+Id$
Como se Mis reglas que
$ Id $ 2)Si x = a ≠ $ Se saca x de la pila y
Id $ comporta rigen el Se mueve el apuntador al
siguiente símbolo o analizador
$
la entrada comportamiento. en curso.
$

$
en análisis 3)Si x es un no terminal el
programa consulta la entrada de
M [X,a] de la tabla de la matriz de
análisis sintáctico.
Generación de matriz predictiva
(cálculo first y follow)
Desde un principio te comenté que generaríamos algunos de los
componentes del análisis sintáctico…
Pues llevaremos a cabo la generación de esta matriz, por medio del cálculo
“Primeros y Segundos” (Firsts & Follows)…
Muchísima atención y cero distracción porque es un proceso al cual no debes
perderle el hilo.
Cálculo First y Follow

Si α es una cadena de símbolos gramaticales se


considera primeros de α como el conjunto de
terminales que inician las cadenas derivadas de α.
Si α → ε entonces el vacío también está en primeros
de α.
Se define siguientes de A para el no terminal de A,
como el conjunto de terminales de A que pueden
aparecer inmediatamente a la derecha de A en
alguna forma de frase, es decir, el conjunto de
terminales de A tal que halla una derivación de la
forma S → α A α β para algún α y β.
Cálculo First y Follow
Paciencia, Paciencia, que es solo la
conceptualización…
Y al igual que nuestras 3 reglitas del análisis
poseemos unas reglas que hay que seguir aquí,
igual no las perderemos de vista…
Primero con los Primeros Producciones o BNF

<E>  op
a) Si X es un símbolo terminal, entonces primeros <E>  
(α) = X P<E> = {op, }
<S>  <E> a
Cálculo First Para…. P<S> Donde… <E>  <F>
<E>  <G>
<F> id
<F>  ε
b) Si X es un símbolo no terminal, entonces <S>  <E>a
<G> cons
para cada producción del tipo <E>  <F>

X → β1, β2........ βn <E>  <G>


<F> id
1) Incluir primeros de (βi) en primeros de
(X) <F>  ε P<S> = {id, ε, cons}
<G> cons
2) De i=1 hasta n-1
P<F> = {id, ε}
Si ε está incluido en primeros de (βi) incluir
P<G> = {cons}
en primeros de (βi+1).
P<E>={P<F>,P<G>}={id, ε,cons}
3) Tomando como base el punto anterior, si P<G>={cons, ε}
vacío está incluido en primeros de (βi)
P<E>={P<F>,P<G>}={id, ε, cons}
hasta primeros de (βn) incluir vacio en
primeros de (X).
Cálculo Follow Para…. X  YZ

1) Si X es la primera producción de la gramática S(X) ={$}


se incluye $ en siguientes de X. O conjunto de
terminales de X que pueden aparecer
inmediatamente a la derecha de X.
2) Los siguientes de Y son: S(Y) ={Z}

a) Si Z es un terminal se incluyen en siguientes (Y)


a excepción del vacío. S(Y) ={P(Z)}
b) Si Z es un no terminal se incluyen los primeros
(Z) en siguientes de Y a excepción del vacío.
3) Los siguientes de Z son, si Z es el último
B  CZ
término de la producción, se incluyen los siguientes
de esa producción en siguientes de Z. Z  AZ
No se incluye el vacío en vez de esto se incluyen los S(Z) ={S(B), S(Z)}
siguientes de la producción que genera el vacío.
a) Si X es un símbolo terminal, entonces
primeros (α) = X
Ejemplo… b) Si X es un símbolo no terminal,
entonces para cada producción del tipo
X → β1, β2........ βn
Nuestras reglas de
Producción 1) Incluir primeros de (βi) en primeros
de (X)
1) <E>  <T> <E’> Primeros. 2) De i=1 hasta n-1
2) <E’>  + <T> <E’> P(<E>) = {P(<T>)} = {P(<F>)} Si ε está incluido en primeros de (βi)
incluir en primeros de (βi+1).
3) <E’>   ={id, ( }
3) Tomando como base el punto
4) <T>  <F> <T’> P(<E’>) = {+, } anterior, si vacío está incluido en
5) <T’>  * <F> <T’> P(<T>) = {P(<F>)} = {id, ( } primeros de (βi) hasta primeros de (βn)
incluir vacío en primeros de (X).
6) <T’>  
P(<T’>) = { *, }
7) <F>  id
P(<F>) = {id, ( }
8) <F>  (<E>)
1) Si X es la primera producción de la
gramática se incluye $ en siguientes de
Ejemplo… X. O conjunto de terminales de X que
pueden aparecer inmediatamente a la
derecha de X.
Nuestras reglas de 2) Los siguientes de Y son:
Producción a) Si Z es un terminal se incluyen en
siguientes (Y) a excepción del vacío.
1) <E>  <T> <E’> Segundos. b) Si Z es un no terminal se incluyen
2) <E’>  + <T> <E’> S(< E>) = { $, )} los primeros (Z) en siguientes de Y a
excepción del vacío.
3) <E’>  
S(<E’>) = {S(<E>), S(<E’>) - = ,
3) Los siguientes de Z son, si Z es el
4) <T>  <F> <T’> $, ) } último término de la producción, se
5) <T’>  * <F> <T’> S(<T>) = {P(<E’>)} = { +,S(<E’>)} incluyen los siguientes de esa
producción en siguientes de Z.
6) <T’>   = { +, $, ) }
No se incluye el vacío en vez de esto se
7) <F>  id S(<T’>) = {S(<T>), S(<T’>)} = { incluyen los siguientes de la producción
8) <F>  (<E>) +, $, ) } que genera el vacío.
S(<F>) = {P(<T’>)} = { *, S(<T’>)
} = { *, +, $, ) }
Construcción de matriz predictiva

Una vez calculados los primeros y segundos de nuestra gramática,


conoceremos los algoritmos para construir la matriz predictiva paso a paso.
Claro que vamos adelante, es mucho pensamiento y cálculo pero lo vamos a
conseguir, Adelante!!!!...
1) <E>  <T> <E’>
Construcción de matriz 2) <E’>  + <T> <E’>
Primeros.
P(<E>) ={id, ( }

predictiva 3) <E’>   P(<E’>) = {+, }


4) <T>  <F> <T’> P(<T>) = {id, ( }
1.Para cada producción
A   realizar lo 5) <T’>  * <F> <T’> P(<T’>) = { *, }
iguiente: 6) <T’>   P(<F>) = {id, ( }

a) Para cada símbolo 7) <F>  id Segundos.


terminal en primero 8) <F>  (<E>) S(< E>) = { $, )}
de () agregar A  S(<E’>) = { $, ) }
 en M[A, ] V’
V $ Id ( ) + *
S(<T>) = { +, $, ) }
b) b) Si  esta contenido <E>
error 1 1 error error error S(<T’>) = { +, $, ) }
en primero (), S(<F>) = { *, +, $, ) }
<E’>
entonces para cada 3 error error 3 2 error
símbolo terminal en
<T>
sig (A), agregar M  error 4 4 error error error
 en [A,$]
<T’> 6 error error 6 6 5
2. Cada espacio de la
matriz indefinido hace <F>
error 7 8 error error error
error.
Construcción de matriz predictiva
Y vualá!!, es así como respondemos el ¿de dónde SALIDA

1)<E><T><E’>

$<E>
PILA
venía esta matriz?..., así ya poseemos todos los 4)<T><F><T’>

$<E’><T> elementos para el análisis sintáctico. 7)<F>Id

6)<T’>
$<E’><T’><F>
2)<E’>+<T><E
$<E’><T’>id
ENTRADA ’>

$<E’> Id+Id$ 4)<T><F><T’>

$<E’><T>+ Id+Id$ 7) <F>  id

$<E’><T’><F> Id+Id$

Id+Id$ 6) <T’>  
$<E’><T’>id

$<E’><T’> 3) <E’>  

+Id$
$<E’>ℇ Cadena válida

Id $
$
Id $

$
1)Si x = a = $ El string es válido.
$ 2)Si x = a ≠ $ Se saca x de la pila y
Se mueve el apuntador al
siguiente símbolo o analizador
en curso.
3)Si x es un no terminal el
programa consulta la entrada de
M [X,a] de la tabla de la matriz de
análisis sintáctico.

Вам также может понравиться