Ampliando la decibilidad del problema de la ambigüedad de las g

Anuncio
Identificación de tres subclases ambiguas de gramáticas libres de contexto
Salvador Valerio Cavadini
Universidad Católica de Santiago del Estero
[email protected]
Diego Alejandro Cheda
Universidad Católica de Santiago del Estero
[email protected]
Resumen
En general, el problema de determinar si una gramática libre de contexto es ambigua no tiene
solución. Sin embargo, es posible identificar clases de gramáticas para las cuales es factible afirmar
que son (no)ambiguas. En este artículo identificamos tres subclases de gramáticas libres de contexto
ambiguas y proveemos un algoritmo eficiente para detectar gramáticas que pertenecen a una de ellas.
Abstract
In general, the problem of decide if a context free grammar is ambiguous can not be solved.
Nevertheless it is possible to identify grammar subclasses for which we can answer if they are or not
ambiguous. In this article we identify three context free ambiguous subclasses and we also describe
an efficient algorithm that is able to detect grammars in one of the identified subclasses.
Palabras claves: ambigüedad, decidibilidad, gramáticas libres de contexto.
Key words: ambiguity, decidibility, context free grammars.
Salvador V. Cavadini: Ingeniero en Computación. Profesor Ajunto e Investigador Asistente de la
UCSE.
Diego A. Cheda: Ingeniero en Computación. Auxiliar Docente de Primera Categoría y Asistente de
Investigación de la UCSE.
Identificación de tres subclases ambiguas de gramáticas libres de contexto
Resumen
En general, el problema de determinar si una gramática libre de contexto es ambigua no tiene
solución. Sin embargo, es posible identificar clases de gramáticas para las cuales es factible afirmar
que son (no)ambiguas. En este artículo identificamos tres subclases de gramáticas libres de contexto
ambiguas y proveemos un algoritmo eficiente para detectar gramáticas que pertenecen a una de ellas.
1. Introducción
Una gramática libre de contexto (GLC) es ambigua si con ella es posible construir más de un
árbol de derivación para una misma cadena. Por sí sola, una gramática ambigua es inofensiva ya que
cumple con la función de describir la sintaxis de un lenguaje. Sin embargo, como a menudo la
sintaxis de una cadena es utilizada para inferir su significado, la ambigüedad estructural puede
resultar en una ambigüedad semántica. Esto representa un gran problema en el desarrollo de
aplicaciones de software como los compiladores de lenguajes de programación pues dificulta la
interpretación unívoca de las sentencias del lenguaje –un ejemplo típico en ese ámbito es el que
produce la construcción if-then-else–
El problema de la detección de ambigüedad en las GLC es objeto de estudio desde los años iniciales
del desarrollo de la teoría de los lenguajes formales. A principios de la década de los 60’s del siglo
pasado se demostró que el problema era indecidible [CANTOR, FLOYD] es decir, no existe –ni puede
existir– un algoritmo tal que dada una GLC arbitraria sea capaz de determinar si es o no ambigua, lo
que implica que tampoco podrá desarrollarse un algoritmo general para transformar GLC ambiguas
en sus equivalentes no ambiguas –esta transformación también es imposible por el hecho de existir
lenguajes libre de contexto inherentemente ambiguos [PARIKH]–. En este punto la investigación tomó
dos rumbos: uno busca determinar, con la máxima precisión posible, los límites de la decibilidad del
problema –v.g.[GORN] y [GINSBURG]– y otro, estudia cómo tratar con gramáticas ambiguas en casos
prácticos como la construcción de procesadores de lenguajes –v.g. [AHO et al, 1975], [THORUP] y
[KLINT et al]–. Más recientemente y ante el desarrollo de la tecnología de procesamiento de lenguaje
natural, el problema de la ambigüedad hay recobrado interés. En este marco, el del procesamiento de
lenguaje natural, se han propuesto distintas alternativas algorítmicas para la detección de la
ambigüedad, sin embargo ellas, por ejemplo [CHEUNG et al.], son un refinamiento del algoritmo de
búsqueda exhaustiva propuesto en [EICKEL et al].
El presente trabajo se enmarca en la búsqueda de los límites precisos de la decidibilidad del
problema ya que, si bien es indecidible en general, es posible identificar subclases de GLC para las
cuáles sí se logra dar una respuesta. Así por ejemplo, se sabe que para las gramáticas regulares, una
subclase de las GLC, el problema de la ambigüedad es decidible, que toda gramática de la subclase
LR [Knuth] es no ambigua o que las GLC con ciclos son, infinitamente, ambiguas.
En este artículo presentamos tres subclases de GLC ambiguas. Para su definición nos valemos de tres
teoremas y aportamos un algoritmo que permite detectar en tiempo lineal si una gramática pertenece
a una de estas subclases.
2. Nociones preliminares
Si bien suponemos que el lector está familiarizado con los conceptos básicos de la teoría de
lenguajes formales, en esta sección los introduciremos brevemente a modo de presentación de la
notación a utilizar.1
Definición 1
Un alfabeto V es un conjunto finito no vacío de símbolos. Una cadena o palabra w sobre V es una
secuencia finita de elementos de V y |w| denota la longitud o cantidad de símbolos de w. La palabra
de longitud 0, o palabra vacía, se representa con la letra griega λ.
Definición 2
Una gramática libre de contexto se denota como G=(VN,VT, S, P), donde VN es el alfabeto de
variables o símbolos no terminales y VT el alfabeto de símbolos terminales, V=VN ∪ VT es el
alfabeto compuesto por todos los símbolos de G, S ∈VN es el símbolo distinguido y P ⊆ VN × V* es el
conjunto de producciones. Las producciones cuya segunda componente es la palabra vacía se
denominan borradoras.
Definición 3
Una derivación en G=(VN,VT, S, P) tiene la forma α ⇒G β donde ∃ A ∈ α y A → r ∈ P tal que α=α1
A α2, β=α1 r α2. La clausura transitiva de ⇒G se denota ⇒+ y ⇒* la transitiva y reflexiva . Las
derivaciones se pueden representar en forma de árboles que tienen las siguientes características:
1. Cada nodo interior está etiquetado con un símbolo perteneciente a VN
2. Cada hoja está etiquetada con λ o un símbolo perteneciente a VT
3. Si un nodo interior está etiquetado con A y sus hijos están etiquetados con X1, X2,…,Xn
respectivamente enumerados desde la izquierda, entonces A → X1 X2 …Xn es una producción
de P.
Definición 4
El conjunto de formas sentenciales asociado a una variable X de la gramática G=(VN,VT, S, P) es
{ w ∈ V*| ∃ X ⇒* w }. El lenguaje generado por la gramática G es LG = { w ∈ VT*| ∃ S ⇒* w }.
Definición 5
Una GLC es reducida si y sólo si no tiene símbolos de VT no usados ni variables inaccesibles o no
productivas.
Definición 6
Una GLC es propia si y sólo si es reducida, no tiene ciclos y no posee producciones borradoras. Se
sabe que para toda GLC no propia (que no genere λ) es posible obtener su equivalente propia.
Las definiciones compiladas en esta sección pueden encontrarse en la mayoría de los textos básicos sobre
teoría de lenguajes formales. Recomendamos [HOPCROFT et al].
1
3. Tres subclases ambiguas de GLC
Sea:
•
•
•
•
•
G=(VN,VT,S,P) una GLC reducida
X ∈ VN
a ∈ VT+
α, β ∈ (VN ∪ VT)*
δ ∈ (VN ∪ VT)+
Teorema 1. Si S ⇒* α1 X1 … Xn α2 con n>1 ∧ X ⇒+ λ ∧ X ⇒+ a entonces G es ambigua.
Demostración:
La primera condición del teorema hace posible derivar la forma sentencial α1 X1 … Xn α2
desde el símbolo inicial S. Luego se deriva algún Xi en a mientras que las demás ocurrencias del
símbolo no terminal X se derivan en λ y se obtiene la forma sentencial α1 a α2. Como es posible
lograr la misma forma sentencial eligiendo un Xj con j ≠ i para derivarlo en a, las cadenas que
pueden ser derivadas desde α1 a α2 tienen al menos dos árboles entonces G es ambigua.
Ejemplo 1. Sea la gramática G=({S,A,B,C},{a,c},S,P ) donde el conjunto de producciones P = {
S→ABC, A→AB, A→a, B→λ, B→b, C→CA, C→c }. Como S ⇒ ABC ⇒ ABBC, B⇒λ y B⇒b, se
cumple la condición del Teorema 1 entonces G es ambigua. En la Figura 1 pueden observarse dos
árboles de derivación para la cadena abc. Se ha resaltado en oscuro el subárbol que corresponde a la
forma sentencial que hace posible la ambigüedad.
S
S
A B C
A B C
AB b c
AB λ c
a λ
a b
Figura 1: Dos árboles de derivación para la cadena abc
Teorema 2. Si X ⇒* X α X entonces G es ambigua.
Demostración:
Como G es reducida entonces S ⇒* β1 X β2 ⇒* β1 X1 α X2 β2. Luego, la forma sentencial β1
X α X α X β2 puede obtenerse ya sea derivando X α X a partir de X1 o a partir de X2. De esta manera
las cadenas que pueden ser derivadas desde β1 X α X α X β2 tienen al menos dos árboles, entonces G
es ambigua.
Ejemplo 2. Sea la gramática G=({S,A,B,C},{a,b,c},S,P ) donde el conjunto de producciones P = {
S→A, S→B, S→C, A→ABC, A→a, B→BCA, B→b, C→CAB, C→c }. Como A ⇒ ABC ⇒ ABCAB ⇒
ABCABCA, se cumple la condición del Teorema 2 entonces G es ambigua. Toda cadena que en su
derivación incluya la forma sentencial ABCABCABCABCA tendrá al menos 2 árboles. En la Figura 2
pueden observarse dos árboles de derivación para la cadena abcabcabcabca. Se ha resaltado en
oscuro el subárbol que corresponde a la forma sentencial que hace posible la ambigüedad.
S
S
A
A
A B C
A B C
A B C b
a b C A B
c a B C A
b c a
C A B
c a
B C A
b c a
a b C A B
c a B C A
b c A B C
a b C A B
c a B C A
b c a
Figura 2: Dos árboles de derivación para la cadena abcabcabcabca
Teorema 3. Si X ⇒* α X δ ∧ X ⇒* α X entonces G es ambigua.
Demostración:
Como G es reducida entonces
S ⇒* β1 X β2 ⇒* β1 α X δ β2 y
S ⇒* β1 X β2 ⇒* β1 α X β2
Desde ambas formas sentenciales es posible obtener β1 α α X δ β2, como las cadenas que son
derivables desde esta forma sentencial tienen al menos dos árboles, G es ambigua.
Ejemplo 3. Sea la gramática G=({S,I,E,C,R,A},{c,t,a,o},S,P ) donde el conjunto de producciones P =
{ S→I, S→E, S→o, I→cR, R→tS, E→cRA, A→aS }. Como S ⇒ I ⇒ cR ⇒ ctS y S ⇒ E ⇒ cRA ⇒ ctSA
entonces se cumple la condición del Teorema 3 –X=A, α=ct y δ=A– entonces G es ambigua. Toda
cadena que en su derivación incluya la forma sentencial ctctSaS tendrá al menos 2 árboles. En la
Figura 3 pueden observarse dos árboles de derivación para la cadena ctctoao.
S
S
I
E
c R
c R A
t S
t S a S
I
E
c R A
c R
t S a S
t S
o
o
o
o
Figura 3: Dos árboles de derivación para la cadena ctctoao
4. Detección eficiente de ambigüedad
En esta sección describimos un algoritmo que permite determinar, en tiempo lineal, si una
gramática cumple con las características de las gramáticas a las cuales les es aplicable el teoremas 1.
El algoritmo se basa en el cálculo de los siguientes conjuntos de símbolos no terminales:
4.1 Conjuntos Anulables y Productivos
Para toda gramática es posible definir Anulables como el conjunto de símbolos no terminales
que pueden derivar, en uno o más pasos, en la palabra vacía (λ). Simbólicamente:
X ∈ Anulables ⇔ X ∈ VN ∧ X ⇒+ λ
Para toda gramática propia es posible definir Productivos como el conjunto de símbolos no
terminales que pueden derivar, en uno o más pasos, en una cadena no vacía de símbolos terminales.
Simbólicamente:
X ∈ Productivos ⇔ X ∈ VN ∧ X ⇒+ a / a ∈ VT+
Los algoritmos para calcular estos conjuntos son bien conocidos y se encuentran explicados en los
textos tradicionales de este dominio de conocimiento –v.g. [AHO et al, 1990] y [HOPCROFT et al.]–
4.2 Conjunto Izquierda
Para cada símbolo no terminal X de la gramática puede definirse Izquierda como el conjunto
compuesto por los símbolos no terminales que pueden aparecer en el extremo izquierdo de las
formas sentenciales generables a partir de X. Simbólicamente:
Y ∈ Izquierda(X) ⇔ Y ∈ VN ∧ X ⇒+ Y α
El siguiente es un algoritmo para computar el conjunto Izquierda de los símbolos no terminales de
una gramática:
Entrada: gramática propia G
Salida: conjuntos Izquierda
Para cada no terminal X de G hacer
Izquierda(X)=∅
Repetir
Por cada regla X -> Y α de G hacer
Izquierda(X)= Izquierda(X) ∪ {Y} ∪ Izquierda(Y)
Hasta que los conjuntos Izquierda no se modifiquen más
Algoritmo 1: Cálculo de los conjuntos Izquierda.
4.3 Conjunto Derecha
Para cada símbolo no terminal X de la gramática puede definirse Derecha como el conjunto
compuesto por los símbolos no terminales que pueden aparecer en el extremo derecho de las formas
sentenciales generables a partir de X. Simbólicamente:
Y ∈ Derecha(X) ⇔ Y ∈ VN ∧ X ⇒+ α Y
El algoritmo para calcular los conjuntos Derecha es análogo al detallado para el cómputo de los
conjuntos Izquierda.
4.4 Conjunto Siguiente
Para cada símbolo no terminal X de la gramática se define Siguiente como el conjunto
compuesto por los símbolos no terminales que pueden aparecer justo a la derecha de X en las formas
sentenciales generables a partir del símbolo distinguido de la gramática. Simbólicamente:
Y ∈ Siguiente (X) ⇔ Y ∈ VN ∧ S ⇒+ α XY β
A continuación se detalla un algoritmo para computar el conjunto Siguiente de los símbolos no
terminales de una gramática:
Entrada: gramática propia G
Salida: conjuntos Siguiente
Para cada no terminal X de G hacer
Siguiente(X)=∅
Repetir
Por cada regla N -> s1…sisi+1…sn con 1≤i≤n-1 de G hacer
Si si∧si+1 ∈ VN entonces
Siguiente(si)= Siguiente(si) ∪ {si+1} ∪ Izquierda (si+1)
Por cada X ∈ Derecha(si) hacer
Siguiente(X)= Siguiente(X) ∪ Siguiente(si)
Hasta que los conjuntos Siguiente no se modifiquen más
Algoritmo 2: Cálculo de los conjuntos Siguiente.
4.5 Redefinición del Teorema 1
Una vez definidos los conjuntos Anulables, Productivos, Izquierda, Derecha y Siguiente
podemos deducir que:
X ∈ Siguiente(X) ⇔ S ⇒+ α XX β
b) X ∈ Anulables ⇔ X ⇒+ λ
c) X ∈ Productivos ⇔ X ⇒+ a
a)
Estas conclusiones nos dan la oportunidad de enunciar el teorema 1 en términos de estos
conjuntos. Sea la gramática libre de contexto reducida G=(VN,VT,S,P):
Teorema 1:
Si ∃ X ∈ VN / X ∈ (Siguiente(X) ∩ Anulables ∩ Productivos) entonces G es ambigua.
Como ya contamos con algoritmos para el cálculo de estos conjuntos es viable diseñar un algoritmo
que detecte gramáticas ambiguas de la subclase definida en el Teorema 1:
Entrada: gramática reducida G
Salida: conjuntos Siguiente
Calcular el conjunto Anulables
Si G no es propia entonces
Transformar G a su equivalente propia
Calcular
Calcular
Calcular
Calcular
el conjunto Productivos
los conjuntos Izquierda
los conjuntos Derecha
los conjuntos Siguiente
Por cada no terminal X hacer
Si X ∈ ((Siguiente(X) ∩ Anulables ∩ Productivos) entonces
G es ambigua
Algoritmo 3: Detección de la ambigüedad utilizando el Teorema 1.
4.6 Ejemplo de aplicación
Si al Algoritmo 3 le proveemos como entrada la gramática del Ejemplo 1 resulta:
Anulables={B}
Productivos={A,B,C}
No Terminal
S
A
B
C
Izquierda
{A}
{A}
∅
{C}
Derecha
{C,A,B}
{B}
∅
{A,B}
Siguiente
∅
{B,A}
{B,C,A}
{A}
Como B ∈ (Siguiente(B) ∩ Anulables ∩ Productivos) puede concluirse que la gramática es ambigua.
5. Comentarios finales y direcciones futuras
Se presentaron tres subclases de GLC ambiguas y se proveyó un algoritmo eficiente de
detección para una de ellas. Estos resultados son un aporte a la identificación más exacta los límites
de la decidibilidad del problema de determinar la ambigüedad en GLC.
Hasta el momento, no nos ha sido posible diseñar un método eficiente para la detección de
gramáticas con las características descritas en los Teoremas 2 y 3. Este problema, la identificación de
nuevas clases de GLC para las cuales sea posible decidir su ambigüedad y la definición de métodos
que permitan eliminar determinados casos de ambigüedad serán objeto de nuestros próximos
esfuerzos.
Agradecimientos
Agradecemos las correcciones y sugerencias de los revisores anónimos del artículo.
Referencias
AHO A.V., JOHNSON S.C., ULLMAN J.D. (1975) “Deterministic parsing of ambiguous grammars”,
Communications of the ACM 18:8, pp. 441-452.
AHO A.V., SETHI R., ULLMAN J.D. (1990) Compiladores. Principios, técnicas y herramientas. AddisonWesley Iberoamericana, Delaware. 820 pp.
CANTOR D.C. (1962) “On the ambiguity problem in Backus systems”, Journal of the ACM 9:4, pp.
477-479.
CHEUNG B. S. (1995) “Ambiguity in context-free grammars”, Proceedings of the 1995 ACM
Symposium on Applied Computing .
EICKEL J., PAUL M. (1966) "The parsing and ambiguity problem for Chomsky languages", Proc. IFIP
Working Conf. Formal Language Description Languages (T. B. Steel, ed.) Amsterdam.
FLOYD R.W. (1962) “On ambiguity in phrase structure languages”, Communications of the ACM 5:10,
pp. 526-534.
GINSBURG S., ULLIAN J. (1966) “Ambiguity in context free languages”, Journal of the ACM 13:1, pp.
62-89.
GORN S. (1963) “Detection of Generative Ambiguities in Context-Free Mechanical Languages”,
Journal of the ACM 10:2, pp. 196-208.
HOPCROFT J.E., MOTWANI R., ULLMAN J.D. (2002) Introducción a la Teoría de Autómatas, Lenguajes y
Computación. Pearson Educación, Madrid. 584 pp.
KLINT P., VISSER E. (1994) “Using Filters for the Disambiguation of Context-free Grammars”. Proc.
ASMICS Workshop on Parsing Theory, Milan. Report 126-94, Dept. of Computer Science,
University of Milan, Italy.
KNUTH D. E. (1965) “On the translation of languages from left to right”, Information and Control ,pp
607-639.
PARIKH R.J. (1961) “Language-generating devices” Quarterly Progres Report, Research Laboratory of
Electronics, MIT. pp.199-212.
THORUP M. (1994) “Controlled grammatic ambiguity”, ACM Trans. Program. Lang. Syst. 16, pp.
1024-1050.
Descargar