Scala Parser Combinators:提取类型列表

Scala Parser Combinators :Extract List of a type

我正在使用 scala.util.parsing.combinator 编写解析器和语法。 我的输入是 ":za >= 1 alok && :ft == 9"

case class Expression(op1:Operand,operator:Operator,op2:Operand)

def word: Parser[String] = """[a-z\\s]+""".r ^^ { _.toString }

def colonWord:Parser[Operand]=":"~> word ^^{case variable => Operand(variable)}

def constant:Parser[Operand]="""^[a-zA-Z0-9\\s-]*""".r ^^ {case constant => Operand(constant)}

def expression:Parser[Expression] = colonWord ~ operator ~ constant  ^^{ case op1~operator~op2 => Expression(op1, operator, op2)}

def expressions = expression ~ opt(" && " ~> expression)* 

但是当我解析 sample String 时,结果不是预期的。 && 之后的第二个表达式不被解析。请注意可以使用 &&.

连接多个表达式

当我执行时:

val expr= ":za >= 1 alok && :ft == 9"
    parse(expressions, expr) match {
      case Success(matched, _) => println(matched)
      case ..}

输出为:

List((Expression(za ,>= ,1 alok )~None))

我没有看到正在解析的第二个表达式。任何人都可以帮助我在这里错过什么吗?

编辑 ---------------------------------

要求是得到List[Expression]。 当我说,合并 Ans 中提到的更改时:

def expressions = expression ~ ("&&" ~> expression)* 

return 类型的表达式不是 List[Expression]。例如: 如果我再写一个 def :

case class Condition(exprs: List[Expression], st:Statement)
def condition = expressions ~","~statement ^^{
    case exprs~commaa~statement => Condition(exprs,statement) //This is giving error.

错误是: 类型不匹配;发现:~[Expression,Expression]] 需要:表达式。

那么如何将 [Expression, Expression] 转换为 List[Expressions]?

谢谢

需要更正的是:

expression ~ opt("&&" ~> expression)*

删除 && 中的 space,它应该可以工作。这是因为您已经在 constant 解析器中覆盖了 space。

编辑: 根据编辑后的问题,这是您想要的吗:

 def expressions = expression ~ (("&&" ~> expression)*) ^^{
    case x ~ y => x :: y
  }

现在 expressions 的 return 类型是 List[Expression]。您的 condition 现在可以编译