如何在JavaTokenParsers类中实例化lexical.Scanner?

时间:2015-06-22 20:57:50

标签: scala parsing lexical-analysis

我正在编写一个继承自JavaTokenParsers的解析器,我有一个函数如下:

 import scala.util.parsing.combinator.lexical._
 import scala.util.parsing._
 import scala.util.parsing.combinator.RegexParsers;
 import scala.util.parsing.combinator.syntactical.StdTokenParsers
 import scala.util.parsing.combinator.token.StdTokens
 import scala.util.parsing.combinator.lexical.StdLexical
 import scala.util.parsing.combinator.lexical.Scanners
 import scala.util.parsing.combinator.lexical.Lexical
 import scala.util.parsing.input._
 import scala.util.parsing.combinator.syntactical._
 import scala.util.parsing.combinator.token
 import scala.util.parsing.combinator._

 class ParseExp extends JavaTokenParsers{
  //some code for parsing 
  def parse(s:String) = {
     val tokens = new lexical.Scanner(s)
     phrase(expr)(tokens)
   }
}

我收到以下错误:

type Scanner is not a member of package scala.util.parsing.combinator.lexical
[error]         val tokens = new lexical.Scanner(s)
[error]                                  ^

为什么导入所有软件包时出现此错误?

1 个答案:

答案 0 :(得分:1)

JavaTokenParsers未实现Scanners特征。因此,您还需要从此特征(或扩展它的特征)扩展,以便能够访问此类。

除非你的expr解析器接受Reader作为参数(不是来自它的apply方法),否则你需要覆盖元素的类型和输入类型,如果我没弄错的话使这个工作。

还有什么理由需要Reader[Token]吗?

如果您不需要Reader[Token],并且因为您以明文字符串提供输入,

phrase(expr)(new CharSequenceReader(s))

应该有用。