Gramática libre de contexto

La notación más frecuentemente utilizada para expresar gramáticas libres de contexto es la forma Backus-Naur.

Aquí hay una gramática libre de contexto para expresiones enteras algebraicas sintácticamente correctas sobre las variables x, y y z: Generaría, por ejemplo, la cadena (x + y) *x - z *y / (x + x) Una gramática libre de contexto para un lenguaje consistente en todas las cadenas que se pueden formar con las letras a y b, habiendo un número diferente de una que de otra, sería: T genera todas las cadenas con la misma cantidad de letras a que b, U genera todas las cadenas con más letras a, y V todas las cadenas con más letras b.

No es un lenguaje regular, pero puede ser generado por la siguiente gramática libre de contexto.

Las gramáticas libres de contexto si están limitadas a lenguajes matemáticos formales.

El lingüista indio Pánini (siglo IV a. C.) describió el sánscrito usando una gramática libre de contexto en su texto Astadhiai.

Existen básicamente dos formas de describir cómo en una cierta gramática una cadena puede ser derivada desde el símbolo inicial.

Por ejemplo, si tomamos la siguiente gramática: y la cadena "1 + 1 + 1", su derivación a la izquierda está en la lista [(1) (1) (2) (2) (2)].

Derivación por la izquierda (alternativa): define el siguiente árbol sintáctico: Si para una cadena del lenguaje de una gramática hay más de un árbol posible, entonces se dice que la gramática es ambigua.

Una gramática que no genera la cadena vacía puede ser transformada en una equivalente (que genera el mismo lenguaje) en forma normal de Chomsky o en forma normal de Greibach.

Por ejemplo, dada una gramática libre de contexto, se puede usar su forma normal para construir un algoritmo de coste polinomial que decida si una cadena forma parte del lenguaje definido por la gramática o no (algoritmo CYK).

Sin embargo, al contrario que en el caso de los lenguajes regulares, existen problemas interesantes para los cuales se ha mostrado su naturaleza indecidible, y por lo tanto, se carece del correspondiente algoritmo.

Podemos construir, por tanto, una gramática libre del contexto que genere todas las cadenas no aceptadas por la máquina de Turing indicada.

Una consecuencia importante es que también es indecidible la comparación entre dos gramáticas libres del contexto para comprobar si el lenguaje generado coincide.

Por el contrario, el problema sencillo de determinar si dada una cadena es aceptada por una determinada gramática libre del contexto, sí que es decidible, y por lo tanto podrá escribirse el correspondiente algoritmo para decidirlo.