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
现在可以编译
我正在使用 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
现在可以编译