Camlp4 3.10 のさわり (2) [OCaml]
* ロードされている Camlp4 モジュールを調べる。
Camlp4.Register.loaded_modules を見る。これは参照型でモジュールがロードされるときに改変されるようだ。
KURO-BOX% ocaml Objective Caml version 3.10.0 # #load "camlp4o.cma";; Camlp4 Parsing version 3.10.0 # !Camlp4.Register.loaded_modules;; - : string list = ["Camlp4OCamlParserParser"; "Camlp4OCamlRevisedParserParser"; "Camlp4OCamlParser"; "Camlp4RevisedParserParser"] # #load "camlp4oof.cma";; Camlp4 Parsing version 3.10.0 # !Camlp4.Register.loaded_modules;; - : string list = ["Camlp4ListComprenhsion"; "Camlp4MacroParser"; "Camlp4MacroParser"; "Camlp4GrammarParser"; "Camlp4OCamlParserParser"; "Camlp4OCamlRevisedParserParser"; "Camlp4OCamlParser"; "Camlp4RevisedParserParser"]
* エントリの内容を表示する
Camlp4 3.9 では Grammar.Entry.print 関数を使って「Grammar.Entry.print Pcaml.str_item;;」とかやっていたけど Camlp4 3.10 では ocaml トップレベルのプリティプリンタになっているのでプリティプリンタをインストールして値を打つだけでよい。
# #load "camlp4o.cma";; Camlp4 Parsing version 3.10.0 # #install_printer Camlp4.PreCast.Gram.Entry.print;; # Camlp4.PreCast.Syntax.str_item;; - : Camlp4.PreCast.Syntax.Ast.str_item Camlp4.PreCast.Syntax.Gram.Entry.t = str_item: [ "top" LEFTA [ "let"; "module"; a_UIDENT; module_binding0; "in"; expr | "let"; opt_rec; binding; "in"; expr | "let"; opt_rec; binding | "exception"; constructor_declaration; "="; type_longident | "exception"; constructor_declaration | "external"; a_LIDENT; ":"; ctyp; "="; string_list | "include"; module_expr | "module"; "rec"; module_binding | "module"; "type"; a_UIDENT; "="; module_type | "module"; a_UIDENT; module_binding0 | "open"; module_longident | "type"; type_declaration | "class"; "type"; class_type_declaration | "class"; class_declaration | ANTIQUOT (("" | "stri" | "anti" | "list"), _) | QUOTATION _ | expr ] ]
* エントリ指定でのパーシング
KURO-BOX% ocaml Objective Caml version 3.10.0 # #load "camlp4o.cma";; Camlp4 Parsing version 3.10.0 # Camlp4.PreCast.Syntax.Gram.parse_string Camlp4.PreCast.Syntax.str_item Camlp4.PreCast.Loc.ghost "let _ = 1";; - : Camlp4.PreCast.Syntax.Ast.str_item = Camlp4.PreCast.Syntax.Ast.StExp (<abstr>, Camlp4.PreCast.Syntax.Ast.ExInt (<abstr>, "1"))
コメント 0