如何使用Genlex构建OCaml源代码
How to build OCaml source which using Genlex
我是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.o
和gl.cmx
。
这可能不能解决你所有的问题,但我希望它能有所帮助。
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 难以理解某些人解决IOI问题的源代码
- 使用g++编译hdf5源代码
- 如何使用C++读取另一个程序中的源代码输出
- Poco FindMySql.cmake 无法找到 MySQL 源代码
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- C++出现控制台错误.我无法识别源代码的问题
- Qt Quick,如何更改 Ui 源代码?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- 如何使用QT创建器获取网页源代码?
- 从源代码构建 gRPC C++
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 如何在源代码中包含外部库的头文件?
- Makefile by ocaml 和 cpp 扩展名
- 如何查找 torch.bmm 的 c++ 源代码 pytorch.
- 如何使用Genlex构建OCaml源代码