是否可以打印出;“类型”;直接作为OCaml中的字符串?

是否可以打印出;“类型”;直接作为OCaml中的字符串?,ocaml,abstract-syntax-tree,Ocaml,Abstract Syntax Tree,基本上我编写了一个小型解析器,在解析器中,我定义了大量类型,如下所示 let stackop = PUSH | POP and systemop = INT | IN | OUT and arithmop = ADC | ADD | XADD | SUB | MUL | IMUL | DIV | IDIV | INC | DEC | NEG and logicop = AND | OR | XOR and rolop = ROL | SHL | SHR

基本上我编写了一个小型解析器,在解析器中,我定义了大量类型,如下所示

let stackop = PUSH | POP
and systemop = INT | IN | OUT
and arithmop = ADC | ADD | XADD | SUB
           | MUL | IMUL | DIV | IDIV
           | INC | DEC | NEG
and logicop = AND | OR | XOR
and rolop = ROL | SHL | SHR | SHLD |SHRD | SAL | SAR
.....
因此,在解析之后,我想实现一个典型的“pretty_print”函数来打印语法树

基本上,据我所知,我必须实现一个pp_print函数,它将所有这些类型转换为相应的字符串,如下所示:

let pp_print = function
  | PUSH -> "push" | POP -> "pop"
  ....
 type stackop = PUSH | POP deriving (Show, Enum)
但我的问题是,要打印的类型太多了,用上面的方式手动编写它们似乎很乏味

所以我想知道是否有更简单的方法,例如

let t_str = s.type in 
  print_string t_str       
(*I know it is not typical OCaml style, I just want to demonstrate*) 
有可能吗。。?谁能给我一些帮助吗?

你可以使用

例如,您可以这样注释您的类型:

let pp_print = function
  | PUSH -> "push" | POP -> "pop"
  ....
 type stackop = PUSH | POP deriving (Show, Enum)
之后,您可以使用:

Show.show<stackop> some_stackop 
Show.Show一些

要漂亮地打印stackop类型的值。

如果您愿意使用CamlP4,那么教程文档在第7.5节中有一个具体的例子。否则,我不确定是否可以从Ocaml内部实现。也许只是从类型定义生成代码?谢谢您的回答:)