手工创建的OCaml AST中的未绑定值

时间:2017-02-24 19:14:20

标签: compiler-construction ocaml abstract-syntax-tree

我正在编写一个接收我的AST并输出OCaml AST的编译器。编译时:

(List.length '(1 2 3))

List.length [1; 2; 3]

我得到以下输出:

[
  structure_item (_none_[1,0+-1]..[1,0+-1]) ghost
    Pstr_eval
    expression (_none_[1,0+-1]..[1,0+-1]) ghost
      Pexp_apply
      expression (_none_[1,0+-1]..[1,0+-1]) ghost
        Pexp_ident "List.length" (_none_[1,0+-1]..[1,0+-1]) ghost
      [
        <label> ""
          expression (_none_[1,0+-1]..[1,0+-1]) ghost
            Pexp_construct "::" (_none_[1,0+-1]..[1,0+-1]) ghost
            Some
              expression (_none_[1,0+-1]..[1,0+-1]) ghost
                Pexp_tuple
                [
                  expression (_none_[1,0+-1]..[1,0+-1]) ghost
                    Pexp_constant Const_int 1
                  expression (_none_[1,0+-1]..[1,0+-1]) ghost
                    Pexp_construct "::" (_none_[1,0+-1]..[1,0+-1]) ghost
                    Some
                      expression (_none_[1,0+-1]..[1,0+-1]) ghost
                        Pexp_tuple
                        [
                          expression (_none_[1,0+-1]..[1,0+-1]) ghost
                            Pexp_constant Const_int 2
                          expression (_none_[1,0+-1]..[1,0+-1]) ghost
                            Pexp_construct "::" (_none_[1,0+-1]..[1,0+-1]) ghost
                            Some
                              expression (_none_[1,0+-1]..[1,0+-1]) ghost
                                Pexp_tuple
                                [
                                  expression (_none_[1,0+-1]..[1,0+-1]) ghost
                                    Pexp_constant Const_int 3
                                  expression (_none_[1,0+-1]..[1,0+-1]) ghost
                                    Pexp_construct "[]" (_none_[1,0+-1]..[1,0+-1]) ghost
                                    None
                                ]
                        ]
                ]
      ]
]

经过检查,这似乎与上述OCaml程序中ocamlc -dparsetree的输出几乎相同,后者成功编译。

相反,我的程序没有编译时出现以下错误:

Error: Unbound value List.length

我做错了什么?

1 个答案:

答案 0 :(得分:4)

狂野猜测:您正在构建Lident "List.length",这是错误的,Lident只是非限定标识符。您应该使用Longident.parse "List.length"Ldot (Lident "List", "length")

旁注:你应该输出更好的位置。 ;)