小编Mat*_*row的帖子

使用scala-parser-combinators进行递归定义

我一直在尝试使用scala-parser-combinator库构建一个SQL解析器,我已将其大大简化为以下代码。

class Expression
case class FalseExpr() extends Expression
case class TrueExpr() extends Expression
case class AndExpression(expr1: Expression, expr2: Expression) extends Expression

object SimpleSqlParser {
  def parse(sql: String): Try[Expression] = new SimpleSqlParser().parse(sql)
}

class SimpleSqlParser extends RegexParsers {
  def parse(sql: String): Try[_ <: Expression] = parseAll(expression, sql) match {
    case Success(matched,_) => scala.util.Success(matched)
    case Failure(msg,remaining) => scala.util.Failure(new Exception("Parser failed: "+msg + "remaining: "+ remaining.source.toString.drop(remaining.offset)))
    case Error(msg,_) => scala.util.Failure(new Exception(msg))
  }

  private def expression: Parser[_ <: Expression] =
    andExpr | falseExpr | …
Run Code Online (Sandbox Code Playgroud)

scala parser-combinators left-recursion

3
推荐指数
1
解决办法
851
查看次数

标签 统计

left-recursion ×1

parser-combinators ×1

scala ×1