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.