我正在学习如何使用 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 是字符串的尾部。
我不知道它是否重要,但是示例教程似乎都没有一个匹配两个以上变量的示例,而这是匹配四个