stringtranslate.com

Gramática ambigua

En informática , una gramática ambigua es una gramática libre de contexto para la que existe una cadena que puede tener más de una derivación o árbol de análisis más a la izquierda . [1] Todo lenguaje libre de contexto no vacío admite una gramática ambigua introduciendo, por ejemplo, una regla de duplicado. Un lenguaje que solo admite gramáticas ambiguas se denomina lenguaje inherentemente ambiguo. Las gramáticas libres de contexto deterministas siempre son inequívocas y son una subclase importante de gramáticas inequívocas; sin embargo, existen gramáticas inequívocas no deterministas.

En el caso de los lenguajes de programación informática , la gramática de referencia suele ser ambigua debido a problemas como el problema de los else pendientes . Si están presentes, estas ambigüedades se resuelven generalmente añadiendo reglas de precedencia u otras reglas de análisis sensibles al contexto , de modo que la gramática general de la frase sea inequívoca. [ cita requerida ] Algunos algoritmos de análisis (como Earley [2] o los analizadores GLR ) pueden generar conjuntos de árboles de análisis (o "bosques de análisis") a partir de cadenas que son sintácticamente ambiguas . [3]

Ejemplos

Lenguaje trivial

El ejemplo más simple es la siguiente gramática ambigua (con símbolo de inicio A) para el lenguaje trivial que consta únicamente de la cadena vacía:

A → A | ε

…lo que significa que el no terminal A puede derivarse a sí mismo nuevamente o a la cadena vacía. Por lo tanto, la cadena vacía tiene derivaciones más a la izquierda de longitud 1, 2, 3 y, de hecho, de cualquier longitud, dependiendo de cuántas veces se use la regla A → A.

Este lenguaje también tiene una gramática inequívoca, que consiste en una única regla de producción :

A → ε

…lo que significa que la producción única solo puede producir la cadena vacía, que es la cadena única en el lenguaje.

De la misma manera, cualquier gramática de un idioma no vacío puede volverse ambigua al agregarle duplicados.

Cadena unaria

El lenguaje regular de cadenas unarias de un carácter dado, digamos 'a'(la expresión regular a*), tiene la gramática inequívoca:

A → aA | ε

…pero también tiene la gramática ambigua:

A → aA | Aa | ε

Estos corresponden a la producción de un árbol asociativo por la derecha (para la gramática inequívoca) o a la posibilidad de permitir la asociación tanto por la izquierda como por la derecha. Esto se explica a continuación.

Suma y resta

La gramática libre de contexto

A → A + A | A − A | a

es ambiguo ya que hay dos derivaciones más a la izquierda para la cadena a + a + a:

Como otro ejemplo, la gramática es ambigua ya que hay dos árboles de análisis para la cadena a + a − a:

Derivaciones más a la izquierda jaredwf.svg

Sin embargo, el lenguaje que genera no es inherentemente ambiguo; la siguiente es una gramática no ambigua que genera el mismo lenguaje:

A → A + a | A − a | a

Colgando de otra cosa

Un ejemplo común de ambigüedad en los lenguajes de programación informática es el problema de los else pendienteselse . En muchos lenguajes, el in de una declaración If–then(–else) es opcional, lo que da como resultado que los condicionales anidados tengan múltiples formas de ser reconocidos en términos de la gramática independiente del contexto.

Concretamente, en muchos lenguajes se pueden escribir condicionales en dos formas válidas: la forma if-then y la forma if-then-else – haciendo que la cláusula else sea opcional: [nota 1]

En una gramática que contiene las reglas

Declaración → si Condición entonces Declaración | si Condición entonces Declaración else Declaración | ...Condición → ...

Pueden aparecer algunas estructuras de frases ambiguas. La expresión

Si a entonces  si b entonces s de lo contrario s2

se puede analizar como

Si a entonces  comienza  Si b entonces s termina  De lo contrario s2

o como

Si a entonces  comienza  Si b entonces s De lo contrario s2 Fin

dependiendo de si elseestá asociado con el primero ifo el segundo if.

