Ocaml解析字符串以制作树

时间:2012-04-19 01:07:39

标签: parsing tree ocaml grammar

我遇到类似的问题:

How to print a tree structure into a string fast in Ocaml?

但是以相反的方式,我已经有了一个字符串,并希望将其解析为树。

例如,我有

type expr = 
  Number of int
 |Plus of expr*expr
 |Prod of expr*expr

我有一个像1 + 2 * 3 + 4这样的字符串(与上面的链接略有不同,假设*的进程高于+
然后我希望我的结果是expr类型Prod(Plus(1,2), Plus(3, 4))

我找到了另一个可以谈论此问题的链接,但不确定它是否是解决问题的方法:

Parsing grammars using OCaml

请分享一些想法,谢谢。

2 个答案:

答案 0 :(得分:4)

这是一个标准的解析问题:面对所有编译器/解释器/等等......有很多方法可以解决这个问题,基本上归结为以下几点:

  • 编写自己的递归下降解析器
  • 使用从解析器生成器生成的解析器

听起来你正在做的事情就是你需要一个抽象语法树(你在问题中提到的“树”)。您可以轻松地使用OCaml解析器生成器来完成这些事情,一个好的就是Menhir.虽然您也可以编写自己的解析器,但是使用像Menhir或ocamlyacc这样的工具为您完成它是一个非常通用和快速的解决方案(与在简单的递归下降解析器中处理非LL(1)事物的可能性相比较)。

答案 1 :(得分:4)

OCaml发行版包含ocamlyacc工具,可以完全满足您的需求(存在其他工具,如Kristopher指出的那样)。

有关ocamlyacc的详细解释,请参阅例如this tutorialrelated example,其中定义了小型表达式语言(类似于您的)的解析器。