此Parser对象测试耗尽堆栈,尽管它混合了PackratParsers。 问题出现在第二个解析器规则中的rep1(a | f)。 通常的方法解析是不可用的,因为它是Parser的子类 - 它不应该被改变 - 并且可能不是 问题的原因。
为什么PackratParser没有处理这个问题?
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))))))
}
}
答案 0 :(得分:0)
嗯,StreamReader是PackratParsers的错误选择,因为它无法在Streams上运行。 例如。 CharSequenceReader是正确的选择,因为它中的相同位置可以被多次读取。