Scala Parser组合器:提取类型

时间:2016-09-19 07:56:36

标签: regex scala parsing parser-combinators

我正在使用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)* 

但是当我解析示例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)* 

表达式的返回类型不是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]转换为List [Expressions]?

由于

1 个答案:

答案 0 :(得分:1)

所需的更正是:

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

删除&&上的空格,它应该有用。这是因为您已经在constant解析器中覆盖了空间。

编辑: 根据编辑过的问题,这是你想要的:

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

现在expressions的返回类型为List[Expression]。您的condition现在将编译