Auf oklamyacc, Funktion Grammatik und Vorrang der Anwendung

8

Ich bin OCaml-Neuling und ich versuche, eine einfache OCaml-ähnliche Grammatik zu schreiben, und ich kann das nicht herausfinden. Meine Grammatik erlaubt so etwas:

%Vor%

Wenn ich jedoch die so definierte Funktion verwenden möchte, kann ich schreiben: (sub 7) 3 , aber ich kann nicht sub 7 3 schreiben, was mich wirklich nervt. Aus irgendeinem Grund wird es so interpretiert, als ob ich sub (7 3) geschrieben hätte (was 7 als Funktion mit dem Argument 3 behandeln würde). Die relevanten Abschnitte sind:

%Vor%

Danke!

    
Amadan 17.05.2010, 07:53
quelle

3 Antworten

5

Der OCAML-Compiler funktioniert wie folgt: (aus ocaml/parsing/parser.mly )

%Vor%

Dabei ist simple_expr eine Teilmenge der möglichen Ausdruckswerte, die ohne Klammern zu einer Funktion ausgewertet werden können. Dies schließt aus, dass alle Nicht-selbst-geklammerten Konstrukte inline mit einem Funktionsaufruf verwendet werden. Es verdeutlicht auch die Assoziativität der Teilausdrücke, da der zweite Teilausdruck explizit eine Liste ist.

Warum Ihr Versuch, %left APPLY zu verwenden, um die korrekte Assoziativität zu erhalten, funktioniert nicht, aus den Kommentaren in ocaml's parser.mly:

%Vor%

Ich würde sagen, das bedeutet, dass Sie% prec nicht für Assoziativität ohne Operator verwenden können. Versuchen Sie, die gewünschte Assoziativität zu erstellen, indem Sie weitere Regeln definieren und sehen, wo das führt.

    
Thelema 23.05.2010, 22:44
quelle
9

Falls Sie zu dieser Frage kamen und dachten, Sie hätten diesen Moment endlich erreicht, als Sie genau das finden, wonach Sie suchen, dann waren Sie enttäuscht, hier ist eine ausführlichere Antwort:

Sie können% prec nicht für den Grund verwenden, den Thelema erwähnt hat. Daher müssen Sie die Assoziativität beim Erstellen eines rekursiven Regelsatzes definieren.

Hier ist ein vereinfachter Parser.

%Vor%

Das rekursive Umgehen dient eigentlich dazu, den Fall zu erfassen, in dem wir uns mit dieser Frage befassen, aber es ist leicht zu sehen, wie es auch für die übrigen Ausdrücke auf die Assoziativität angewendet werden kann.

Der Kern dieses Ansatzes besteht darin, zu versuchen, das fragliche Muster mit den im Anfangsfall (exp) definierten Mustern in Übereinstimmung zu bringen, und Sie hinterlassen einen Aufruf an den unmittelbar nachfolgenden Fall (exp2) als ein Sammelmuster, wenn Sie Muster passt zu keiner vorher; Fortsetzung mit diesem Ansatz, bis das Muster schließlich übereinstimmt. Dies bedeutet, dass das Muster mit der höchsten Priorität im weitesten Fall existiert - in diesem Beispiel exp8.

In diesem Beispiel ist der Fall für Apply (Funktionsanwendung) in exp7. Dies liegt daran, dass Apply in diesem Beispiel die höchste Assoziativität eines Musters aufweist. Der Grund dafür, dass es keine Priorität gegenüber den Fällen in exp8 hat, liegt darin, dass die Auswertung auf weitere Aufrufe von Ausdrucksfällen und nicht auf Aufrufe von Werten angewendet wird. Wenn exp8 nicht existieren würde, hätten wir einen unendlichen Blick auf unsere Hände.

In der hypothetischen simple.ml ist die Funktion Application als Ausdruck der folgenden Eigenschaft definiert: Apply of expr * expr. Und da Apply links-rekursiv ist, bewerten wir den rechten Ausdruck (exp8) und rekursiv auf der linken Seite (exp7).

    
anxiety 12.02.2011 10:06
quelle
0

Man kann auch solche Dinge verwenden, um zu vermeiden, dass man die Ausdrücke in so viele Ebenen zerlegt:

%Vor%     
Katrina 01.11.2011 03:45
quelle

Tags und Links