在scala解析器组合器中使用带packratParser的解析器

在scala解析器组合器中使用带packratParser的解析器,scala,parsing,recursion,stack-overflow,parser-combinators,Scala,Parsing,Recursion,Stack Overflow,Parser Combinators,此解析器对象测试的堆栈已用完,尽管它混合了packratParser。 问题出现在第二个解析器规则中的rep1(a | f)中。 通常的parse方法是不可用的,因为它是Parser的子类,不应该更改,而且可能不可用 这不是问题的原因 为什么不让PackratPasser在这里处理 import scala.util.parsing.combinator._ import scala.util.parsing.input._ import java.io._ sealed class T ca

此解析器对象测试的堆栈已用完,尽管它混合了packratParser。 问题出现在第二个解析器规则中的rep1(a | f)中。 通常的parse方法是不可用的,因为它是Parser的子类,不应该更改,而且可能不可用 这不是问题的原因

为什么不让PackratPasser在这里处理

import scala.util.parsing.combinator._
import scala.util.parsing.input._
import java.io._

sealed class T
case class F(val t: List[T]) extends T
case class L(val t: Char) extends T

object Test extends Parsers  with PackratParsers{
  override type Elem = Char
  type PP[T] = PackratParser[T]
  lazy val a : PP[L]= elem("1", { x: Elem => x == '1' }) ^^ { case x => L(x) }
  lazy val f: PP[F] = rep1(a | f ) ^^ { case x => F(x) }
  def main(args: Array[String]) {
    phrase(f)(new PackratReader(StreamReader(new InputStreamReader(new FileInputStream(args(0))))))
  }
}

好吧,StreamReader是PackratPassers的错误选择,因为它不能在流上工作。 例如,CharSequenceReader是正确的选择,因为它中的同一位置可以多次读取