在scala解析器组合器中使用Praters和PackratParsers

时间:2014-01-05 00:00:19

标签: scala parsing recursion stack-overflow parser-combinators

此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))))))
  }
}

1 个答案:

答案 0 :(得分:0)

嗯,StreamReader是PackratParsers的错误选择,因为它无法在Streams上运行。 例如。 CharSequenceReader是正确的选择,因为它中的相同位置可以被多次读取。