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

How to instantiate lexical.Scanner in a JavaTokenParsers class?

我正在编写一个继承自 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]                                  ^

为什么我在导入所有包时出现此错误?

JavaTokenParsers 没有实现 Scanners 特性。因此,您还需要从这个特征(或扩展它的特征)进行扩展才能访问这个 class。

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

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

如果您不需要 Reader[Token] 并且由于您以纯字符串形式输入,

phrase(expr)(new CharSequenceReader(s))

应该可以。