scala - 相互递归 scala 解析器中的堆栈溢出

标签 scala parsing

所以,我正在 scala 中研究这个东西,尝试解析算术表达式。我在下面有这个,其中 expr 可以是两个 expr 的 add 或一个 integer 常量,但它陷入了无限循环添加调用 expr 调用添加调用 expr...我对 scala 很陌生,但对解析不太熟悉。我知道我做错了什么,但真正的问题是,这很简单吗?

import scala.util.parsing.combinator._

abstract class Expr

case class Add(x: Expr, y: Expr) extends Expr
case class Constant(con: String) extends Expr

class Comp extends RegexParsers {

  def integer:Parser[Expr] = """-?\d+""".r ^^ {
    s => Constant(s)
  }

  def add: Parser[Expr] = expr ~ "+" ~ expr ^^ {
    case(a ~ "+" ~ b) => Add(a, b)
  }

  def expr: Parser[Expr] = (add | integer)

}

object Compiler extends Comp {

  def main(args: Array[String]) = parse(expr, "5+ -3"))//println("5+ -3")
}

最佳答案

基本RegexParsers无法解析左递归语法。要使其正常工作,您可以修改 add 规则以删除左递归性:

def add: Parser[Expr] = integer ~ "+" ~ expr ^^ {
  case(a ~ "+" ~ b) => Add(a, b)
}

或使用PackratParsers ,它可以解析这样的语法:

class Comp extends RegexParsers with PackratParsers {

  lazy val integer:PackratParser[Expr] = """-?\d+""".r ^^ {
    s => Constant(s)
  }

  lazy val add: PackratParser[Expr] = expr ~ "+" ~ expr ^^ {
    case(a ~ "+" ~ b) => Add(a, b)
  }

  lazy val expr: PackratParser[Expr] = (add | integer)

}

object Compiler extends Comp {
  def main(args: Array[String]) = parseAll(expr, "5+ -3") 
}

关于scala - 相互递归 scala 解析器中的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30429855/

相关文章:

python - 在 python 中解析数据提要

scala - Scala中的现有类型

java - 将 OCL 表达式解析为 AST(抽象语法树)

javascript - 语法产生规则与ECMAScript中的解析如何相关

Scala 极端解构?

javascript - 如何解析 XML 文件并将其放入 AIR 中的 JavaScript 数组中?

php - 如何解析字符串以通过ADB发送短信

mysql - 如何从 SORM 表定义中排除类字段?

string - Scala 拆分行为 : consecutive occurrence of split pattern

parsing - scala 中递归解析器的高级控制