camp4:如何匹配Ast.TySum来检索Ast.TyOr

时间:2012-01-26 05:44:58

标签: parsing camlp4

我是ocamlp4的新手。我正在阅读Jake Donham's blog以开始使用它。

我正在尝试编写一个小型的CamlP4程序,它将得到一个简单的类型:

type t = Foo | Bar | Baz

并生成t_of_stringt_to_string函数。

按照blog上的代码,我应该能够将类型与:

匹配
 let wrap_str_item si = 
    let _loc = Ast.loc_of_str_item si in 
    <:str_item< $si$ >>

match wrap_str_item si with 
  | <:str_item< type $lid:tid$ = $Ast.TySum (_, ors)$  >> -> 

但这不起作用。当我用campl4of xx.ml -printer o查看AST并将其缩小到有趣的部分时:

(Ast.TyDcl (_, tid, [],
      (Ast.TySum (_,
        (Ast.TySum (_, ors)))), [])

但我需要匹配像

这样的东西
(Ast.TyDcl (_loc, "t", [],
      (Ast.TySum (_loc,
        (Ast.TyOr (_loc,
              (Ast.TyOr (_loc, (Ast.TyId (_loc, (Ast.IdUid (_loc, "Foo")))),
                 (Ast.TyId (_loc, (Ast.IdUid (_loc, "Bar")))))),
              (Ast.TyId (_loc, (Ast.IdUid (_loc, "Baz")))))))),
        []))

似乎匹配案例中的AST有一个虚假TySum,但我无法摆脱它。

有人有解决方案吗?

2 个答案:

答案 0 :(得分:2)

这是一个众所周知的错误,最近在3.12.1 Mantis之后修复了。请注意,您的解决方案可能不适用于已修复错误的下一个版本。

答案 1 :(得分:1)

我终于找到了解决方案。 它似乎是ocaml 3.12.1中的一种语法。 用

替换匹配大小写
 <:str_item< type $lid:tid$ = $ors$  >>

会成功。

不确定为什么。