我正在使用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]?
由于
答案 0 :(得分:1)
所需的更正是:
expression ~ opt("&&" ~> expression)*
删除&&
上的空格,它应该有用。这是因为您已经在constant
解析器中覆盖了空间。
编辑: 根据编辑过的问题,这是你想要的:
def expressions = expression ~ (("&&" ~> expression)*) ^^{
case x ~ y => x :: y
}
现在expressions
的返回类型为List[Expression]
。您的condition
现在将编译