Gramática libre de contexto

Ajustar Compartir Imprimir Citar
Tipo de gramática formal
Extracto simplificado de la gramática formal para el lenguaje de programación C (izquierda), y derivación de una pieza de código C (derecho) del símbolo no terminal .. Stmt.. {displaystyle langle {text{Stmt}rangle }. Los símbolos no terminales y terminales se muestran en azul y rojo, respectivamente.

En la teoría del lenguaje formal, una gramática independiente del contexto (CFG) es una gramática formal cuyas reglas de producción son de la forma

A→ → α α {displaystyle A to alpha }

con A{displaystyle A} a single símbolo no final, y α α {displaystyle alpha } a string of terminals and/or nonterminals (α α {displaystyle alpha } puede estar vacío). Una gramática formal es "libre de texto" si sus reglas de producción se pueden aplicar independientemente del contexto de un no-terminal. No importa qué símbolos lo rodean, el único noterminal en el lado izquierdo siempre puede ser reemplazado por el lado derecho. Esto lo distingue de una gramática sensible al contexto.

Una gramática formal es esencialmente un conjunto de reglas de producción que describen todas las cadenas posibles en un lenguaje formal dado. Las reglas de producción son reemplazos simples. Por ejemplo, la primera regla en la imagen,

.. Stmt.. → → .. Id.. =.. Gastos.. ;{displaystyle langle {text{Stmt}rangle to langle {text{Id}rangle =langle {text{Expr}}rangle;}

reemplazantes .. Stmt.. {displaystyle langle {text{Stmt}rangle } con .. Id.. =.. Gastos.. ;{displaystyle langle {text{Id}rangle =langle {text{Expr}rangle;}. Puede haber múltiples reglas de reemplazo para un símbolo no final dado. El lenguaje generado por una gramática es el conjunto de todas las cadenas de símbolos terminales que se pueden derivar, mediante aplicaciones de regla repetidas, de algún símbolo no-terminal particular ("símbolo de inicio"). Los símbolos noterminales se utilizan durante el proceso de derivación, pero no aparecen en su cadena de resultado final.

Los lenguajes generados por gramáticas libres de contexto se conocen como lenguajes libres de contexto (CFL). Diferentes gramáticas libres de contexto pueden generar el mismo lenguaje libre de contexto. Es importante distinguir las propiedades del lenguaje (propiedades intrínsecas) de las propiedades de una gramática particular (propiedades extrínsecas). La cuestión de la igualdad lingüística (¿dos gramáticas libres de contexto dadas generan el mismo lenguaje?) es indecidible.

Las gramáticas libres de contexto surgen en lingüística donde se utilizan para describir la estructura de oraciones y palabras en un lenguaje natural, y fueron inventadas por el lingüista Noam Chomsky para este propósito. Por el contrario, en informática, a medida que aumentó el uso de conceptos definidos recursivamente, se utilizaron cada vez más. En una aplicación temprana, las gramáticas se utilizan para describir la estructura de los lenguajes de programación. En una aplicación más nueva, se utilizan en una parte esencial del Lenguaje de marcado extensible (XML) denominado Definición de tipo de documento.

En lingüística, algunos autores utilizan el término gramática de estructura sintagmática para referirse a las gramáticas independientes del contexto, en las que las gramáticas con estructura sintagmática son distintas de las gramáticas de dependencia. En informática, una notación popular para las gramáticas independientes del contexto es la forma de Backus-Naur, o BNF.

Antecedentes

Desde la época de Pāṇini, al menos, los lingüistas han descrito las gramáticas de los idiomas en términos de su estructura de bloques y han descrito cómo las oraciones se construyen recursivamente a partir de frases más pequeñas y, finalmente, palabras individuales o elementos de palabras. Una propiedad esencial de estas estructuras de bloques es que las unidades lógicas nunca se superponen. Por ejemplo, la oración:

John, cuyo coche azul estaba en el garaje, caminó hasta la tienda de comestibles.

puede estar lógicamente entre paréntesis (con los metasímbolos lógicos [ ]) de la siguiente manera:

[John.[, [cuyo [coche azul]] [era [dentro [el garaje]],]] [Caminar [a [el [tienda de comestibles]]].

Una gramática independiente del contexto proporciona un mecanismo simple y matemáticamente preciso para describir los métodos mediante los cuales se construyen frases en algún lenguaje natural a partir de bloques más pequeños, capturando la "estructura de bloque" de oraciones de forma natural. Su simplicidad hace que el formalismo sea susceptible de un estudio matemático riguroso. Las características importantes de la sintaxis del lenguaje natural, como la concordancia y la referencia, no forman parte de la gramática independiente del contexto, sino la estructura recursiva básica de las oraciones, la forma en que las cláusulas se anidan dentro de otras cláusulas y la forma en que se ordenan las listas de adjetivos y adverbios. tragado por sustantivos y verbos, se describe exactamente.

Las gramáticas libres de contexto son una forma especial de los sistemas Semi-Thue que, en su forma general, se remontan al trabajo de Axel Thue.

El formalismo de las gramáticas independientes del contexto fue desarrollado a mediados de la década de 1950 por Noam Chomsky, y también su clasificación como un tipo especial de gramática formal (a la que llamó gramáticas de estructura sintagmática). Algunos autores, sin embargo, reservan el término para gramáticas más restringidas en la jerarquía de Chomsky: gramáticas sensibles al contexto o gramáticas libres de contexto. En un sentido más amplio, las gramáticas de estructura sintagmática también se conocen como gramáticas de constituyentes. El rasgo definitorio de las gramáticas de estructura sintagmática es, por lo tanto, su adhesión a la relación de electorado, en oposición a la relación de dependencia de las gramáticas de dependencia. En el marco de la gramática generativa de Chomsky, la sintaxis del lenguaje natural se describía mediante reglas independientes del contexto combinadas con reglas de transformación.

La estructura de bloques fue introducida en los lenguajes de programación de computadoras por el proyecto Algol (1957–1960), que, como consecuencia, también presentó una gramática libre de contexto para describir la sintaxis de Algol resultante. Esto se convirtió en una característica estándar de los lenguajes informáticos, y la notación para las gramáticas utilizadas en las descripciones concretas de los lenguajes informáticos se conoció como forma Backus-Naur, en honor a dos miembros del comité de diseño del lenguaje Algol. La "estructura de bloques" El aspecto que capturan las gramáticas libres de contexto es tan fundamental para la gramática que los términos sintaxis y gramática a menudo se identifican con reglas gramaticales libres de contexto, especialmente en informática. Las restricciones formales no capturadas por la gramática se consideran entonces parte de la "semántica" del idioma

Las gramáticas libres de contexto son lo suficientemente simples como para permitir la construcción de algoritmos de análisis eficientes que, para una cadena determinada, determinan si se puede generar a partir de la gramática y cómo. Un analizador Earley es un ejemplo de dicho algoritmo, mientras que los analizadores LR y LL ampliamente utilizados son algoritmos más simples que se ocupan solo de subconjuntos más restrictivos de gramáticas libres de contexto.

Definiciones formales

Una gramática sin contexto G se define por el 4-tuple G=()V,.. ,R,S){displaystyle G=(V,SigmaR,S)}, Donde

  1. V es un conjunto finito; cada elemento v▪ ▪ V{displaystyle vin V} se llama a carácter no terminal o a variable. Cada variable representa un tipo diferente de frase o cláusula en la frase. Las variables también se llaman categorías sintácticas. Cada variable define un sub-idioma del lenguaje definido por G.
  2. . es un conjunto finito de terminals, disjoint from V, que componen el contenido real de la frase. El conjunto de terminales es el alfabeto del idioma definido por la gramática G.
  3. R es una relación finita en V× × ()V∪ ∪ .. )Alternativa Alternativa {displaystyle Vtimes (Vcup Sigma)^{*}, donde el asterisco representa la operación estelar Kleene. Los miembros de R son llamados (reescribir) reglao produccións de la gramática. (también comúnmente simbolizado por un P)
  4. S es la variable de inicio (o símbolo de inicio), utilizada para representar toda la frase (o programa). Debe ser un elemento V.

Notación de regla de producción

Una regla de producción R es formalizado matemáticamente como un par ()α α ,β β )▪ ▪ R{displaystyle (alphabeta)in R}, donde α α ▪ ▪ V{displaystyle alpha in V} es un no-terminal y β β ▪ ▪ ()V∪ ∪ .. )Alternativa Alternativa {displaystyle beta in (Vcup Sigma)^{*} es una cadena de variables y/o terminales; en lugar de usar notación de par ordenada, las reglas de producción generalmente se escriben usando un operador de flecha con α α {displaystyle alpha } como su lado izquierdo y β como su lado derecho: α α → → β β {displaystyle alpha rightarrow beta }.

Está permitido β ser la cuerda vacía, y en este caso es costumbre denotarla por ε. La forma α α → → ε ε {displaystyle alpha rightarrow varepsilon } se llama ε-producción.

Es común enumerar todos los lados de la mano derecha para el mismo lado izquierdo en la misma línea, utilizando TEN (la barra vertical) para separarlos. Reglas α α → → β β 1{displaystyle alpha rightarrow beta ¿Qué? y α α → → β β 2{displaystyle alpha rightarrow beta ¿Qué? puede ser escrito como α α → → β β 1▪ ▪ β β 2{displaystyle alpha rightarrow beta _{1}mid beta ¿Qué?. En este caso, β β 1{displaystyle beta ¿Qué? y β β 2{displaystyle beta _{2} se llaman la primera y segunda alternativa, respectivamente.

Aplicación de reglas

Para cualquier cadena u,v▪ ▪ ()V∪ ∪ .. )Alternativa Alternativa {displaystyle u,vin (Vcup Sigma)}, decimos u rendimientos directos v, escrito como u⇒ ⇒ v{displaystyle uRightarrow v,}, si ∃ ∃ ()α α ,β β )▪ ▪ R{displaystyle exists (alphabeta)in R} con α α ▪ ▪ V{displaystyle alpha in V} y u1,u2▪ ▪ ()V∪ ∪ .. )Alternativa Alternativa {displaystyle U_{1},u_{2}in (Vcup Sigma)^{*} tales que u=u1α α u2{displaystyle u,=u_{1}alpha u_{2} y v=u1β β u2{displaystyle ¿Qué?. Así, v es el resultado de la aplicación de la regla ()α α ,β β ){displaystyle (alphabeta)} a u.

Aplicación de regla repetitiva

Para cualquier cadena u,v▪ ▪ ()V∪ ∪ .. )Alternativa Alternativa ,{displaystyle u,vin (Vcup Sigma)}{*} diremos u rendimientos v o v es derivada desde u si hay un entero positivo k y cuerdas u1,...... ,uk▪ ▪ ()V∪ ∪ .. )Alternativa Alternativa {displaystyle u_{1},ldotsu_{k}in (Vcup Sigma)^{*} tales que u=u1⇒ ⇒ u2⇒ ⇒ ⋯ ⋯ ⇒ ⇒ uk=v{displaystyle "Rightarrow" u_{2}Rightarrow cdots Rightarrow u_{k}=v}. Esta relación es denotada u⇒ ⇒ Alternativa Alternativa v{displaystyle u{\fnfnfnfnfnfnfnfnfn\fn\fn\\\fn\\\\fn\\fn\\\\\\fn\\\\\\\\\\\fn\\\\\\\\\\\\\\fn\\\\\\\\\\\\\\\\\\\\\\\\\\fn\\\\\\\\\\\\\\fn\\\\\\\\\\\\\\\\ {} {fnK}v}, o u⇒ ⇒ ⇒ ⇒ v{displaystyle uRightarrow Rightarrow v} en algunos libros de texto. Si k≥ ≥ 2{displaystyle kgeq 2}, la relación u⇒ ⇒ +v{displaystyle u{\fnfnfnfnfnfnfnfnfn\fn\fn\\\fn\\\\fn\\fn\\\\\\fn\\\\\\\\\\\fn\\\\\\\\\\\\\\fn\\\\\\\\\\\\\\\\\\\\\\\\\\fn\\\\\\\\\\\\\\fn\\\\\\\\\\\\\\\\ {+} {fn}v} sostiene. En otras palabras, ()⇒ ⇒ Alternativa Alternativa ){displaystyle ({stackrel {}{Rightarrow }}} {fnMicrosoft Sans Serif} y ()⇒ ⇒ +){displaystyle ({stackrel {+}{Rightarrow }}} {fnMicrosoft Sans Serif} son el cierre transitivo reflexivo (que permite que una cadena se rinda) y el cierre transitivo (que requiere al menos un paso) de ()⇒ ⇒ ){displaystyle (Rightarrow)}, respectivamente.

Lenguaje libre de contexto

El idioma de una gramática G=()V,.. ,R,S){displaystyle G=(V,SigmaR,S)} es el conjunto

L()G)={}w▪ ▪ .. Alternativa Alternativa :S⇒ ⇒ Alternativa Alternativa w}{displaystyle L(G)={win Sigma ^{*}:S{stackrel {}{}}}} {}} {}}}} {}}}}}} {}}}} {}}}} {}}}} {}}} {}}}}}}}}} {}} {}}}} {}}}}}}} {}}}}}}}}} {}}}}}}}}}}}} {}}}}}}}} {}}}}}} {}}}}}}}}} {}}}}}}}}}}}}} {}}}}}}}}}}}}}}}}} {}}}}}}}}}}}}}} {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {}}}}}}}}}}}} {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {}}}}}}}}}}}}}}

