了解Scala中的Packrat解析器

时间:2014-06-16 16:21:08

标签: scala parsing

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. 

如果在上面的示例中,我的expterm解析器被懒惰地评估,即lazy val ...,那么这是否意味着我的解析器是一个packrat解析器?

1 个答案:

答案 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中的代码。