Esto se resuelve de varias maneras en diferentes idiomas. A veces, la gramática se modifica para que no sea ambigua, como por ejemplo, al requerir una endifdeclaración o hacer elseque sea obligatoria. En otros casos, la gramática se deja ambigua, pero la ambigüedad se resuelve haciendo que la gramática general de la frase sea sensible al contexto, como por ejemplo, asociando an elsecon el if. En este último caso, la gramática es inequívoca, pero la gramática libre del contexto es ambigua. [ aclaración necesaria ]

Una gramática unívoca con múltiples derivaciones

La existencia de múltiples derivaciones de la misma cadena no es suficiente para indicar que la gramática es ambigua; sólo múltiples derivaciones más a la izquierda (o, equivalentemente, múltiples árboles de análisis) indican ambigüedad.

Por ejemplo, la gramática simple

S → A + AA → 0 | 1

es una gramática inequívoca para el lenguaje { 0+0, 0+1, 1+0, 1+1 }. Si bien cada una de estas cuatro cadenas tiene solo una derivación más a la izquierda, tiene dos derivaciones diferentes, por ejemplo

S ⇒ A + A ⇒ 0 + A ⇒ 0 + 0

y

S ⇒ A + A ⇒ A + 0 ⇒ 0 + 0

Sólo la derivación anterior es la más a la izquierda.

Reconocer gramáticas ambiguas

El problema de decisión de si una gramática arbitraria es ambigua es indecidible porque se puede demostrar que es equivalente al problema de correspondencia posterior . [4] Al menos, existen herramientas que implementan algún procedimiento de semidecisión para detectar la ambigüedad de gramáticas libres de contexto. [5]

La eficiencia del análisis de una gramática libre de contexto está determinada por el autómata que la acepta. Las gramáticas libres de contexto deterministas son aceptadas por autómatas de inserción deterministas y pueden analizarse en tiempo lineal, por ejemplo, mediante un analizador LR . [6] Son un subconjunto estricto de las gramáticas libres de contexto , que son aceptadas por autómatas de inserción y pueden analizarse en tiempo polinomial, por ejemplo, mediante el algoritmo CYK .

Las gramáticas inequívocas e independientes del contexto pueden ser no deterministas. Por ejemplo, el lenguaje de palíndromos de longitud par en el alfabeto de 0 y 1 tiene la gramática inequívoca e independiente del contexto S → 0S0 | 1S1 | ε. No se puede analizar una cadena arbitraria de este lenguaje sin leer primero todos sus símbolos, lo que significa que un autómata de inserción tiene que probar transiciones de estado alternativas para adaptarse a las diferentes longitudes posibles de una cadena semianalizada. [7]

Sin embargo, la eliminación de la ambigüedad gramatical puede producir una gramática independiente del contexto determinista y, por lo tanto, permitir un análisis sintáctico más eficiente. Los generadores de compiladores como YACC incluyen funciones para resolver algunos tipos de ambigüedad, como por ejemplo mediante el uso de restricciones de precedencia y asociatividad.

Lenguas inherentemente ambiguas

Si bien algunos lenguajes libres de contexto (el conjunto de cadenas que puede generar una gramática) tienen gramáticas tanto ambiguas como no ambiguas, existen lenguajes libres de contexto para los cuales no puede existir una gramática no ambigua libre de contexto. Dichos lenguajes se denominan inherentemente ambiguos .

No existen lenguajes regulares inherentemente ambiguos. [8] [9]

La existencia de lenguajes inherentemente ambiguos e independientes del contexto fue demostrada mediante el teorema de Parikh en 1961 por Rohit Parikh en un informe de investigación del MIT. [10]

El lenguaje es inherentemente ambiguo. [11]

El lema de Ogden [12] se puede utilizar para demostrar que ciertos lenguajes independientes del contexto, como , son inherentemente ambiguos. Consulte esta página para obtener una prueba.

