【问题标题】:Using Parsers with PackratParsers in scala parser combinators在 scala 解析器组合器中使用带有 PackratParsers 的解析器
【发布时间】: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


    【解决方案1】:

    嗯,StreamReader 是 PackratParsers 的错误选择,因为它不能在 Streams 上工作。 例如。 CharSequenceReader 是正确的选择,因为可以多次读取其中的相同位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 2011-07-01
      • 2014-05-24
      相关资源
      最近更新 更多