Welche realen Computersprachen können nicht durch deterministische Grammatiken beschrieben werden?

7

Gibt es Beispiele für reale Computersprachen, die nicht deterministisch sind?

Unter Computersprachen verstehe ich Programmiersprachen, Markup-Sprachen, Abfragesprachen, Modellierungssprachen, Transformationssprachen usw.

Mit nicht deterministisch meine ich, dass sie nicht mit deterministischen Grammatiken analysiert werden können.

Max
quelle
Nitpick: Grammatiken analysieren keine Sprachen. Antwort: berühmt, Perl kann nicht analysiert werden überhaupt .
Raphael
Ich denke, es gibt hier eine anständige Frage, aber tatsächlich gibt es nicht wirklich ein Konzept von "nichtdeterministischen Grammatiken" afaik. wie würde es definiert werden? Es gibt nichtdeterministische Automaten, die mit mehreren Definitionen von Grammatiken usw. korrelieren. Auch diese Frage scheint für RLs und CFLs sehr unterschiedlich zu sein . Beachten Sie, dass es eine Möglichkeit gibt, aus einem NFA (Standardalgorithmus) einen äquivalenten DFA zu erstellen. Dies ist also schwierig. Vielleicht möchten Sie eine CFL-Theorie studieren, um dies besser / genauer zu formulieren ...
vzn
Uhhh .. das sollte wohl "nichtdeterministische Pushdown-Automaten" lauten. Aber die Frage ist ziemlich bedeutungslos, es hängt alles davon ab, welche Art von Analyse Sie von der Analyse erwarten. Das Erkennen, dass alle Variablen vor der Verwendung deklariert werden, ist beispielsweise nicht kontextfrei.
Reinierpost

Antworten:

4

Ja. Viele moderne Programmiersprachen haben diese Eigenschaft, einschließlich Algol 60, C und C ++; siehe unten für Details.


Algol 60 hatte bekanntlich das Problem "Dangling else" . Bei einigen Programmen war es nicht eindeutig, wie sie analysiert werden sollten (welcher Analysebaum sollte das Ergebnis sein).

Viele moderne Sprachen lösen dieses Problem, indem sie eine Grammatik auswählen, die die Mehrdeutigkeit auf bestimmte Weise auflöst. Dies erfordert jedoch eine sorgfältige Erstellung der Grammatik, um Mehrdeutigkeiten zu beseitigen. Oft führt die natürlichste Art, die Grammatik zu schreiben, zu einer mehrdeutigen Grammatik, und Sie müssen die Grammatik transformieren, um die Mehrdeutigkeit zu vermeiden.

Ein anderer Ansatz ist die Verwendung eines GLR-Parsers, der diese Grammatiken verarbeiten kann. Anschließend können Sie zur Laufzeit prüfen, ob mehrere mögliche Parser vorhanden sind, und die Mehrdeutigkeit beheben.


Ein weiteres klassisches Beispiel sind die Programmiersprachen C und C ++. Die Referenzgrammatik für C ist nicht kontextfrei, denn wenn Sie einen Namen sehen, müssen Sie wissen, ob es sich um den Namen eines Typs oder einer Variablen handelt, um zu wissen, wie die Anweisung analysiert wird. Betrachten Sie zum Beispiel den Ausdruck

(A)*B

Wenn Aes sich um eine Variable handelt, ist dies die Multiplikation zweier Variablen und entspricht A*B. Wenn Aes sich jedoch um den Namen eines Typs handelt, handelt es sich um eine Zeiger-Dereferenzierung und Typumwandlung (ebenso Bwie ein Variablenname, der einen Zeigertyp enthält), der äquivalent zu ist (A) *B.

Ähnlich,

A*B;

ADies kann entweder eine Variablendeklaration sein (wenn der Name eines Typs ist, deklariert dies eine Variable mit dem Namen, Bderen Typ Zeiger auf ist A) oder eine Multiplikation (wenn Aund Bsind die Namen von Variablen).

Compiler beheben dies normalerweise, indem sie zusätzlichen Code einfügen, der außerhalb der Sprache reiner kontextfreier Grammatiken liegt. Sie verfolgen alle Variablennamen und Typnamen im Gültigkeitsbereich und verwenden diese, um das Parsen bei dieser Mehrdeutigkeit zu steuern. Siehe den Lexer Hack .


Siehe auch LL und LR im Kontext: Warum Parsing-Tools schwierig sind und Bisons Handbuchseiten in seinem GLR-Parser (der eine Diskussion eines anderen mehrdeutigen Falls in der C ++ - Grammatik enthält).


Schließlich: Ich denke, die Frage hat einige Verwirrung über den Unterschied zwischen Mehrdeutigkeit und Nichtdeterminismus. Automaten und Sprachen können deterministisch / nicht deterministisch sein, aber keine Grammatiken. Grammatiken und Sprachen können mehrdeutig / eindeutig sein. Siehe Gibt es inhärent mehrdeutige und deterministische kontextfreie Sprachen? und grammatische Charakterisierung von deterministisch kontextfreien Sprachen und wenn ein Parser kann eine nicht-deterministische Grammatik analysieren, ist der Parser nicht-deterministisch ? . Die obigen Beispiele qualifizieren sich tatsächlich sowohl als mehrdeutige Grammatiken als auch als nicht deterministische Sprachen.

DW
quelle
1
Dies scheint einer Antwort nahe zu sein, aber Mehrdeutigkeit in Sprachen / CFLs ist nicht dasselbe wie Nichtdeterminismus ....
vzn