DSLs in Action演示了一个潜在的问题 - 缓慢 - 将alternation
与预测解析器一起使用时:
Predictive parsers are fast and use linear time parsing, but a naïve implementation
of backtracking parsers can quickly degenerate to exponential time parsing.
lazy val exp = exp ~ ("+" ~> term) |
exp ~ ("-" ~> term) |
term
Packrat parsers can help solve this problem of redoing the
same computation using the technique of memoization.
如果在上面的示例中,我的exp
和term
解析器被懒惰地评估,即lazy val ...
,那么这是否意味着我的解析器是一个packrat解析器?
答案 0 :(得分:3)
不,标记它们lazy val
不会使它们成为packrat解析器。是什么使他们packrat解析器是底层实现。如果您已将PackratParsers
混合到Parser
中,那么您正在使用packrat解析器。根本区别在于packrat解析器缓存已经计算的值(memoization)以防止重复工作。看看https://github.com/scala/scala/blob/v2.10.4/src/library/scala/util/parsing/combinator/PackratParsers.scala中的代码。