我正在OCaml中编写一个编译器(很糟糕),作为一个学习项目;我正处于使用Jane Street的SexpLib并没有削减它的地步:
match str.[0] with
| '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ->
compile_int str channel
是的,真正解析器的时间。
我最熟悉PEG(我的意思是我真的知道没有关于无上下文的语法等等);但是我为OCaml看到的所有PEG / packrat解析器似乎都是古老而死的(有Aurochs,其最后一次提交是在9年前,其着陆页now belongs to a French domain-squatter;有{{3} },存在于“Teerex”中,没有任何文档,这些文档很有活力......最近的提交只有五年,哇!...)。
基本上,我喜欢过去几年在OCaml做过一些解析工作的人的建议,并且知道最惯用/最现代的方法。谢谢! (=
答案 0 :(得分:2)
我们正在使用Janestreet Sexplib来实现我们自己的Lisp dialect,并且它运行得相当不错。我们目前正处于移动到(仍然是Janestreet的)Parsexp的过程中,它更加灵活,而且,最重要的是,它提供了一种使用紧凑位置集使用位置信息来注释s表达式的好方法。它真的很整洁!并有助于产生更好的错误消息。 Parsexp还会产生更好的解析错误,并且不会引发异常。
如果您仍然不想使用现有的s表达式解析器,那么我建议您使用mparser或Menhir。前者很有趣,因为它允许您实现上下文相关语法,因此您可以将宏直接嵌入到解析器中,并可能提供合理的错误消息。 (您可能会注意到,我对错误消息有所了解)。 Menhir当然要快得多,并且仍然提供足够的灵活性来构建具有良好诊断功能的强大解析器。
话虽如此,我个人认为最好依靠Parsexp
将文本翻译成Sexp列表,然后执行sexp级别的所有翻译。