Académique Documents
Professionnel Documents
Culture Documents
Introducción
El objetivo de esta práctica es introducir una de las aplicaciones más
destacadas de los autómatas a pila. En concreto, se introducen algunos conceptos
básicos de los analizadores sintácticos LL(k) y LR(k). Para ello se deberá conocer
qué son los símbolos de preanálisis y el mecanismo de construcción de estos
analizadores. Estos conceptos pueden estudiarse con el material incluido en el
enunciado de esta práctica y en la referencia [1].
Estos analizadores se estudiarán en profundidad en la asignatura
“Procesadores de Lenguajes I” de tercer curso del grado de Ingeniería de
Informática.
Símbolos de preanálisis
Para poder utilizar en rutinas de programación los autómatas teóricos que se
definen en esta asignatura, es necesario garantizar el determinismo. No obstante,
dado un determinado autómata a pila no determinista, no siempre es posible
definir el autómata a pila determinista equivalente.
Sin embargo, existe una manera para poder eliminar el no determinismo en
algunos casos. Consiste en poder observar los siguiente símbolos que vienen
de la entrada pero sin llegar a consumirlos. Esto se conoce como principio de
preanálisis. De esta forma, en casos de no determinismo, el autómata puede
tomar decisiones sobre qué transición aplicar teniendo en cuenta los siguientes
k elementos de la entrada.
Por ejemplo, dada la gramática:
1
donde S es el símbolo inicial de la gramática y P es el siguiente conjunto de
producciones:
S → xSy
S→ǫ
ǫ, ǫ; Z0 ǫ, ǫ; S ǫ, Z0 ; ǫ
i p q f
2
G = ({S, T }, {x, y, z}, S, P )
S → xSz
S → xyT yz
T →ǫ
S → AB
A → xAy
A→ǫ
B → yBz
B → yz
S → zzSxx
S → zzSxy
S → zzSyy
S → zzSyx
S →ǫ
3
número de símbolos de preanálisis que se utilicen. Esto es así, porque para
poder decidir qué producción se ha utilizado, es necesario investigar los últimos
símbolos de la cadena que han sido precedidos por un número arbitrariamente
grande de símbolos z. Por tanto, esta gramática es no determinista y este
no determinismo no puede resolverse con ninguna cantidad de símbolos de
preanálisis.
4
la asignatura).
Una tabla de análisis sintáctico para un analizador sintáctico LL(1) es una
matriz bidimensional. Las filas se etiquetan con los no terminales de la gramática
sobre la cual se basa el analizador sintáctico. Las columnas se etiquetan con los
terminales de la gramática más una columna adicional FDC (que representa la
marca de fin de cadena). El elemento (m, n) de la tabla indica la acción que debe
seguirse cuando el no terminal m aparece en la cima de la pila y el símbolo de
preanálisis es n [1].
Veamos un ejemplo de cómo construir una tabla de análisis sintáctico
para un analizador LL(1) que se corresponda con la gramática G =
({S, A, B}, {a, b, c}, S, P ) donde S es el símbolo inicial y P es el siguiente
conjunto de producciones:
S → cABc
A → aAa
A→c
B → bBb
B→c
a b c FDC
S error error cABc error
A aAa error c error
B error bBb c error
5
que existirán por lo menos dos reglas posibles a la hora de derivar este no
terminal. De la misma forma, cualquier analizador sintáctico LL(k), se enfrentará
al problema de decidir cuál de estas reglas será la que se aplique cuando surja
el no terminal en la cima de la pila. Por desgracia, independientemente del
número de símbolos de preanálisis, siempre podremos encontrar una cadena para
la cual no es posible detectar el número de x’s o la ausencia o no de y’s sin
considerar más de k símbolos de preanálisis. Esto es así, porque el lenguaje
contiene cadenas con un número arbitrariamente grande de símbolos x’s. Por
tanto, los analizadores sintácticos LL(k) sólo son adecuados para una subclase
de lenguajes independientes del contexto.
Para paliar las deficiencias de los analizadores LL(k), se definieron los
analizadores sintácticos LR(k), que van procesando la cadena de izquierda a
derecha (del inglés Left to right derivation) mientras van construyendo una
derivación por la derecha (del inglés Right derivation) utilizando k símbolos de
preanálisis.
La construcción de un analizador sintáctico LR(k) para una determinada
gramática, consiste en la construcción de un autómata a pila equivalente a dicha
gramática y en la construcción de una tabla de análisis sintáctico que tiene en
cuenta los símbolos de preanálisis que sean necesarios. Dicha tabla se construye
a su vez, a partir de un autómata finito que tiene en cuenta en qué momento de la
derivación de una cadena nos encontramos en cada momento.
El proceso de construcción de estos elementos se encuentra definido en el
apartado 2.5 y en el apéndice A de [1].
S → xSz
S → ySz
S→z
6
Dada cualquier cadena perteneciente al lenguaje generado por G, a la hora
de decidir qué producción utilizar para derivarla, basta con inspeccionar si a
continuación viene una x, una y o una z. Por tanto, para esta gramática se necesita
un único símbolo de preanálisis.
Los estados del autómata finito correspondiente a la tabla de análisis de un
analizador sintáctico LR, se corresponden con una determinada derivación de la
gramática. Los estados de aceptación se corresponden con situaciones en las que
el autómata ha reconocido una derivación válida de la gramática.
Por tanto, en cada estado se indica para cada producción de la gramática, la
parte que ya se ha reconocido y la parte que queda por identificar. Así por ejemplo,
si se supone que de la producción S → xSz ya se ha reconocido la x, el autómata
debería poder controlar que resta por reconocer la subcadena que se obtendría
al derivar el no terminal S. Para facilitar la comprensión del funcionamiento
del autómata, se marcará la producción con un ˆ indicando qué posibilidades
de derivación hay en ese estado. Por lo tanto, en este ejemplo, la producción se
representaría de esta forma S → xˆSz.
Para el ejemplo de esta producción, al estado del autómata, se le añadirán
las transiciones correspondientes a las producciones que contengan el símbolo no
terminal S en la parte izquierda, por lo tanto el estado del autómata (que será el
estado D en la representación gráfica del autómata) queda definido por:
S → xˆSz
S → ˆxSz
S → ˆySz
S → ˆz
S ′ → ˆS
S → ˆxSz
S → ˆySz
S → ˆz
7
Otro estado, el estado B, indica que se ha reconocido la producción S ′ → S.
Para ello, se representará el estado poniendo el símbolo ˆ detrás de la producción
(S ′ → Sˆ). El estado B es un estado de aceptación (porque es un estado en el que
ya se ha reconocido una producción).
El estado C, es el estado al que se accede cuando en la cinta de entrada hay un
símbolo y y se está reconociendo la producción S → ySz. Este estado se define:
S → yˆSz
S → ˆxSz
S → ˆySz
S → ˆz
Estado x y z FDC S
A desplazar D desplazar C desplazar E B
B Aceptar
C desplazar D desplazar C desplazar E F
D desplazar D desplazar C desplazar E H
E S→z S→z
F desplazar G
G S → ySz S → ySz
H desplazar I
I S → xSz S → xSz
8
y
y S z
A C F G
z
z
S E y x
x
z
S z
B D H I
x
Figura 1: Autómata del analizador sintáctico LR(1) del ejercicio
9
la siguiente tabla se muestra la ejecución del autómata con esta cadena de entrada,
teniendo en cuenta, además, la tabla de transiciones de la tabla 1
En los pasos 5, 8 y 11 se han reconocido derivaciones válidas de la gramática,
razón por la cual la pila se ha vaciado hasta llegar al estado previo al comienzo
del reconocimiento de estas producciones. En estos pasos, se ha leído de la pila
pero no de la entrada. De esta forma, sabiendo en qué estado estaba el autómata y
cuál era el simbolo no terminal de la gramática, el autómata se ha transladado al
estado adecuado sin necesidad de leer ningún elemento de la cinta.
10
Preguntas
Cada pregunta acertada suma un punto. Las preguntas no contestadas o
erróneas sumarán 0 puntos a la calificación final de la práctica.
S → xxSzz
S → yxSzz
S → yySzz
S → xySzz
S →ǫ
11
d) Ninguna de las anteriores afirmaciones es verdadera.
S → AB
A → xAy
A→ǫ
B → yBz
B → yz
S → caSbc
S→A
A → aAb
A→b
S → xyN
N → zS
N →z
12
Indicar cuántos símbolos de preanálisis son necesarios para construir un
analizador sintáctico LR(k). Justificar brevemente su respuesta.
S → xSz
S → ySz
S→ǫ
Referencias
[1] J.G. Brookshear. Teoría de la Computación: Lenguajes Formales, Autómatas
y Complejidad. Addison-Wesley Iberoamericana, 1993.
13