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?
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?
Risposte:
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" -->
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
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 ).