de todas las cadenas de símbolos terminales derivables del símbolo de inicio.

Un idioma L se dice que es un lenguaje libre de contexto (CFL), si existe un CFG G, tal que L=L()G){displaystyle L,=,L(G)}.

Los autómatas pushdown no deterministas reconocen exactamente los lenguajes libres de contexto.

Ejemplos

Palabras concatenadas con su reverso

La gramática G=(){}S},{}a,b},P,S){displaystyle G=({S},{a,b},P,S)}, con producciones

SaSa,
Sb Sb,
S → ε,

es independiente del contexto. No es propio ya que incluye una producción de ε. Una derivación típica en esta gramática es

SaSaaaSaaaabSbaaaabbaa.

Esto deja claro que L()G)={}wwR:w▪ ▪ {}a,b}Alternativa Alternativa }{displaystyle L(G)={ww^{R}:win ¿Qué?. El lenguaje es libre de contextos, sin embargo, se puede probar que no es regular.

Si las producciones

Sa,
Sb,

se añade, una gramática libre de contexto para el conjunto de todos los palíndromos sobre el alfabeto { a, b } se obtiene.

Paréntesis bien formados

El ejemplo canónico de una gramática independiente del contexto es la coincidencia de paréntesis, que es representativa del caso general. Hay dos símbolos de terminal "(" y ")" y un símbolo no terminal S. Las reglas de producción son

SSS,
SS),
S → ()

La primera regla permite que el símbolo S se multiplique; la segunda regla permite que el símbolo S se encierre entre paréntesis correspondientes; y la tercera regla termina la recursividad.

Paréntesis anidados y corchetes bien formados

Un segundo ejemplo canónico son dos tipos diferentes de paréntesis anidados coincidentes, descritos por las producciones:

SSS
S → ()
SS)
S
SS]

