Ich möchte in der Lage sein, die AST für ein bestimmtes OCaml-Programm zu bekommen (ich möchte die AST gehen und eine instrumentierte Version des Codes erzeugen oder eine Art Transformation durchführen, zum Beispiel). Unterstützt eines der OCaml-Tools diese Funktionalität?Ist es möglich, den AST für ein OCaml-Programm zu bekommen?
Antwort
camlp4 ist ein Weg zu gehen. Hier ist ein motivating example. Die Dokumente sind spärlich - wahr, aber man kann sich durch das Wiki, existierende Beispiele, tutorials und vielleicht sogar durch camlp4 Quellen hindurchlesen.
Was Sie suchen, ist [Camlp4] [1]. Ich habe Camlp4 vorher noch nicht benutzt, daher kann ich seine Tugenden als Software nicht bestätigen. Ich habe von Leuten gehört, die camlp5 [http://pauillac.inria.fr/~ddr/camlp5/] verwenden, das nach Wikipedia eine bessere Dokumentation hat als die aktuelle Version von camlp4.
Ich dachte camlp4 wurde verwendet, um die OCaml-Syntax zu modifizieren und anzupassen, aber ich nehme an, es macht Sinn, dass es irgendwie zum AST kommen kann. – aneccodeal
Seit OCaml 4.02.1 ist es möglich, die PPX tools written bu Alain Frisch zu verwenden, um genau dies zu tun. Beispiel:
% ocamlfind ppx_tools/dumpast -e "1 + 2"
1 + 2
==>
{pexp_desc =
Pexp_apply ({pexp_desc = Pexp_ident {txt = Lident "+"}},
[("", {pexp_desc = Pexp_constant (Const_int 1)});
("", {pexp_desc = Pexp_constant (Const_int 2)})])}
=========
Es ist möglich, dieses Programm zu verwenden, um den AST einer normalen Code-Datei als auch abzuladen, und verschiedene Optionen steuern den Grad der Genauigkeit der Halde. Im obigen Beispiel sind beispielsweise die Standortparameter des AST ausgeblendet.
Sie können compiler-libs
verwenden, um dies zu erreichen. Siehe Parsetree
, Asttypes
und Ast_helper
.
- 1. Ist es möglich, ein Thread-Objekt für den Haupt-Thread und `Join()` damit zu bekommen?
- 2. Ist es möglich, eine defekte Deflate aus java.util.zip.Deflater zu bekommen?
- 3. Ist es möglich, eine Sammlung von verschiedenen Modelltypen für ein Modell mit eloquent zu bekommen?
- 4. Ist es möglich, Raw-Dateien bei BitBucket zu bekommen?
- 5. Ist es möglich, SQL LINK-Lecks mit LINQ zu bekommen?
- 6. ist es möglich, Mipmap Bild nach ID zu bekommen?
- 7. Ist es möglich, ein Pseudozufall zu teilen
- 8. Ist es möglich den GC für Delegierte zu vermeiden?
- 9. Es ist möglich, dateTime von Datenbank zu bekommen?
- 10. Volltextsuche in Neo4j, ist es möglich, die Punktzahl zu bekommen?
- 11. Ist es möglich, ein Einlaufen zu erkennen?
- 12. Ist es möglich, die Favoritenliste aus dem Browser zu bekommen?
- 13. Ist es möglich, Widget-Einstellungen in Tkinter zu bekommen?
- 14. Ist es möglich, Festplattengröße mit PHP oder Java zu bekommen?
- 15. ist es möglich, Daten von Png mit Fopen zu bekommen?
- 16. Ist es möglich, "alles" von javax.naming.InitialContext zu bekommen?
- 17. Ist es möglich, Kommentare mit Makro zu bekommen?
- 18. Ist es möglich, ein Icon zu verschieben?
- 19. Ist es möglich, den Typ eines Typ-Konstruktors in Haskell zu bekommen?
- 20. Ist es möglich, den aktuellen Höhenversatz innerhalb des div zu bekommen?
- 21. Ist es möglich, ein zwischengespeichertes Bild bei Appcelerator zu entfernen?
- 22. Es ist möglich, ein intPtr von einem int [] Array zu bekommen?
- 23. Ist es möglich zu erkennen, wenn ein Benutzer Tabs wechselt?
- 24. Ist es möglich, den Spaltenkopftext in extjs 4 zu erhalten?
- 25. Ist es möglich zu überprüfen, ob ein Gerät jailbroken ist?
- 26. In weniger, ist es möglich, Bild Dimension aus den Bitmap-Dateien zu bekommen?
- 27. Ist es möglich, absichtlich ein Programm Thrash zu machen?
- 28. ZendFramework2: Ist es möglich, global.php config in ein Modell ohne serviceLocator zu bekommen?
- 29. Ist es möglich, den Fremdschlüssel für ein neues Objekt in Entity Framework bereitwillig zu laden?
- 30. CSS: Ist es möglich, ein Div 100% Höhe, weniger einen oberen und unteren Rand zu bekommen?
Was macht dieses motivierende Beispiel? – aneccodeal
Fügen Sie die Funktionen co Camlp4prof.count (lesen Sie "arbitrary") am Anfang jeder analysierten Funktionsdefinition ein, indem Sie den Namen und die Positionsparameter übergeben. – ygrek
Eine aktive Diskussion über Ressourcen zum Erlernen von camlp4: http://groups.google.com/group/fa.caml/browse_thread/thread/1751a2c308742ac3?hl=de – nlucaroni