¿Cuál es un caso de uso en el mundo real de usar una gramática Chomsky Tipo I (sensible al contexto)

9

Últimamente me he divertido un poco explorando el desarrollo de analizadores de lenguaje en el contexto de cómo encajan en la Jerarquía de Chomsky.

¿Cuál es un buen ejemplo del mundo real (es decir, no teórico) de una gramática sensible al contexto?

Evan Plaice
fuente
8
¿Cuenta el lenguaje de programación?
Martin York
@LokiAstari Por supuesto.
Evan Plaice
2
Supongo que los lenguajes de programación cuentan, pero no constituyen una buena solución, ya que la complejidad de la sensibilidad al contexto normalmente se reemplaza por una gramática libre de contexto con análisis semántico.
Frank
@Frank Supongo que mi problema es que realmente no puedo entender qué son los lenguajes sensibles al contexto sin aplicarlo a un uso real.
Evan Plaice
Hay algunos idiomas humanos que pueden no requerir analizadores de lenguaje enumerables recursivamente y, por lo tanto, caen en el conjunto de idiomas tipo 1 (sensible al contexto). cs.virginia.edu/~evans/cs3102/?p=138

Respuestas:

9

Buena pregunta. Aunque como se menciona en los comentarios, muchos lenguajes de programación son sensibles al contexto, esa sensibilidad al contexto a menudo no se resuelve en la fase de análisis sino en fases posteriores, es decir, un superconjunto del lenguaje se analiza utilizando una gramática libre de contexto, y algunos de esos árboles de análisis luego se filtran

Sin embargo, eso no significa que esos idiomas no sean sensibles al contexto , así que aquí hay algunos ejemplos:


Haskell le permite definir funciones que se utilizan como operadores, y también definir la precedencia y asociatividad de esos operadores. En otras palabras, no puede construir el árbol de análisis correcto para una expresión de operador como:

a @@ b @@ c ## d ## e

a menos que ya haya analizado las declaraciones de precedencia / asociatividad para @@y ##:

infixr 8 @@
infixr 6 ##

Un segundo ejemplo es Bencode , un lenguaje de datos que antepone el contenido con su longitud:

<length>:<contents>

El problema con este formato es que es prácticamente imposible analizar sin algo sensible al contexto, porque la única forma de averiguar los tamaños de "campo" es ... analizando la cadena.


Un tercer ejemplo es XML, suponiendo que se permitan nombres de etiquetas arbitrarios: los nombres de etiquetas de apertura deben tener etiquetas de cierre coincidentes:

<hi>
 <bye>
 the closing tag has to match bye
 </bye>
</hi> <!-- has to match "hi" -->

fuente
Interesante. Sabía sobre XML. Sospecho que la unidad detrás de la especificación XHTML 1.0 debía alejarse de los intérpretes HTML de 'modo peculiar' que admiten excepciones sensibles al contexto a un XML sin contexto más limpio.
Evan Plaice
@EvanPlaice Estoy confundido por su comentario: "XML limpio" es sensible al contexto, como lo he mostrado en mi ejemplo.
44
@MattFenwick Creo que su ejemplo XML no muestra la verdadera razón por la cual XML no está libre de contexto. La razón es que se permiten nombres de etiquetas arbitrarios. Si solo se permitiera un conjunto específico de etiquetas, XML estaría libre de contexto.
Honza Brabec
@HonzaBrabec tienes razón: supongo implícitamente que se permiten nombres de etiquetas arbitrarios. Debería haber declarado explícitamente esa suposición. ¡Gracias por señalar eso!
3

Mientras que sé, gramáticas sensibles al contexto se utilizan en el procesamiento del lenguaje natural, única . Los intérpretes y compiladores de lenguajes de programación no intentan analizar una gramática sin contexto debido a la complejidad (incluso si se ha hecho algún intento en el pasado).

Tal vez, puede encontrar algún ejemplo de uso real en una de estas bibliotecas:

http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits

http://opennlp.sourceforge.net/projects.html

http://nltk.org/

http://nlp.stanford.edu/nlp/javadoc/javanlp/

AlexBottoni
fuente
2
¿Qué pasa con el 'modo peculiar' de HTML y los preprocesadores de código, no contarían?
Evan Plaice
2

Las gramáticas sensibles al contexto a veces se usan en las descripciones de la semántica del lenguaje de programación. Quizás el uso más completo de las gramáticas sensibles al contexto fue la definición del lenguaje Algol68. Se utilizó una gramática libre de contexto de dos niveles (ver http://en.wikipedia.org/wiki/Two-level_grammar ) para describir tanto la sintaxis como la semántica de los programas Algol68.

Un par de mis colegas utilizaron la gramática de Van Wijngaarden para dirigir su implementación de Algol68 (ver http://en.wikipedia.org/wiki/FLACC ).

BobDalgleish
fuente