con símbolos de terminal [ ] () y S no terminal.

La siguiente secuencia se puede derivar en esa gramática:

[ [ [ [ [ ()(] ] ] ] [ ] ] ]

Pares coincidentes

En una gramática independiente del contexto, podemos emparejar caracteres como lo hacemos con los corchetes. El ejemplo más simple:

S → aSb
S → ab

Esta gramática genera el lenguaje {}anbn:n≥ ≥ 1}{displaystyle {a^{n}b^{n}:ngeq #, que no es regular (según el lema de bombeo para los idiomas regulares).

El carácter especial ε representa la cadena vacía. Al cambiar la gramática anterior a

S → aSb
S → ε

obtenemos una gramática generando el lenguaje {}anbn:n≥ ≥ 0}{displaystyle {a^{n}b^{n}:ngeq. en su lugar. Esto difiere sólo en que contiene la cadena vacía mientras que la gramática original no.

Número distinto de a's y b's

Una gramática independiente del contexto para el idioma que consta de todas las cadenas sobre {a,b} que contienen un número desigual de a y b:

S → T ← U
T → VaT ← VaV Silencioso TaV
U → VbU Silencio VbV
V → aVbV Silencioso bVaV

Aquí, la T no terminal puede generar todas las cadenas con más a's que b's, la U no terminal genera todas las cadenas con más b's que a's y la V no terminal genera todas las cadenas con el mismo número de a's y b's. Omitir la tercera alternativa en las reglas para T y U no restringe el lenguaje de la gramática.

Segundo bloque de b's de doble tamaño

Otro ejemplo de un lenguaje no regular es {}bnamb2n:n≥ ≥ 0,m≥ ≥ 0}{displaystyle{text{b} {fn} {fn} {m}{m} {text{b}}{2n}:ngeq 0,mgeq 0}. Es libre de contexto como puede ser generado por la siguiente gramática sin contexto:

Sb Sbb Silencio A
AaA Silencio ε

Fórmulas lógicas de primer orden

Las reglas de formación de los términos y fórmulas de la lógica formal se ajustan a la definición de gramática independiente del contexto, excepto que el conjunto de símbolos puede ser infinito y puede haber más de un símbolo de inicio.

Ejemplos de lenguajes que no están libres de contexto

A diferencia de los paréntesis anidados y los corchetes bien formados de la sección anterior, no existe una gramática libre de contexto para generar todas las secuencias de dos tipos diferentes de paréntesis, cada uno balanceado por separado sin tener en cuenta al otro, donde los dos tipos no necesitan anidar uno dentro del otro, por ejemplo:

[)

o

[ [ [ [(()(] ] ]]))((([))(([))()()(])(])(])

El hecho de que este lenguaje no sea libre de contexto puede probarse utilizando lema de bombeo para lenguajes sin contexto y una prueba por contradicción, observando que todas las palabras de la forma ()n[n)n]n{fn} {fn} {fn}} {fn}}}} {fn}}}}} {n}}} {fn}}}} {fn}}}}}} {fn}}}}}}}}} {fn}} {}}}}}} {}}}}}}} {}}}} {}}}}}}}}} {}}}}}}}}}}}} {}}}}}}}}}}}}} {}}}}}}}} {}}}}}}}} {}}}}}}}}}}}}}} {}}}}}}}}}}}}}}} {}}}}} {}}}}}} {}}}}}}} {}}}}}}}}}}} {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}debe pertenecer al lenguaje. Este idioma pertenece en vez de a una clase más general y puede ser descrito por una gramática conjuntiva, que a su vez también incluye otros lenguajes sin texto, como el lenguaje de todas las palabras de la forma anbncn{displaystyle {text{a} {fn} {fn} {fn} {fn}} {fn}}} {fn}}} {fn}}} {fn}} {fn}}}}}}} {f}}} {f}}}}} {f}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {.

Gramáticas regulares

Toda gramática regular es independiente del contexto, pero no todas las gramáticas independientes del contexto son regulares. La siguiente gramática libre de contexto, por ejemplo, también es regular.

Sa
SaS
SbS

Los terminales aquí son a y b, mientras que el único nonterminal es S. El idioma descrito es todas las cadenas no vacías de a{displaystyle a}s b{displaystyle b}s that end in a{displaystyle a}.

Esta gramática es regular: ninguna regla tiene más de un no terminal en su lado derecho, y cada uno de estos no terminales está en el mismo extremo del lado derecho.

Toda gramática regular corresponde directamente a un autómata finito no determinista, por lo que sabemos que se trata de un lenguaje regular.

Usando barras verticales, la gramática anterior se puede describir más brevemente de la siguiente manera:

Sa Silencio aS Silencio bS

Derivaciones y árboles sintácticos

Una derivación de una cadena para una gramática es una secuencia de aplicaciones de reglas gramaticales que transforman el símbolo de inicio en la cadena. Una derivación prueba que la cadena pertenece al lenguaje de la gramática.

Una derivación se determina completamente dando, para cada paso:

Para mayor claridad, también se suele dar la cadena intermedia.

Por ejemplo, con la gramática:

  1. SS + S
  2. S → 1
  3. Sa

la cadena

1 + 1 + a

se puede derivar del símbolo de inicio S con la siguiente derivación:

S
S + S (por regla 1. S)
S + S + S (por regla 1. en el segundo S)
→ 1 + S + S (por regla 2. en la primera S)
→ 1 + 1 + S (por regla 2. en el segundo S)
→ 1 + 1 + a (por regla 3) en la tercera S)

