Scala packrat解析器

时间:2010-08-25 15:57:46

标签: parsing scala

我对Scala 2.8中提供的Packrat解析器组合有一些疑问。

遗憾的是,除了Scaladoc PackratParsers特征描述之外,我还没有找到任何关于如何使用这个新功能的教程。是否有可能收到使用它的例子?

实际上,我没有Scala的经验。我在尝试使用packrat解析器时发现的第一个问题是实现PackratReader类。 Scaladoc说程序员应该像新的PackratReader(new lexical.Scanner(“input”))手动创建这个对象。因此我写了以下内容:

package proj

import scala.util.parsing.combinator._

class MyParser extends JavaTokenParsers with PackratParsers {
  lazy val expr: PackratParser[Any] = ident ~ "+" ~ ident
}

object TestApplication {
  def main(arguments: Array[String]) {
    val myParser = new MyParser 
    println(myParser.parse(
      myParser.expr,
      new PackratReader(new lexical.Scanner("x+y"))
    ))
  }
}

编译器给出了错误:

error: not found: type PackratReader
new PackratReader(new lexical.Scanner("x+y"))

因此,我的第二个问题是关于如何实现(或尽可能实例化)PackratReader。除此之外,我也有兴趣如何实例化Trait的内部类,比如在一个流行的问题中提到的PackratReader?

我的最后一个问题是如何一起使用Packrat解析器和常规Scala的解析器组合器。 Scaladoс说:“他们可以在单一语法中与常规解析器混合使用”。你能否解释一下如何不提供memoization的常规解析规则会影响支持它的packrat规则?

感谢。

1 个答案:

答案 0 :(得分:3)

class PackratReader嵌套在trait PackratParsers中。您需要在PackratParsers特征的特定实例的上下文中实例化它。我将“普通”Reader传递给MyParser构造函数,以便PackratReader可以在那里实例化。