Ich versuche, kontextsensitive Grammatiken zu verstehen.
Ich verstehe, warum Sprachen mögen
sind nicht kontextfrei, aber was würde ich gerne wissen, wenn eine Sprache, die der untypisierten Lambda-Rechnung ähnelt, kontextsensitiv ist?
Ich würde gerne ein Beispiel für ein einfaches, aber nicht-spielerisches Element sehen (ich betrachte die obigen spielerischen Beispiele), ein Beispiel für eine kontextsensitive Grammatik, die für einige Produktionsregeln, z befindet sich derzeit im Geltungsbereich (z. B. beim Erstellen des Hauptteils einer Funktion).
Sind kontextsensitive Grammatiken leistungsfähig genug, um undefinierte / nicht deklarierte / ungebundene Variablen zu einem syntaktischen (und nicht zu einem semantischen) Fehler zu machen?
Antworten:
Ja, ich würde dies für möglich halten, aber nein, ich bin nicht bereit, diese kontextsensitive Grammatik explizit zu konstruieren. Ich werde meine Antwort erklären, indem ich die Frage in zwei Teile aufteile.
(1) Was wäre das Nichtspielzeugbeispiel? Es sollte die Deklaration von Variablen widerspiegeln. Mein Vorschlag für eine solche Sprache, die von der realen Programmierung abstrahiert ist, wäre ungefähr so. Das Alphabet ist . { w 1 ; w 2 ; … ; w n ( x 1 ; x 2 ; … ; x m ) ∣ w i , x j ∈ { a , b{a,b,;,(,)}
Diese Sprache ist kontextsensitiv.
(2) Um es zu zeigen , tatsächlich ist kontextsensitive ich einen anderen Formalismus verwenden würde. Das einer Turingmaschine mit linearer Verwendung ihres Bandes: ein linear begrenzter Automat LBA. Ich kann es so programmieren, dass es das Pattern Matching ausführt. Ich würde jedes nacheinander betrachten und versuchen, es Buchstabe für Buchstabe mit einem richtigen w j abzugleichen. LBAs entsprechen kontextsensitiven Grammatiken, sind jedoch viel einfacher zu programmieren.xj wj
quelle
Viele andere NP-harte Sprachen sind aus demselben Grund auch in CSL enthalten, wie z. B. CLIQUE.
Es gibt auch ziemlich natürliche Sprachen in CSL, die noch schwieriger sind.
Mir ist jedoch keine Möglichkeit bekannt, eine beliebige CSL als kontextsensitive Grammatik (CSG) auszudrücken, außer Landwebers Konstruktion in Satz 3 seines Aufsatzes zu verwenden. In dieser Konstruktion beschreibt die CSG die Umkehrung der Funktionsweise des linear begrenzten Automaten, der die CSL erkennt. Produktionen des CSG beschreiben, wie ein bestimmter Zustand der Maschine aus einer möglichen Bewegung resultiert. Eine solche CSG ist eine einfache Übersetzung des Automaten in eine Grammatik. Sie entspricht also nicht unbedingt Sprachmerkmalen wie der Möglichkeit, Variablen zu deklarieren, sondern wird durch die Details des Automaten blockiert.
Wenn Sie eher auf einer CSG als auf einer CSL bestehen und Ihre eigentliche Frage darin besteht, eine CSG für eine Sprache mit eingeschränktem Variablenumfang anzeigen zu wollen, ist die Antwort von Hendrik Jan anscheinend ein guter Anfang.
quelle
Ja, kontextsensitive Grammatiken (CSG) sind leistungsfähig genug, um undefinierte / nicht deklarierte / ungebundene Variablen zu überprüfen, aber leider kennen wir keinen effizienten Algorithmus zum Parsen von CSG-Zeichenfolgen.
Ein echtes Beispiel für eine kontextsensitive Sprache ist die Programmiersprache C. Eine Funktion wie zuerst Variablen deklarieren und später verwenden macht C-Sprache zu einer kontextsensitiven Sprache (CSL). ( Ich weiß nicht über untypisierte Lambda-Kalkül ).
Und weil wir keinen linearen Parsing-Algorithmus für CSL (oder CSG) kennen. Aus diesem Grund verwenden wir im Compiler-Design nur CFG (und dessen Parsing-Algorithmus) für die Syntaxprüfung, da wir effiziente Algorithmen zum Parsen von CFG kennen (wenn es in eingeschränkter Form vorliegt). Compiler analysieren zuerst ein kontextfreies Feature und behandeln dann später kontextsensitive Features auf problematische Weise (überprüfen Sie beispielsweise alle verwendeten Variablen in der Symboltabelle, falls sie definiert sind. Andernfalls wird ein Fehler generiert).
Auch die kontextsensitive Grammatik wird in der Verarbeitung natürlicher Sprache (NLP) verwendet. Und die meisten natürlichen Sprachen sind Beispiele für kontextsensitive Sprachen. (Ich bin nicht sicher für die Sanskrit- Sprache).
Ich werde versuchen, es mit einem albernen, aber einfachen Beispiel zu erklären (es ist nur eine Idee, Sie können es verfeinern):
Mit dieser Grammatik können wir nun einige korrekte Aussagen erzeugen, aber einige sind auch falsch. Beispielsweise,
Aber
Grund: Der Wert von <TENSE> hängt (zum Beispiel
I <TENNSE> --> I am
) vom Wert <NOUN> ab, und daher generiert die Grammatik keine korrekten Aussagen in der englischen Sprache.Eigentlich können wir keine kontextfreie Grammatik für komplettes Englisch schreiben!
Möglicherweise haben Sie bemerkt, dass ein Übersetzer oder eine Grammatikprüfung für natürliche Sprachen nicht ordnungsgemäß funktioniert (versuchen Sie es mit langen Anweisungen). Weil dieses Problem unter den kontextsensitiven Parsing-Algorithmus fällt.
VERWEIS : Sie können die Vorträge von Dr. Arun Kumar ansehen . In einem Vortrag erklärt er genau, woran Sie interessiert sind.
quelle
(Kommentare in Antwort erweitern)
Ich bin mir sowieso nicht sicher, ob dies ein Beispiel ist, das Sie gerne hätten.
Fast alle realen Programmiersprachen sind kontextsensitiv (im allgemeinen Sinne, conflating dh sowohl Chomsky Typ 0 und Typ-I - Grammatiken unter „kontextsensitive“, das stimmt natürlich ist seit uneingeschränkte Grammatiken sind noch kontextsensitiver als Kontext -sensitive Grammatiken).
Zum Beispiel "Variablen müssen deklariert werden, bevor sie verwendet werden", "Bezeichner müssen eindeutig sein", alle diese benötigen Kontext (manchmal als semantischer Kontext bezeichnet, was jedoch irreführend sein kann, da es sich ohnehin um syntaktische Funktionen handelt), siehe zum Beispiel https: // www .cs.purdue.edu / homes / hosking / 502 / notes / 04-semantics.pdf
Das Gefühl, dass die obigen Beispiele kontextsensitiv sind (sowohl im grammatikalischen / syntaktischen als auch im semantischen Sinne), besteht darin, dass sie über ihren Kontext sprechen (was vorhergeht oder danach kommt).
Eine "bereits definierte Variable" ist über den Kontext vor einer Variablenverwendung zu verstehen . Ein "eindeutiger Bezeichner" ist der Kontext zu dem, was vor oder nach einer Bezeichnerdeklaration steht, und so weiter.
Siehe auch Ist JavaScript eine kontextfreie Sprache? auf SO
quelle