A menudo, se sigue una estrategia que elige de forma determinista el siguiente no terminal para reescribir:

Dada tal estrategia, una derivación está completamente determinada por la secuencia de reglas aplicadas. Por ejemplo, una derivación más a la izquierda de la misma cadena es

S
S + S (por regla 1 en la izquierda S)
→ 1 + S (por regla 2 en la izquierda S)
→ 1 + S + S (por regla 1 en la izquierda S)
→ 1 + 1 + S (por regla 2 en la izquierda S)
→ 1 + 1 + a (por regla 3 en la izquierda S),

que se puede resumir como

Artículo 1
Artículo 2
Artículo 1
Artículo 2
Artículo 3.

Una derivación más a la derecha es:

S
S + S (por regla 1 sobre la derecha S)
S + S + S (por regla 1 sobre la derecha S)
S + S + a (por regla 3 sobre la derecha S)
S + 1 + a (por regla 2 sobre la derecha S)
→ 1 + 1 + a (por regla 2 sobre la derecha S),

que se puede resumir como

Artículo 1
Artículo 1
Artículo 3
Artículo 2
Artículo 2.

La distinción entre la derivación más a la izquierda y la derivación más a la derecha es importante porque en la mayoría de los analizadores, la transformación de la entrada se define proporcionando una pieza de código para cada regla gramatical que se ejecuta cada vez que se aplica la regla. Por lo tanto, es importante saber si el analizador determina una derivación más a la izquierda o más a la derecha porque esto determina el orden en el que se ejecutarán las piezas de código. Consulte un ejemplo de analizadores LL y analizadores LR.

