Was ist ein realer Anwendungsfall für die Verwendung einer Chomsky-Typ-I-Grammatik (kontextsensitiv)?


9

Ich hatte in letzter Zeit ein bisschen Spaß daran, die Entwicklung von Sprachparsern im Zusammenhang damit zu untersuchen, wie sie in die Chomsky-Hierarchie passen.

Was ist ein gutes reales (dh nicht theoretisches) Beispiel für eine kontextsensitive Grammatik?


8
Zählt die Programmiersprache?
Martin York

@LokiAstari Natürlich.
Evan Plaice

2
Ich denke, Programmiersprachen zählen, sind aber keine gute Lösung, da die Komplexität der Kontextsensitivität normalerweise durch eine kontextfreie Grammatik mit semantischer Analyse ersetzt wird.
Frank

@Frank Ich denke, mein Problem ist, dass ich nicht wirklich verstehen kann, was eine kontextsensitive Sprache ist, ohne sie auf eine reale Verwendung anzuwenden.
Evan Plaice

Es gibt einige menschliche Sprachen, für die möglicherweise keine rekursiv aufzählbaren Sprachparser erforderlich sind, und die daher in den Satz von Sprachen des Typs 1 (Kontextsensiv) fallen. cs.virginia.edu/~evans/cs3102/?p=138

Antworten:


9

Gute Frage. Obwohl, wie in den Kommentaren erwähnt, sehr viele Programmiersprachen kontextsensitiv sind, wird diese Kontextsensitivität häufig nicht in der Analysephase, sondern in späteren Phasen aufgelöst - das heißt, eine Obermenge der Sprache wird mithilfe einer kontextfreien Grammatik analysiert. und einige dieser Analysebäume werden später herausgefiltert.

Dies bedeutet jedoch nicht, dass diese Sprachen nicht kontextsensitiv sind. Hier einige Beispiele:


Mit Haskell können Sie Funktionen definieren, die als Operatoren verwendet werden, und auch die Priorität und Assoziativität dieser Operatoren definieren. Mit anderen Worten, Sie können nicht den richtigen Analysebaum für einen Operatorausdruck wie den folgenden erstellen:

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

es sei denn, Sie haben die Prioritäts- / Assoziativitätserklärungen für @@und bereits analysiert ##:

infixr 8 @@
infixr 6 ##

Ein zweites Beispiel ist Bencode , eine Datensprache , die dem Inhalt seine Länge voranstellt :

<length>:<contents>

Das Problem bei diesem Format ist, dass es so gut wie unmöglich ist, ohne etwas Kontextsensitives zu analysieren, da die einzige Möglichkeit, die "Feld" -Größen herauszufinden, darin besteht, ... die Zeichenfolge zu analysieren.


Ein drittes Beispiel ist XML, vorausgesetzt, beliebige Tag-Namen sind zulässig: Öffnende Tag-Namen müssen übereinstimmende Close-Tags haben:

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

Interessant. Ich wusste über XML Bescheid. Ich vermute, dass das Laufwerk hinter der XHTML 1.0-Spezifikation von HTML-Interpreten im "Quirks-Modus" wegführte, die kontextsensitive Ausnahmen zu einem saubereren kontextfreien XML unterstützen.
Evan Plaice

@EvanPlaice Ihr Kommentar verwirrt mich - "sauberes XML" ist kontextsensitiv, wie ich in meinem Beispiel gezeigt habe.

4
@MattFenwick Ich denke, Ihr XML-Beispiel zeigt nicht den wahren Grund, warum XML nicht kontextfrei ist. Der Grund ist, dass beliebige Tag-Namen zulässig sind. Wenn nur ein bestimmter Satz von Tags zulässig wäre, wäre XML kontextfrei.
Honza Brabec

@ HonzaBrabec Sie haben Recht - ich habe implizit angenommen, dass beliebige Tag-Namen zulässig sind. Ich hätte diese Annahme ausdrücklich angeben sollen. Vielen Dank für den Hinweis!

3

Solange ich weiß, kontextsensitive Grammatiken werden in der Verarbeitung natürlicher Sprache verwendet wird , nur . Interpreten und Compiler von Programmiersprachen versuchen aufgrund der Komplexität nicht, eine kontextfreie Grammatik zu analysieren (selbst wenn in der Vergangenheit einige Versuche unternommen wurden).

Vielleicht finden Sie in einer dieser Bibliotheken ein Beispiel für die tatsächliche Verwendung:

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
Was ist mit HTML-Quirks-Modus und Code-Präprozessoren, würden sie nicht zählen?
Evan Plaice

2

Kontextsensitive Grammatiken werden manchmal in Beschreibungen der Semantik von Programmiersprachen verwendet. Die vielleicht umfassendste Verwendung kontextsensitiver Grammatiken war die Algol68-Sprachdefinition. Es wurde ein kontextfreies Grammatikprogramm mit zwei Ebenen verwendet (siehe http://en.wikipedia.org/wiki/Two-level_grammar ), um sowohl die Syntax als auch die Semantik von Algol68-Programmen zu beschreiben.

Einige meiner Kollegen verwendeten die Van-Wijngaarden-Grammatik, um die Implementierung von Algol68 zu steuern (siehe http://en.wikipedia.org/wiki/FLACC ).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.