¿Alguien puede dar un ejemplo simple pero no juguetón de una gramática sensible al contexto?

12

Estoy tratando de entender las gramáticas sensibles al contexto.

Entiendo por qué a los idiomas les gusta

  1. {wwwA}
  2. {anbncnnN}

no están libres de contexto, pero me gustaría saber si un lenguaje similar al cálculo lambda sin tipo es sensible al contexto.

Me gustaría ver un ejemplo de un simple, pero no juguete (considero los ejemplos de juguetes anteriores), ejemplo de una gramática sensible al contexto que puede, por alguna regla de producción, por ejemplo, decir si una cadena de símbolos está en el alcance actualmente (por ejemplo, cuando se produce el cuerpo de una función).

¿Son las gramáticas sensibles al contexto lo suficientemente potentes como para hacer que las variables indefinidas / no declaradas / no vinculadas sean un error sintáctico (en lugar de semántico)?

BlueBomber
fuente
1
casi todos los lenguajes de programación reales son sensibles al contexto (en el sentido general, es decir, combinan las gramáticas de tipo 0 y tipo I chomsky en "sensible al contexto"). Por ejemplo, las variables deben declararse antes de usarse, los identificadores deben ser únicos; todos estos requieren contexto (referido como contexto semántico, pero puede ser engañoso) cs.purdue.edu/homes/hosking/502/notes/04-semantics.pdf
Nikos M .
Bueno, "sensible al contexto" es el término estándar para las gramáticas de tipo 1.
reinierpost

Respuestas:

8

Sí, creo que esto es posible, pero no, no estoy dispuesto a construir explícitamente esa gramática sensible al contexto. Explicaré mi respuesta, dividiendo la pregunta en dos partes diferentes.