Una derivación también impone, en cierto sentido, una estructura jerárquica en la cadena que se deriva. Por ejemplo, si la cadena "1 + 1 + a" se deriva de acuerdo con la derivación más a la izquierda descrita anteriormente, la estructura de la cadena sería:

{{1}S + {{1}S + {a}S}S}S

donde {...}S indica una subcadena reconocida como perteneciente a <span class="texhtml" S. Esta jerarquía también se puede ver como un árbol:

Rightmost derivation of 1 + 1 + a

Este árbol se llama árbol de análisis o "árbol de sintaxis concreta" de la cadena, en contraste con el árbol de sintaxis abstracta. En este caso, las derivaciones presentadas más a la izquierda y más a la derecha definen el mismo árbol de análisis; sin embargo, hay otra derivación más a la derecha de la misma cadena

S
S + S (por regla 1 sobre la derecha S)
S + a (por regla 3 sobre la derecha S)
S + S + a (por regla 1 sobre la derecha S)
S + 1 + a (por regla 2 sobre la derecha S)
→ 1 + 1 + a (por regla 2 sobre la derecha S),

que define una cadena con una estructura diferente

{{1}S + {1}S}S + {a}S}S

y un árbol de análisis diferente:

Leftmost derivation of 1 + 1 + a

Sin embargo, tenga en cuenta que ambos árboles de análisis se pueden obtener mediante derivaciones tanto a la izquierda como a la derecha. Por ejemplo, el último árbol se puede obtener con la derivación más a la izquierda de la siguiente manera:

S
S + S (por regla 1 en la izquierda S)
S + S + S (por regla 1 en la izquierda S)
→ 1 + S + S (por regla 2 en la izquierda S)
→ 1 + 1 + S (por regla 2 en la izquierda S)
→ 1 + 1 + a (por regla 3 en la izquierda S),

Si una cadena en el lenguaje de la gramática tiene más de un árbol de análisis, entonces se dice que la gramática es una gramática ambigua. Estas gramáticas suelen ser difíciles de analizar porque el analizador no siempre puede decidir qué regla gramatical tiene que aplicar. Por lo general, la ambigüedad es una característica de la gramática, no del lenguaje, y se puede encontrar una gramática inequívoca que genera el mismo lenguaje libre de contexto. Sin embargo, hay ciertos lenguajes que solo pueden ser generados por gramáticas ambiguas; estos lenguajes se denominan lenguajes inherentemente ambiguos.

