我正在为一些约束表达式编写解析器,例如:
(c1 < 323232)
some_column < 23 or another_column = 4324342 and (column1 <> 3232 or (column2 = 32 and column3 = 32))
column1 <> 323432 and column2 = 2332 or another_column is not null
( c1 <> 23 or c2 > 323)and( c3 > 324324)or((c4>3232) and c5 = 3232)
c1 = 32432
第一个想法是将这样的表达式当作二叉树来对待,它可以由节点(逻辑公式)和叶子(约束)组成,在这两个表达式中都可以选择用大括号将它们包裹起来。
所以我在Scala Combinators中写了类似的东西:
object MyParser extends RegExParsers with PackratParsers with ImplicitConversions
column = [\w\_]+
value = \d+ | "null"
operator = "<" | ">" | "=" | "<>" | "<=" | ">=" | "is" | "is not"
condition = column operator value
leaf = "(" condition ")" | condition
logicOperator = "or" | "and"
node = leaf | "(" node logicOperator node ")" | node logicOperator node
我认为解析器可以轻松处理它,但是不幸的是,它比人脑还有些愚蠢。对我来说,这就像在迷宫中寻找出路,但显然并非如此。他只是被困在死角。如何解决?我是否缺少某些运算符(到目前为止,我一直在尝试|||和| |运算符)?
PS。我可以使用手动创建的解析器自己编写解决方案,但是我真的很想使用Scala解析器组合器,因为它将由其他人维护。