2010-08-25 101 views
2

我对Scala的2.8呈现Packrat解析器组合的一些问题。斯卡拉packrat解析器

可惜的是我没能找到如何使用这项新功能除外Scaladoc PackratParsers特征描述,这是相当短的任何教程。有可能获得使用它的例子吗?

其实,我在斯卡拉没有的experiance。我尝试使用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。除此之外,我还有兴趣如何实例化特殊的内部类,比如PackratReader,在前面提到的问题中提到过?

我的最后一个问题是如何使用起来Packrat解析器和定期Scala的解析器组合。斯卡拉多说:“他们可以在一个语法中免费混合常规解析器”。你能否解释一下不提供记忆法的常规解析规则是如何影响支持它的软件包规则的?

谢谢。

+1

有一个[技术报告](http://scala-programming-language.1934581.n4.nabble.com/attachment/1956909/0/packrat_parsers.pdf)描述了Scala中的Packrat分析的实现(带有示例) 。 – 2012-01-07 16:02:53

回答

3

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

+0

谢谢Randall! 你能不能也解释了记忆化问题,当Packrat和定期解析器一起使用? – 2010-08-27 16:27:42

+0

@Eliah:我还没有探究Scala 2.8中的packrat解析附加内容,因此我无法为您提供任何帮助。 – 2010-08-27 16:59:02