Ejemplo: expresiones algebraicas

Aquí hay una gramática libre de contexto para expresiones algebraicas con infijos sintácticamente correctas en las variables x, y y z:

  1. Sx
  2. SSí.
  3. Sz
  4. SS + S
  5. SSS
  6. SS * S
  7. SS / S
  8. SS)

Esta gramática puede, por ejemplo, generar la cadena

()x + Sí.* xz * Sí. /x + x)

como sigue:

S
SS (por regla 5)
S * SS (por regla 6, aplicada a la izquierda S)
S * SS / S (por regla 7, aplicado a la derecha S)
S* SS / S (por regla 8, aplicada a la izquierda S)
S* SS /S) (por regla 8, aplicado a la derecha S)
S + S* SS /S) (por regla 4, aplicado a la izquierda S)
S + S* SS * S /S) (por regla 6, aplicada al cuarto S)
S + S* SS * S /S + S) (por regla 4, aplicado a la derecha S)
x + S* SS * S /S + S) (etc.)
x + Sí.* SS * S /S + S)
x + Sí.* xS * S /S + S)
x + Sí.* xz * S /S + S)
x + Sí.* xz * Sí. /S + S)
x + Sí.* xz * Sí. /x + S)
x + Sí.* xz * Sí. /x + x)

Tenga en cuenta que se tomaron muchas decisiones en cuanto a qué reescritura se realizaría a continuación. Estas elecciones parecen bastante arbitrarias. De hecho, lo son, en el sentido de que la cadena finalmente generada es siempre la misma. Por ejemplo, la segunda y tercera reescritura

S * SS (por regla 6, aplicada a la izquierda S)
S * SS / S (por regla 7, aplicado a la derecha S)

podría hacerse en el orden opuesto:

SS / S (por regla 7, aplicado a la derecha S)
S * SS / S (por regla 6, aplicada a la izquierda S)

Además, se tomaron muchas decisiones sobre qué regla aplicar a cada S seleccionado. Cambiar las elecciones hechas y no solo el orden en que se hicieron generalmente afecta qué cadena de terminal sale al final.

Veamos esto con más detalle. Considere el árbol de análisis de esta derivación:

An example parse tree

Comenzando en la parte superior, paso a paso, se expande una S en el árbol, hasta que no queden más Ses (no terminales) sin expandir. Elegir un orden diferente de expansión producirá una derivación diferente, pero el mismo árbol de análisis. El árbol de análisis solo cambiará si elegimos una regla diferente para aplicar en alguna posición en el árbol.

Pero, ¿puede un árbol de análisis diferente producir la misma cadena terminal, que es (x + y) * xz * y / (x + x) en este caso? Sí, para esta gramática particular, esto es posible. Las gramáticas con esta propiedad se denominan ambiguas.

Por ejemplo, x + y * z se puede producir con estos dos diferentes árboles de análisis:

Two different parse trees from the same input

Sin embargo, el lenguaje descrito por esta gramática no es inherentemente ambiguo: se puede dar una gramática alternativa e inequívoca para el idioma, por ejemplo:

Tx
TSí.
Tz
SS + T
SST
SS * T
SS / T
TS)
ST,

una vez más seleccionando S como símbolo de inicio. Esta gramática alternativa producirá x + y * z con un árbol de análisis sintáctico similar al dejó uno arriba, es decir, asumiendo implícitamente la asociación (x + y) * z, que no sigue el orden estándar de las operaciones. Se pueden construir gramáticas más elaboradas, inequívocas y libres de contexto que produzcan árboles de análisis sintáctico que obedezcan todas las reglas deseadas de asociatividad y precedencia de operadores.

Formas normales

Toda gramática independiente del contexto sin producción de ε tiene una gramática equivalente en la forma normal de Chomsky y una gramática en la forma normal de Greibach. "Equivalente" aquí significa que las dos gramáticas generan el mismo lenguaje.

La forma especialmente simple de las reglas de producción en las gramáticas de forma normal de Chomsky tiene implicaciones tanto teóricas como prácticas. Por ejemplo, dada una gramática libre de contexto, se puede usar la forma normal de Chomsky para construir un algoritmo de tiempo polinomial que decida si una cadena determinada está en el lenguaje representado por esa gramática o no (el algoritmo CYK).

Propiedades de cierre

Los lenguajes libres de contexto se cierran bajo varias operaciones, es decir, si los lenguajes K y L son libre de contexto, también lo es el resultado de las siguientes operaciones:

No están cerrados bajo la intersección general (por lo tanto, tampoco bajo la complementación) y la diferencia de conjuntos.

Problemas decidibles

Los siguientes son algunos problemas decidibles sobre gramáticas independientes del contexto.

Análisis

El problema de análisis, comprobar si una palabra dada pertenece al idioma dado por una gramática libre de contexto, es decidible, utilizando uno de los algoritmos de análisis de propósito general:

