2015-12-31 26 views
5

Próbuję dowiedzieć się więcej o punktach rozszerzeń OCaml i mam problemy z reprezentacją typów rekordów w AST.OCaml reprezentacja typu rekordu AST

jestem kradzież poniżej przykład z tego blogu:

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

Korzystanie z pliku źródłowego (foo.ml):

let _ = [%getenv "USER"] 

i wyjściowe 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) 
     ] 
    ] 

Z asttypes.mli i parsetree.mli Mogę śledzić parsowanie dopasowanie wzoru drzewa do linii

Jednak nie mogę już śledzić, co się dzieje, gdy drzewo analizy reprezentuje typy rekordów. Wydaje się, że pola rekordów nie są reprezentowane w takiej samej kolejności, w jakiej pojawiają się w definicji typu, a nie wszystkie pola są wymagane (lub pokazane) w drzewie analizy.

Od parsetree.mli:

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

Wyjście drzewo parse wydaje się tylko, aby pokazać lokalizację i ładowność, ale ja pewnie czytając to nieprawidłowo.

Jak poprawnie odczytać AST dla typów rekordów? Dla wyrażenia typu powinno być:

(* record type declaration and pexp_loc field *) 
expression (test.ml[1,0+8]..[1,0+24]) 
    (* pexp_desc field *) 
    Pexp_extension "getenv" 
    [ 
     ... 
    ] 
+1

Nie jestem pewien, czy rozumiem twoje pytanie. pexp_desc to rzeczywisty opis AST (jest to typ o dużej wartości). -dsourcetree jest tylko schematyczną reprezentacją, a nie rzeczywistą wartością OCaml AST. – Drup

Odpowiedz

2

Wygląda na to, że brakuje podstawowych narzędzi do badania AST i używania punktów rozszerzeń. Te narzędzia to ppx_tools napisane przez Alaina Frischa. Jedno z tych narzędzi zostało dokładnie zaprojektowane, aby zbadać konkretną reprezentację AST, jego nazwa to dumpast. Niech zastosować go do następującego pliku ast_record.mli:

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

Wyjście jest

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}]}] 
========= 

który potwierdza, że ​​kolejność wytwórni jest zachowana.

Nawiasem mówiąc, niech Proponuję studiować kod źródłowy tych ppx_tools i może również PPX rozszerzenie dostarczonymi z Dwójki. Są one dość krótkie i bardzo dobrze napisane i stanowią zalecane źródło inspiracji.