我遇到类似的问题:
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))
我找到了另一个可以谈论此问题的链接,但不确定它是否是解决问题的方法:
请分享一些想法,谢谢。
答案 0 :(得分:4)
这是一个标准的解析问题:面对所有编译器/解释器/等等......有很多方法可以解决这个问题,基本上归结为以下几点:
听起来你正在做的事情就是你需要一个抽象语法树(你在问题中提到的“树”)。您可以轻松地使用OCaml解析器生成器来完成这些事情,一个好的就是Menhir.虽然您也可以编写自己的解析器,但是使用像Menhir或ocamlyacc这样的工具为您完成它是一个非常通用和快速的解决方案(与在简单的递归下降解析器中处理非LL(1)事物的可能性相比较)。
答案 1 :(得分:4)
OCaml发行版包含ocamlyacc
工具,可以完全满足您的需求(存在其他工具,如Kristopher指出的那样)。
有关ocamlyacc
的详细解释,请参阅例如this tutorial和related example,其中定义了小型表达式语言(类似于您的)的解析器。