Leslie G. Valiant demostró que el análisis sin contexto para las gramáticas de forma normal de Chomsky se puede reducir a la multiplicación de matrices booleanas, heredando así su límite superior de complejidad de O(n2.3728639). Por el contrario, Lillian Lee ha demostrado que la multiplicación de matrices booleanas O(n3−ε) es reducible a O(n3−3ε) análisis de CFG, estableciendo así algún tipo de límite inferior para este último.

Accesibilidad, productividad, nulabilidad

Gramática de ejemplo:
SBb Silencio Cc Silencio Ee
BBb Silencio b
CC
DBd Silencio Cd Silencio d
EEe

Un símbolo no definitivo X{displaystyle X} se llama productivo, o generación, si hay una derivación X⇒ ⇒ Alternativa Alternativa w{displaystyle X{stackrel {} {fnMicrosoft Sans Serif} para alguna cuerda w{displaystyle w} de símbolos terminales. X{displaystyle X} se llama accesible si hay una derivación S⇒ ⇒ Alternativa Alternativa α α Xβ β {displaystyle S{stackrel {fnK} {fnMicrosoft Sans Serif} Xbeta } para algunas cuerdas α α ,β β {displaystyle alphabeta} de símbolos no terminales y terminales del símbolo de inicio. X{displaystyle X} se llama inútil inútil inútil inútil inútil inútil inútil inútil inútil si es inalcanzable o improductivo. X{displaystyle X} se llama nulo si hay una derivación X⇒ ⇒ Alternativa Alternativa ε ε {displaystyle X{stackrel Varepsilon. Una regla X→ → ε ε {displaystyle Xrightarrow varepsilon } se llama ε-producción. Una derivación X⇒ ⇒ +X{displaystyle X{stackrel {+} {\\fnMicrosoft} se llama ciclo.

Se sabe que los algoritmos eliminan de una gramática dada, sin cambiar su lenguaje generado,

En particular, una alternativa que contenga un símbolo no terminal inútil se puede eliminar del lado derecho de una regla. Tales reglas y alternativas se denominan inútiles.

En el ejemplo de gramática representado, la D no terminal es inalcanzable y E es improductiva, mientras que CC provoca un ciclo. Por lo tanto, la omisión de las tres últimas reglas no cambia el lenguaje generado por la gramática, ni la omisión de las alternativas "| CC | Ee" del lado derecho de la regla para S.

Se dice que una gramática independiente del contexto es adecuada si no tiene símbolos inútiles ni producciones ε ni ciclos. Combinando los algoritmos anteriores, cada gramática libre de contexto que no genera ε puede transformarse en una gramática propia débilmente equivalente.

Comprobaciones de regularidad y LL(k)

Es decidible si una gramática dada es una gramática regular, así como si es una gramática LL(k) para una k≥0 dada. Si no se da k, el último problema es indecidible.

Dado un lenguaje libre de contexto, no es decidible si es regular, ni si es un lenguaje LL(k) para un k dado .

Vacío y finitud

Existen algoritmos para decidir si un idioma de un determinado idioma libre de contexto está vacío, así como si es finito.

Problemas indecidibles

Algunas preguntas que son indecidibles para clases más amplias de gramáticas se vuelven decidibles para gramáticas independientes del contexto; p.ej. el problema del vacío (si la gramática genera alguna cadena terminal), es indecidible para las gramáticas sensibles al contexto, pero decidible para las gramáticas independientes del contexto.

Sin embargo, muchos problemas son indecidibles incluso para gramáticas independientes del contexto. Los ejemplos son:

Universalidad

Dado un CFG, ¿genera el lenguaje de todas las cadenas sobre el alfabeto de los símbolos terminales usados en sus reglas?

Se puede demostrar una reducción de este problema a partir del conocido problema indecidible de determinar si una máquina de Turing acepta una entrada en particular (el problema de detención). La reducción utiliza el concepto de un historial de cómputo, una cadena que describe un cómputo completo de una máquina de Turing. Se puede construir un CFG que genera todas las cadenas que no aceptan historiales de cómputo para una máquina de Turing particular en una entrada particular y, por lo tanto, aceptará todas las cadenas solo si la máquina no acepta esa entrada.

Igualdad lingüística

Dados dos CFG, ¿generan el mismo idioma?

La indecidibilidad de este problema es una consecuencia directa del anterior: es imposible siquiera decidir si un CFG es equivalente al trivial CFG que define el lenguaje de todas las cadenas.

Inclusión de idiomas

Dados dos CFG, ¿puede el primero generar todas las cadenas que puede generar el segundo?

Si este problema fuera decidible, entonces la igualdad lingüística también podría decidirse: dos CFG G1 y G2 generan el mismo idioma si L(G1) es un subconjunto de L(G2) y L(G2) es un subconjunto de L(G1).

Estar en un nivel inferior o superior de la jerarquía de Chomsky

Usando el teorema de Greibach, se puede demostrar que los dos problemas siguientes son indecidibles:

Ambigüedad gramatical

Dado un CFG, ¿es ambiguo?

La indecidibilidad de este problema se deriva del hecho de que si existiera un algoritmo para determinar la ambigüedad, se podría decidir el problema de la correspondencia Post, que se sabe que es indecidible.

Desconecte del lenguaje

Dados dos CFG, ¿hay alguna cadena derivable de ambas gramáticas?

Si este problema fuera decidable, también se podría decidir el problema indecidable de la correspondencia postal: dadas las cuerdas α α 1,...... ,α α N,β β 1,...... ,β β N{displaystyle alpha _{1},ldotsalpha ¿Qué? ¿Qué? sobre un alfabeto {}a1,...... ,ak}{displaystyle {a_{1},ldotsa_{k}}}, deja la gramática G1{displaystyle G_{1} consiste en la regla

S→ → α α 1Sβ β 1revSilencio⋯ ⋯ Silencioα α NSβ β NrevSilenciob{displaystyle Sto alpha Sbeta _{1}{rev} sobrevivircdots ¿Qué?;

Donde β β irev{displaystyle beta _{i}{rev} denota la cadena inversa β β i{displaystyle beta _{i} y b{displaystyle b} no ocurre entre ai{displaystyle A_{i}; y dejar gramática G2{displaystyle G_{2} consiste en la regla

T→ → a1Ta1Silencio⋯ ⋯ SilencioakTakSilenciob{displaystyle Tto a_{1}Ta_{1} Silencio.;

Luego el problema de correo dado por α α 1,...... ,α α N,β β 1,...... ,β β N{displaystyle alpha _{1},ldotsalpha ¿Qué? ¿Qué? tiene una solución si y sólo si L()G1){displaystyle L(G_{1}} y L()G2){displaystyle L(G_{2}} compartir una cadena derivada.

Extensiones

Una manera obvia de extender el formalismo gramatical independiente del contexto es permitir que los no terminales tengan argumentos, cuyos valores se transmiten dentro de las reglas. Esto permite que las características del lenguaje natural, como el acuerdo y la referencia, y los análogos del lenguaje de programación, como el uso correcto y la definición de identificadores, se expresen de forma natural. P.ej. ahora podemos expresar fácilmente que en las oraciones en inglés, el sujeto y el verbo deben concordar en número. En informática, los ejemplos de este enfoque incluyen gramáticas de afijos, gramáticas de atributos, gramáticas indexadas y gramáticas de dos niveles de Van Wijngaarden. Extensiones similares existen en lingüística.

Una gramática libre de contexto extendida (o gramática regular de la parte derecha) es aquella en la que se permite que el lado derecho de las reglas de producción sea una expresión regular sobre los terminales y no terminales de la gramática. Las gramáticas libres de contexto extendidas describen exactamente los lenguajes libres de contexto.

Otra extensión es permitir que aparezcan símbolos terminales adicionales en el lado izquierdo de las reglas, restringiendo su aplicación. Esto produce el formalismo de las gramáticas sensibles al contexto.

Subclases

Hay varias subclases importantes de las gramáticas independientes del contexto:

El análisis LR amplía el análisis LL para admitir una mayor variedad de gramáticas; a su vez, el análisis LR generalizado amplía el análisis LR para admitir gramáticas libres de contexto arbitrarias. En gramáticas LL y gramáticas LR, esencialmente realiza análisis sintáctico LL y análisis sintáctico LR, respectivamente, mientras que en gramáticas no deterministas, es tan eficiente como se puede esperar. Aunque el análisis sintáctico GLR se desarrolló en la década de 1980, muchas nuevas definiciones de lenguaje y generadores de analizadores continúan basándose en el análisis sintáctico LL, LALR o LR hasta el día de hoy.

Aplicaciones lingüísticas

Chomsky inicialmente esperaba superar las limitaciones de las gramáticas independientes del contexto agregando reglas de transformación.

Tales reglas son otro dispositivo estándar en la lingüística tradicional; p.ej. pasivización en inglés. Gran parte de la gramática generativa se ha dedicado a encontrar formas de refinar los mecanismos descriptivos de la gramática de estructura sintagmática y las reglas de transformación de modo que se puedan expresar exactamente los tipos de cosas que el lenguaje natural realmente permite. Permitir transformaciones arbitrarias no cumple con ese objetivo: son demasiado poderosas y Turing es completa a menos que se agreguen restricciones significativas (por ejemplo, no hay transformaciones que introduzcan y luego reescriban símbolos sin contexto).

La posición general de Chomsky con respecto a la falta de contexto del lenguaje natural se ha mantenido desde entonces, aunque sus ejemplos específicos con respecto a la inadecuación de las gramáticas libres de contexto en términos de su débil capacidad generativa fueron posteriormente refutados. Gerald Gazdar y Geoffrey Pullum han argumentado que, a pesar de algunas construcciones no independientes del contexto en el lenguaje natural (como las dependencias entre series en el alemán suizo y la reduplicación en bambara), la gran mayoría de las formas en el lenguaje natural son, de hecho, independientes del contexto.