所以我开始用Scala CombinatorParser在Scala中为OCaml编写一个解析器, 但我觉得这不适合这份工作。 特别是正确地获得运算符和非闭合结构的优先级和关联性可能具有挑战性。 所以我的问题是:对于像OCaml这样的真实世界解析器来说,最好的方法是什么? 我查看了像ANTLR这样的解析器生成器,但是有很多,我不知道哪一个实际上会让工作变得更容易。
答案 0 :(得分:2)
您可以查看JavaCC生成器。我觉得制作DSL解析器非常有用。我想这也是解析“真实”语言的好选择。
答案 1 :(得分:2)
OCaml解析器以非常简单的lex + yacc实现。因此,最简单的方法是使用您所用语言的等效lex + yacc工具集移植规则。
我并不是说在LL(k)(即Parsec)中转换OCaml解析规则是完全不可能的。实际上,如果你编写一个自动转换工具并不是很困难:请参阅我的博客文章http://camlspotter.blogspot.sg/2011/05/planck-small-parser-combinator-library.html但是,用人手,在短时间内正确完成这项任务几乎是不可能的。
-edit -
第二个想法,如果你不是Scala / Java纯粹主义者,最简单的方法是使用原始的OCaml解析器并编写一些OCaml代码将其AST输出到易于解析为任何其他语言的东西,例如,S-exp。
答案 2 :(得分:2)
您可能需要查看ANTLR。对于小型DSL,我发现它非常实用。我认为它也可以处理复杂的语言。