parsing - 使用选项类型而不是递归下降解析器的异常?

标签 parsing exception ocaml recursive-descent

我正在用 OCaml 编写一个简单的递归下降解析器。通常(据我从网上和书中的教程中得知),异常用于指示解析失败,例如:

match tok with
   TokPlus -> ...
 | _ -> raise SyntaxError

但是,我正在考虑改用选项类型,即:

match tok with
   TokPlus -> Some(...)
 | _ -> None

我想这样做的主要原因是使用选项类型允许我优化我的一些组合器以实现尾递归。

使用选项而不是异常(exception)有什么缺点吗?当我开始解析更复杂的结构时,这个决定是否会伤害我的脚?

最佳答案

不,但您可能必须添加(很多)虚拟规则来将错误传播回语法的根产生式。

异常的要点是您不必为每个例程添加异常处理程序;你得到隐式传播。

您是否有特定原因需要优化尾递归?大多数解析器实际上不会产生非常深的调用堆栈(对于真正复杂的东西只有几百层)。我怀疑与非解析器部分完成的所有其他工作相比,节省的时间是否显着。

关于parsing - 使用选项类型而不是递归下降解析器的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7832923/

相关文章:

java - 当我尝试将此特定字符串解析为 int 时,为什么会出现 numberformatException?

java - Android 应用程序在 Eclipse 中不会崩溃

java - 迭代器中的 .next 引发的并发修改异常

garbage-collection - 影子绑定(bind)会被 GCed 吗?

syntax - Ocaml 对整数列表中的值求和

unit-testing - 在 OCaml 中制作测试替身

parsing - haskell - 解析/读取 .pdf 文件的内容

ruby - Ruby 中从 URL 中删除参数的最优雅的方法是什么?

xml - xbrl us gaap contextRef 标准?

python - 在 Python 中屏蔽异常?