如何使用Genlex构建OCaml源代码

How to build OCaml source which using Genlex

本文关键字:OCaml 源代码 构建 Genlex 何使用      更新时间:2023-10-16

我是OCaml的新手,但它的文档让我哭泣。我想在ocaml上编写一个解析器并将其集成到c++项目中。

我已经使c++ - OCaml绑定正确,就像这里描述的那样http://www.mega-nerd.com/erikd/Blog/CodeHacking/Ocaml/calling_ocaml.html

所以我可以得到一个可执行的调用OCaml代码的命令:

    cat build.sh
  • #/bin/bash
  • mkdir -p build
  • ocamlopt -c -o build/ocaml-called-fromcmx ocaml-called-from-c.ml
  • ocamlopt -output-obj -o build/camlcodeo构建/ocaml-called-from-c.cmx
  • gcc -g -Wall -Wextra -c c-main-calls- occam .c -o build/c-main-calls- occam .o
  • gcc/camlcode。o构建/c-main-calls-ocaml。/.opam/4.01.0/lib/ocaml -lasmrun -o c-main-calls-ocaml -ldl

但是我在ocaml-called-from-c中添加了"open Genlex;;"。Ml并尝试编写简单的解析器,例如,如下所述:

http://caml.inria.fr/pub/docs/manual-ocaml/libref/Genlex.html

正如它所说:应该注意,只有通过camlp4扩展才能使用解析器关键字和相关的流表示法。这意味着必须预处理它的源代码,例如通过使用编译器的"-pp"命令行开关。"

,

ocamlopt -pp camp4 -o build/ocaml-called-from-c。

得到

解析错误:entry [implementation]为空运行外部预处理器时出错命令行:camlp4 'ocaml-called-from-c。Ml '>/tmp/ocamlpp162c63

没有-pp它落在:

解析器| [& lt;N1 = parse_atom;N2 = parse_remainder n1>] -> N2

"ocaml-called-from-c

文件。Ml",第99行,13-14个字符:语法错误

在我看来,Genlex是用于快速破解的。如果你的语言很有趣,你可能会想看看Menhir,就像Basile Starynkevitch建议的那样。

Genlex文档告诉你的是make_lexer函数使用流。虽然流本身是核心语言的一部分(在Stream模块中),但酷流语法是OCaml的扩展。该语法曾经是该语言的一部分,但不久前被移到了一个扩展中。

OCaml的语法扩展领域目前处于相当不稳定的状态。我能找到的关于Stream扩展的最完整的描述是在旧的camlp4手册的第2章。在OCaml.org的流表达式页面上也有一个很好的教程描述。

我能够使文档中的示例按如下方式工作。我在OS X 10.9.2上使用OCaml 4.01.0。

我的源文件gl.ml看起来像这样。(我增加了main功能)

open Genlex
let lexer = make_lexer ["+";"-";"*";"/";"let";"="; "("; ")"]
let rec parse_expr = parser
    | [< n1 = parse_atom; n2 = parse_remainder n1 >] -> n2
and parse_atom = parser
    | [< 'Int n >] -> n
    | [< 'Kwd "("; n = parse_expr; 'Kwd ")" >] -> n
and parse_remainder n1 = parser
    | [< 'Kwd "+"; n2 = parse_expr >] -> n1+n2
    | [< >] -> n1
let main () =
    let s = Stream.of_channel stdin in
    let n = parse_expr (lexer s) in
    Printf.printf "%dn" n
let () = main ()

我编译如下:

$ ocamlopt -o gl -pp camlp4o gl.ml

执行如下命令:

$ echo '3 + (5 + 8)' | gl
16

因此,Genlex可以工作。

对于你的情况,我认为你的命令行应该是这样的:

$ ocamlopt -o gl.o -c -pp camlp4o gl.ml

这对我有用。它创建了gl.ogl.cmx

这可能不能解决你所有的问题,但我希望它能有所帮助。