Scala解析器组合器:失败 - 期望eol(行尾)

时间:2016-09-23 18:56:41

标签: scala parsing parser-combinators

我想使用Scala解析器组合器解析LOLCODE脚本。这是我到目前为止所得到的:

  class ValuePT(val value: String) extends ExpressionPT {
    override def toString = value
  }

  def value: Parser[ValuePT] = (numericLit | stringLit) ^^ {
    case a => new ValuePT(a)
  }
  def expression: Parser[ExpressionPT] = (...| id | value) ^^ {
    case a => a
  }

  def statement: Parser[StatementPT] = (...|expression|...|loop) <~ eol ^^ {case a => a}

  def condition: Parser[LoopConditionPT] = (value <~ "YR") ~ id ~ opt(("TIL"|"WILE") ~ expression) ^^ {
    case a ~ b ~ Some(c ~ d) => new LoopConditionPT(a toString, b, Option(c -> d))
    case a ~ b ~ None => new LoopConditionPT(a toString, b, Option("None" -> new IdentPT("-1")))
  }

  def loop: Parser[LoopPT] = ("IM IN YR" ~> id ~ opt(condition) <~ eol) ~ rep(statement) <~ "IM OUTTA YR" <~ id ^^ {
    case a ~ b ~ c => new LoopPT(a, b, c)
  }

我的测试用例如下:

HAI 1.2
    IM IN YR UntilLoop UPPIN YR Var TIL BOTH SAEM Var AN 3
        VISIBLE "UntilLoop " Var
    IM OUTTA YR UntilLoop

    IM IN YR WhileLoop bla YR Var 
        VISIBLE "WhileLoop " Var
    IM OUTTA YR WhileLoop

    I HAS A x ITZ 1
    I HAS A y ITZ 1
    IM IN YR NestedLoop
        IM IN YR InnerLoop
            VISIBLE "NestedLoop " x " " y
            GTFO
        IM OUTTA YR InnerLoop
        GTFO
    IM OUTTA YR NestedLoop
KTHXBYE

但是我的功能不起作用,它引发了一个错误:

 [2.24] failure: eol expected

  IM IN YR UntilLoop UPPIN YR Var TIL BOTH SAEM Var AN 3

                     ^

我不明白,我不知道导致错误的原因是什么,是否说eol之前我遗失了UPPIN

1 个答案:

答案 0 :(得分:0)

从代码中可以清楚地看出condition无法匹配,从解析器的角度来看,这很好,因为它是opt(condition)。但是当它失败时,它期待下一个eol

看起来您希望condition与该行的其余部分相匹配。因为您在eol处收到错误,这意味着condition在第一个令牌上失败,因为否则Scala会报告来自进一步进展的分支的错误。如果没有value的定义,则无法确定究竟是什么失败,但调试opt解析器的一般规则是在测试示例时删除opt 。这样,您始终会从opt内部收到错误,而不是让opt静静地匹配任何内容。