Verwenden von externen Typdeklarationen mit OCamlyacc

8

Ich habe einen Typ expr in einer expr.ml Datei. In parser.mly (OCamlyacc-Datei) definiere ich die expr-Regel und gebe den Typ:

%Vor%

Allerdings bekomme ich:

%Vor%

Ich habe versucht,

hinzuzufügen %Vor%

am Anfang der .mly-Datei, aber es funktioniert immer noch nicht. Wie kann ich diesen Ausdruckstyp in einer externen Datei definieren und als Rückgabewert meiner Regel verwenden? Danke.

    
rochem 15.06.2011, 15:01
quelle

3 Antworten

9

Sie müssen expr type mit dem Modulnamen qualifizieren. Das heißt, wenn es in expression.ml (mit type expr = ... ) definiert ist, sollten Sie

verwenden %Vor%

Beachten Sie das Kapital E , wenn Sie den Modulnamen verwenden.

    
nimrodm 15.06.2011, 17:07
quelle
2

Ich bin mir nicht sicher, ob ich das richtig verstehe.

Aber Sie kämpfen mit einer zirkulären Abhängigkeit? Nehmen wir an, T enthält Ihren Typ und ruft den Parser P auf. P kann den Typ T.t nicht erzeugen, da T von P abhängt, nicht umgekehrt. Normalerweise habe ich eine dritte Datei erstellt, die die Typinformation T' enthält.

Zum Beispiel

T.ml

%Vor%

P.mly

%Vor%

T'.ml

%Vor%     
nlucaroni 15.06.2011 15:28
quelle
1

In Ocamlyacc können Sie keinen Text angeben, der in der Datei interface ( .mli ) generiert werden soll. Wo immer Sie einen Typ angeben, der in die Schnittstelle eingeht (der Typ eines Tokens oder einer Regel), müssen Sie einen vollständig qualifizierten Typ verwenden.

Hier sieht es so aus, als könnten Sie einen vollständig qualifizierten Typ verwenden, aber manchmal ist das nicht möglich, weil der Typ eine Funktor-Anwendung enthält. Es gibt mehrere Problemumgehungen:

  • Ordnen Sie alle Funktoren in einer separaten Kompilierungseinheit an. Dies ist einfach, funktioniert jedoch z. wenn die Funktoren den Tokentyp einschließen.
  • Führen Sie eine Nachbearbeitung der von ocamlyacc generierten .mli -Datei durch, um eine Kopfzeile hinzuzufügen. Du kannst so ziemlich alles machen, aber es ist hässlich und nervig.
  • Verwenden Sie Menhir , einen verbesserten Ersatz von Ocamlyacc. Es ist eine zusätzliche Abhängigkeit, aber es löst die Hauptmängel von Ocamlyacc.
Gilles 16.06.2011 13:25
quelle