La unión de with es inherentemente ambigua. Este conjunto es independiente del contexto, ya que la unión de dos lenguajes independientes del contexto siempre es independiente del contexto. Pero Hopcroft y Ullman (1979) dan una prueba de que cualquier gramática independiente del contexto para este lenguaje de unión no puede analizar sin ambigüedades cadenas de la forma . [13]

Bassino y Nicaud (2011) ofrecen más ejemplos y una revisión general de las técnicas para demostrar la ambigüedad inherente de los lenguajes libres de contexto. [14]

Véase también

Referencias

  1. ^ Willem JM Levelt (2008). Introducción a la teoría de lenguajes formales y autómatas. John Benjamins Publishing. ISBN 978-90-272-3250-2.
  2. ^ Scott, Elizabeth (1 de abril de 2008). "Análisis de estilo SPPF a partir de reconocedores Earley". Notas electrónicas en informática teórica . 203 (2): 53–67. doi : 10.1016/j.entcs.2008.03.044 .
  3. ^ Tomita, Masaru. "Un algoritmo eficiente de análisis sintáctico libre de contexto aumentado". Computational linguistics 13.1-2 (1987): 31-46.
  4. ^ Hopcroft, John ; Motwani, Rajeev ; Ullman, Jeffrey (2001). Introducción a la teoría de autómatas, lenguajes y computación (2.ª ed.). Addison-Wesley. Teorema 9.20, págs. 405–406. ISBN 0-201-44124-1.
  5. ^ Axelsson, Roland; Heljanko, Keijo; Lange, Martin (2008). "Análisis de gramáticas libres de contexto mediante un solucionador SAT incremental" (PDF) . Actas del 35.º Coloquio internacional sobre autómatas, lenguajes y programación (ICALP'08), Reykjavik, Islandia . Apuntes de clase en informática . Vol. 5126. Springer-Verlag. págs. 410–422. doi :10.1007/978-3-540-70583-3_34. ISBN . 978-3-540-70582-6.
  6. ^ Knuth, DE (julio de 1965). "Sobre la traducción de lenguas de izquierda a derecha". Información y control . 8 (6): 607–639. doi :10.1016/S0019-9958(65)90426-2.
  7. ^ Hopcroft, John ; Motwani, Rajeev ; Ullman, Jeffrey (2001). Introducción a la teoría de autómatas, lenguajes y computación (2.ª ed.). Addison-Wesley. pp. 249–253. ISBN 0-201-44124-1.
  8. ^ Book, R.; Even, S.; Greibach, S.; Ott, G. (febrero de 1971). "Ambigüedad en gráficos y expresiones". IEEE Transactions on Computers . C-20 (2): 149–153. doi :10.1109/tc.1971.223204. ISSN  0018-9340. S2CID  20676251.
  9. ^ "lenguajes formales: ¿es posible hacer que las expresiones regulares sean inequívocas?". MathOverflow . Consultado el 23 de febrero de 2023 .
  10. ^ Parikh, Rohit (enero de 1961). Dispositivos generadores de lenguaje . Informe trimestral de progreso, Laboratorio de investigación en electrónica, MIT.
  11. ^ Parikh, Rohit J. (1966-10-01). "Sobre lenguajes libres de contexto". Revista de la ACM . 13 (4): 570–581. doi : 10.1145/321356.321364 . ISSN  0004-5411. S2CID  12263468.Aquí: Teorema 3.
  12. ^ Ogden, William (septiembre de 1968). "Un resultado útil para demostrar la ambigüedad inherente". Teoría de sistemas matemáticos . 2 (3): 191–194. doi :10.1007/bf01694004. ISSN  0025-5661. S2CID  13197551.
  13. ^ p.99-103, Secc.4.7
  14. ^ Fredérique Bassino y Cyril Nicaud (16 de diciembre de 2011). "Philippe Flajolet y la combinatoria analítica: ambigüedad inherente de los lenguajes libres de contexto" (PDF) . Archivado (PDF) desde el original el 25 de septiembre de 2022.

Notas

  1. ^ El siguiente ejemplo utiliza sintaxis Pascal

Enlaces externos