【发布时间】:2014-01-05 00:00:19
【问题描述】:
这个 Parser 对象 Test 用尽了堆栈,尽管它混入了 PackratParsers。 第二个解析器规则中的 rep1(a | f ) 出现了问题。 通常的方法 parse 不可用,因为它是 Parser 的子类 - 不应该更改 - 并且可能是 t 问题的原因。
为什么这里没有被 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))))))
}
}
【问题讨论】:
标签: scala parsing recursion stack-overflow parser-combinators