Dies ist eine Neuformulierung von Sind Grammatikprogramme? vorher von Vag gefragt und mit vielen Vorschlägen der Kommentatoren.
Inwiefern kann eine Grammatik als Spezifizierung eines Rechenmodells angesehen werden? Nehmen wir zum Beispiel eine einfache kontextfreie Grammatik wie
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
Unter der Annahme , dass der Parser nicht zwischen differenziert Terminal und Nicht - End - Symbole , wie ich hier gezeigt habe, dann ist es möglich , einfache Arithmetik für Zahlen bis zu 3 durchzuführen.
Nehmen Sie zum Beispiel die Zeichenfolge
"2 + 0 + 1"
Wenn Sie einen LR (1) -Parser für diesen String ausführen, erhalten Sie den folgenden konkreten Syntaxbaum, in dem das Ergebnis der Berechnung im Stammverzeichnis des Baums gespeichert wird:
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
Wenn wir also eine Grammatik als Programm und einen Parsergenerator als Compiler betrachten , können wir dann die Grammatikspezifikationssprache als Programmiersprache betrachten ?
Könnten wir außerdem Turing-complete-Programme erstellen, indem wir Grammatiken angeben , wie Sie Turing-complete-Programme mit Celullar-Automaten oder dem Lambda-Kalkül erstellen könnten ?
In anderen Worten ist es bekannt , dass im Sinne der Erkennung eine Sprache, reguläre Sprachen entsprechen endliche Automaten , kontextfreie Sprachen entsprechen Automaten nach unten drücken , und kontextsensitiven Sprachen entsprechen begrenzte Automaten linear . Wenn wir jedoch Grammatiken als Rechengeräte betrachten (dh Programme im Sinne des obigen Beispiels), wie klassifizieren wir dann die Rechenstärke jeder Grammatikklasse in der Chomsky-Hierarchie?
- Regelmäßige Grammatiken
- Kontextfreie Grammatiken
- Kontextsensitive Grammatiken
- Uneingeschränkte Grammatik (für rekursiv aufzählbare Sprachen )
Wie wäre es auch mit den weniger bekannten Unterklassen von Grammatiken wie
- Deterministische kontextfreie Grammatiken (auch LR (k) / LL (k) / SLR / LALR usw.)
- Verschachtelte Wortgrammatiken
- Baum neben Grammatiken
- Indizierte Grammatiken
EDIT: Übrigens, das ist ein Trottel zu meiner eigenen Frage, aber ich habe nicht erwähnt, dass ich kein Startsymbol für die Beispielgrammatik angegeben und bei der Notwendigkeit, zwischen Terminals und Nichtterminals zu unterscheiden, von Hand gewinkt habe. Technisch oder traditionell denke ich, dass die Grammatik wahrscheinlich in einer komplizierteren Form wie dieser geschrieben werden müsste (wobei S das Startsymbol und $ das End-of-Stream-Terminal darstellt):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
... nicht, dass es wirklich etwas ändert, aber ich dachte, ich sollte es erwähnen.
EDIT: Etwas anderes, was mir beim Lesen der Antwort von gasche in den Sinn kam, ist, dass jeder Zweig im Baum in meinem Beispiel eine Teilberechnung darstellt. Wenn Sie jede Produktionsregel als eine Funktion betrachten, bei der die LHS das Ergebnis und die RHS die Argumente darstellt, bestimmt die Struktur der Grammatik, wie Funktionen zusammengesetzt sind.
Mit anderen Worten, der Kontext des Parsers zusammen mit seinem Lookahead-Mechanismus hilft dabei, nicht nur zu bestimmen, welche Funktionen angewendet werden sollen (ein bisschen wie parametrischer Polymorphismus), sondern wie sie zusammengesetzt werden sollten, um neue Funktionen zu bilden.
Zumindest könnte man das für eindeutige CFGs so sehen, für andere Grammatiken ist mir die mentale Gymnastik im Moment ein bisschen zu viel.