我想使用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
?
答案 0 :(得分:0)
从代码中可以清楚地看出condition
无法匹配,从解析器的角度来看,这很好,因为它是opt(condition)
。但是当它失败时,它期待下一个eol
。
看起来您希望condition
与该行的其余部分相匹配。因为您在eol
处收到错误,这意味着condition
在第一个令牌上失败,因为否则Scala会报告来自进一步进展的分支的错误。如果没有value
的定义,则无法确定究竟是什么失败,但调试opt
解析器的一般规则是在测试示例时删除opt
。这样,您始终会从opt
内部收到错误,而不是让opt
静静地匹配任何内容。