2015-12-31 13 views
5

Ich versuche, mehr über OCaml Extension Points zu erfahren, und ich habe Probleme bei der Darstellung der Datensatztypen in der AST.OCaml AST Datensatztyp-Darstellung

ich das Beispiel unten aus diesem Blog-Post am Stehlen:

http://whitequark.org/blog/2014/04/16/a-guide-to-extension-points-in-ocaml/

Verwenden der Quelldatei (foo.ml):

let _ = [%getenv "USER"] 

und Ausgabe von ocamlc -dparsetree fool.ml :

[ 
    structure_item (test.ml[1,0+0]..[1,0+24]) 
    Pstr_eval 
    expression (test.ml[1,0+8]..[1,0+24]) 
     Pexp_extension "getenv" 
     [ 
      structure_item (test.ml[1,0+17]..[1,0+23]) 
      Pstr_eval 
      expression (test.ml[1,0+17]..[1,0+23]) 
       Pexp_constant Const_string("USER",None) 
     ] 
    ] 

Von asttypes.mli und parsetree.mli kann ich die Analyse folgen Baummustervergleich der Linie

Pexp_constant Const_string("USER",None) 

Allerdings kann ich nicht mehr folgen, was geschieht, wenn die Parsing-Baum-Datensatztypen darstellt. Es scheint, dass Datensatzfelder nicht in derselben Reihenfolge dargestellt werden, in der sie in der Typdefinition angezeigt werden, und nicht alle Felder in der Syntaxanalysebaumstruktur erforderlich sind (oder angezeigt werden).

Von parsetree.mli:

type expression = { 
    pexp_desc: expression_desc; 
    pexp_loc: Location.t; 
    pexp_attributes: attributes; 
} 

Der Parsing-Baum Ausgang scheint nur die Position und die Nutzlast zu zeigen, aber ich bin wahrscheinlich dies falsch zu lesen.

Wie kann ich den AST für Datensatztypen korrekt lesen? Für den Typ Ausdruck sollte es sein:

+1

Ich bin mir nicht sicher, ob ich Ihre Frage verstehe. pexp_desc ist die eigentliche Beschreibung des AST (es ist eine große Summenart). -dsourcetree ist nur eine schematische Darstellung, nicht der tatsächliche OCaml-Wert des AST. – Drup

Antwort

2

Es scheint, dass Sie wesentliche Tools zur AST zu studieren fehlen und Erweiterungen verwenden. Diese Werkzeuge sind die ppx_tools geschrieben von Alain Frisch. Eines dieser Tools wurde speziell entwickelt, um die konkrete Darstellung von ASTs zu erforschen. Der Name lautet dumpast. Lassen Sie sich auf die folgenden Datei ast_record.mli:

type card = { 
    name: string; 
    address: string; 
    age: int; 
} 

Der Ausgang

ocamlfind ppx_tools/dumpast ast_record.mli   
ast_record.mli 
==> 
[{psig_desc = 
    Psig_type 
    [{ptype_name = {txt = "card"}; ptype_params = []; ptype_cstrs = []; 
     ptype_kind = 
     Ptype_record 
     [{pld_name = {txt = "name"}; pld_mutable = Immutable; 
      pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "string"}, [])}}; 
     {pld_name = {txt = "address"}; pld_mutable = Immutable; 
      pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "string"}, [])}}; 
     {pld_name = {txt = "age"}; pld_mutable = Immutable; 
      pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "int"}, [])}}]; 
     ptype_private = Public; ptype_manifest = None}]}] 
========= 

, die das erhaltene ist die Reihenfolge des Plattenlabels bestätigt ist. Übrigens

, lassen Sie mich schlagen Sie den Quellcode dieser ppx_tools zu studieren und vielleicht auch die ppx Erweiterung mit Lwt ausgeliefert. Sie sind ziemlich kurz und sehr gut geschrieben und eine empfehlenswerte Quelle der Inspiration.