我正在用 OCaml 编写一个简单的递归下降解析器。通常(据我从网上和书中的教程中得知),异常用于指示解析失败,例如:
match tok with
TokPlus -> ...
| _ -> raise SyntaxError
但是,我正在考虑改用选项类型,即:
match tok with
TokPlus -> Some(...)
| _ -> None
我想这样做的主要原因是使用选项类型允许我优化我的一些组合器以实现尾递归。
使用选项而不是异常(exception)有什么缺点吗?当我开始解析更复杂的结构时,这个决定是否会伤害我的脚?
最佳答案
不,但您可能必须添加(很多)虚拟规则来将错误传播回语法的根产生式。
异常的要点是您不必为每个例程添加异常处理程序;你得到隐式传播。
您是否有特定原因需要优化尾递归?大多数解析器实际上不会产生非常深的调用堆栈(对于真正复杂的东西只有几百层)。我怀疑与非解析器部分完成的所有其他工作相比,节省的时间是否显着。
关于parsing - 使用选项类型而不是递归下降解析器的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7832923/