(1) ¿Cuál sería el ejemplo de no juguete? Debe reflejar la declaración de variables. Mi propuesta de dicho lenguaje, abstraída de la programación real, sería algo como esto. El alfabeto es . { w 1 ; w 2 ; ... ; w n ( x 1 ; x 2 ; ; x m ) w i , x j{ a , b{a,b,;,(,)} Ese lenguaje es sensible al contexto.

{w1;w2;;wn(x1;x2;;xm)wi,xj{a,b}, each xj is equal to some wi}

(2) Para mostrar que en realidad es sensible al contexto, usaría otro formalismo. El de una máquina de Turing con uso lineal de su cinta: un autómata lineal acotado LBA. Puedo programarlo para que coincida con el patrón / Consideraría consecutivamente cada y trataría de emparejarlo con una w j adecuada , letra por letra. Los LBA son equivalentes a las gramáticas sensibles al contexto, pero mucho más fáciles de programar.xjwj

Hendrik Jan
fuente
Gracias por el post. Ahora estoy menos familiarizado con los LBA, así que estoy menos convencido con el punto (2). A partir del punto (1), estoy tratando de ver cómo construir reglas que produzcan, donde se espera un nombre de variable como expresión, solo una de las variables en el alcance actual. No necesito ver un CSG completo y formal, pero solo una explicación informal funcionaría. No puedo imaginar cómo hacerlo con nombres de variables de símbolos múltiples, que es un uso diferente del contexto que, por ejemplo, usar un contexto único no terminal para dirigir la concordancia de número de sujeto-verbo en una derivación de oración en inglés.
{www}
{ww|w...}
3
{ww}LRLwRwLaMawMabbMaRMaRRa
13

[n]

Muchos otros lenguajes NP-hard también están en CSL por la misma razón, como CLIQUE.

También hay lenguajes bastante naturales en CSL que son aún más difíciles.

Sin embargo, no conozco ninguna forma de expresar un CSL arbitrario como una gramática sensible al contexto (CSG), que no sea utilizar la construcción de Landweber en el Teorema 3 de su artículo. En esta construcción, el CSG describe el reverso del funcionamiento del autómata lineal que reconoce el CSL. Las producciones del CSG describen cómo un estado particular de la máquina resulta de un posible movimiento. Tal CSG es una traducción directa del autómata a una gramática, por lo que no necesariamente se corresponderá con las características del lenguaje, como ser capaz de declarar variables, sino que se verá empantanado por los detalles del autómata.

Si insiste en un CSG en lugar de un CSL, y si su pregunta real es específicamente sobre el deseo de ver un CSG para un lenguaje que implica un alcance variable restringido, entonces la respuesta de Hendrik Jan parece ser un buen comienzo.

András Salamon
fuente
9

Sí, las gramáticas sensibles al contexto (CSG) son lo suficientemente potentes como para hacer una verificación de variables indefinidas / no declaradas / no vinculadas, pero desafortunadamente no conocemos ningún algoritmo eficiente para analizar cadenas de CSG.

Un ejemplo real de un lenguaje sensible al contexto es el lenguaje de programación C. Una característica como declarar variables primero y luego usarlas luego hace que el lenguaje C sea un lenguaje sensible al contexto (CSL). ( No sé sobre cálculo lambda sin tipo ).

Y porque no conocemos ningún algoritmo de análisis lineal para CSL (o CSG). Esa es la razón en el diseño del compilador, usamos CFG (y solo su algoritmo de análisis) para la verificación de sintaxis ya que conocemos algoritmos eficientes para analizar CFG (si está en forma restringida). Los compiladores primero analizan una característica libre de contexto y luego manejan características sensibles al contexto de una manera problemática (por ejemplo, verifica cualquier variable usada en la tabla de símbolos si está definida. De lo contrario, genera un error).

También se utiliza la gramática sensible al contexto en el procesamiento del lenguaje natural (PNL). Y la mayoría de los lenguajes naturales son ejemplos de lenguajes sensibles al contexto. (No estoy seguro del idioma sánscrito ).

Trataré de explicarlo con un ejemplo tonto pero simple (es solo una idea, puedes refinarlo):

NOUN     -->  { BlueBomber, Grijesh, I, We}
TENSE    -->  { am, was, is, were}
VERB     -->  { going, eating, working}

SENTENCE --> <NOUN> <TENSE> <VERB>

Ahora, usando esta gramática, podemos generar algunas declaraciones correctas, pero algunas también están equivocadas. Por ejemplo,

SENTENCE --> <NOUN>   <TENSE>   <VERB>
             Grijesh    is       working       [Correct statement]

Pero

             Grijesh    am       working       [wrong statement]

Motivo: el valor de <TENSE> depende del valor <NOUN> (por ejemplo, I &lt;TENNSE> --> I am) y, por lo tanto, la gramática no genera declaraciones correctas en el idioma inglés.

¡En realidad no podemos escribir una gramática sin contexto para un inglés completo!

Es posible que haya notado que cualquier traductor de lenguaje natural o corrector gramatical no funciona correctamente (intente con declaraciones largas). Porque este problema viene bajo el algoritmo de análisis sensible al contexto.


REFERENCIA : Puedes ver las conferencias del Dr. Arun Kumar . En alguna conferencia, explica exactamente lo que le interesa.

Grijesh Chauhan
fuente
Gracias por la información, sin duda será útil para otras personas interesadas en este mismo tema, pero solo está parcialmente relacionado con lo que quisiera preguntar. No me preocupo por analizar una cadena generada por un CSG, sino por ver un ejemplo simple, incluso tonto, de un CSG formal que genera abstracciones bien formadas (sin variables no unidas dentro del cuerpo de la función). Puedo imaginar un CSG para generar cadenas "inglesas" correctas, ya que un solo símbolo puede dirigir la concordancia sujeto / verbo, pero con las abstracciones, las variables generalmente están compuestas de múltiples símbolos.
1
@BlueBomber: gracias, seguro que te responderé, es noche en India ... ¡Feliz año nuevo! :)
Grijesh Chauhan
Parece que solo puedo hacerlo un número limitado de veces, y de acuerdo con (esto) [ meta.scicomp.stackexchange.com/questions/156/… , debería eliminar esta pregunta y volver a publicarla en el lugar más apropiado ...
@BlueBomber que marqué para cambiar, también puedes hacerlo.
Grijesh Chauhan
1

(extendiendo los comentarios a la respuesta)

No estoy seguro de que este sea un ejemplo que le gustaría, de todos modos.

Casi todos los lenguajes de programación reales son sensibles al contexto (en el sentido general, es decir, combinando las gramáticas Chomsky tipo 0 y tipo I con "contextual", lo cual es cierto, por supuesto, ya que las gramáticas no restringidas son aún más sensibles al contexto que el contexto gramáticas sensibles ).

Por ejemplo, "las variables deben declararse antes de usarse", "los identificadores deben ser únicos", todos estos requieren contexto (a veces referido como contexto semántico, pero eso puede ser engañoso, ya que de todos modos involucra características sintácticas) vea por ejemplo https: // www .cs.purdue.edu / homes / hosking / 502 / notes / 04-semantics.pdf

La sensación de que los ejemplos anteriores son sensibles al contexto (en el sentido gramatical / sintáctico y semántico) se debe a que hablan sobre su contexto (lo que precede o viene después).

Una "variable ya definida", es sobre el contexto anterior , un uso variable. Un "identificador único", es el contexto de lo que precedió o viene después de una declaración de identificador, y así sucesivamente.

ver también ¿Es JavaScript un lenguaje sin contexto? en lo

Nikos M.
fuente
"Sensible al contexto" significa tipo-1.
reinierpost