2

我正在学习如何使用 Scala Parser Combinators,顺便说一句,使用起来很可爱。

不幸的是,我遇到了编译错误。我已经阅读并重新创建了以下工作示例:http ://www.artima.com/pins1ed/combinator-parsing.html <--来自 Scala 编程的第 31 章,第一版和其他一些博客。

我已经将我的代码简化为一个更简单的版本来演示我的问题。我正在研究可以解析以下示例的解析器

if a then x else y
if a if b then x else y else z

有一点额外的条件可以有一个可选的“/ 1,2,3”语法

if a/1 then x else y
if a/2,3 if b/3,4 then x else y else z

所以我以以下代码结束

 def ifThenElse: Parser[Any] = 
    "if" ~> condition ~ inputList ~ yes ~> "else" ~ no 
 def condition: Parser[Any] = ident
 def inputList: Parser[Any] = opt("/" ~> repsep(input, ","))
 def input: Parser[Any] = ident
 def yes: Parser[Any] = "then" ~> result | ifThenElse
 def no: Parser[Any] = result | ifThenElse
 def result: Parser[Any] = ident

现在我想添加一些转换。我现在在第二个 ~ 在这种情况下得到一个编译错误:

  def ifThenElse: Parser[Any] =
    "if" ~> condition ~ inputList ~ yes ~> "else" ~ no ^^ {
      case c ~ i ~ y ~ n => null
                 ^ constructor cannot be instantiated to expected type; found : SmallestFailure.this.~[a,b] required: String

当我将代码更改为

   "if" ~> condition ~ inputList ~ yes ~> "else" ~ no ^^ {
      case c ~ i => println("c: " + c + ", i: " + i)                 

我希望它不会编译,但确实如此。我以为每个子句都需要一个变量。当执行(使用 parseAll)解析“if a then b else c”时,会产生“c: else, i: c”。所以看起来 c 和 i 是字符串的尾部。

我不知道它是否重要,但是示例教程似乎都没有一个匹配两个以上变量的示例,而这是匹配四个

4

1 回答 1

0

您不必匹配"else"

def ifThenElse: Parser[Any] =
    "if" ~> condition ~ inputList ~ (yes <~ "else") ~ no ^^ {
      case c ~ i ~ y ~ n => null
    }

按预期工作。

于 2013-05-07T17:14:08.800 回答