Che cos'è un caso d'uso reale dell'uso di una grammatica di tipo I (sensibile al contesto) di Chomsky


9

Ultimamente mi sono divertito a esplorare lo sviluppo dei parser linguistici nel contesto di come si adattano alla Gerarchia di Chomsky.

Qual è un buon esempio nel mondo reale (cioè non teorico) di una grammatica sensibile al contesto?


8
Conta il linguaggio di programmazione?
Martin York,

@LokiAstari Certo.
Evan Plaice,

2
Immagino che i linguaggi di programmazione contino, ma non costituiscano una buona soluzione, poiché la complessità della sensibilità al contesto viene normalmente sostituita da una grammatica senza contesto con analisi semantica.
Frank,

@Frank Immagino che il mio problema sia che non riesco davvero a capire cosa siano le lingue sensibili al contesto senza applicarle ad un uso nel mondo reale.
Evan Plaice,

Esistono alcuni linguaggi umani che potrebbero non richiedere parser linguistici ricorsivamente enumerabili e quindi rientrare nel set di linguaggi di tipo 1 (sensibile al contesto). cs.virginia.edu/~evans/cs3102/?p=138

Risposte:


9

Buona domanda. Sebbene, come menzionato nei commenti, molti linguaggi di programmazione siano sensibili al contesto, la sensibilità al contesto spesso non viene risolta nella fase di analisi ma nelle fasi successive, ovvero un superset del linguaggio viene analizzato utilizzando una grammatica senza contesto, e alcuni di questi alberi di analisi vengono successivamente filtrati.

Tuttavia, ciò non significa che quelle lingue non siano sensibili al contesto , quindi ecco alcuni esempi:


Haskell consente di definire funzioni utilizzate come operatori e anche di definire la precedenza e l'associatività di tali operatori. In altre parole, non è possibile creare l'albero di analisi corretto per un'espressione operatore come:

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

a meno che tu non abbia già analizzato le dichiarazioni di precedenza / associatività per @@e ##:

infixr 8 @@
infixr 6 ##

Un secondo esempio è Bencode , un linguaggio di dati che precede il contenuto con la sua lunghezza:

<length>:<contents>

Il problema con questo formato è che è praticamente impossibile analizzare senza qualcosa sensibile al contesto, perché l'unico modo per capire le dimensioni del "campo" è ... analizzando la stringa.


Un terzo esempio è XML, supponendo che siano consentiti nomi di tag arbitrari: l'apertura dei nomi di tag deve avere tag di chiusura corrispondenti:

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

Interessante. Conoscevo XML. Sospetto che l'unità dietro le specifiche XHTML 1.0 sia stata quella di allontanare gli interpreti HTML in "modalità strane" che supportano le eccezioni sensibili al contesto a un XML più pulito e privo di contesto.
Evan Plaice,

@EvanPlaice Sono confuso dal tuo commento - "clean XML" è sensibile al contesto come ho mostrato nel mio esempio.

4
@MattFenwick Penso che il tuo esempio XML non mostri il vero motivo per cui XML non è privo di contesto. Il motivo è che sono consentiti nomi di tag arbitrari. Se fosse consentito solo un set specifico di tag, XML sarebbe privo di contesto.
Honza Brabec,

@HonzaBrabec hai ragione - ho implicitamente supposto che i nomi di tag arbitrari siano consentiti. Avrei dovuto dichiarare esplicitamente tale presupposto. Grazie per averlo sottolineato!

3

Per quanto ne so, le grammatiche sensibili al contesto vengono utilizzate solo nell'elaborazione del linguaggio naturale . Gli interpreti e i compilatori dei linguaggi di programmazione non tentano di analizzare una grammatica senza contesto a causa della complessità (anche se in passato è stato fatto qualche tentativo).

Forse, puoi trovare alcuni esempi di reale utilizzo in una di queste librerie:

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/


2
Che dire della 'modalità strane' HTML e dei preprocessori di codice, non contano?
Evan Plaice,

2

Le grammatiche sensibili al contesto vengono talvolta utilizzate nelle descrizioni della semantica del linguaggio di programmazione. Forse l'uso più completo delle grammatiche sensibili al contesto è stata la definizione della lingua Algol68. Ha usato una grammatica libera di contesto a due livelli (vedi http://en.wikipedia.org/wiki/Two-level_grammar ) per descrivere sia la sintassi che la semantica dei programmi Algol68.

Un paio di miei colleghi hanno usato la grammatica di Van Wijngaarden per dirigere la loro implementazione di Algol68 (vedi http://en.wikipedia.org/wiki/FLACC ).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.