Scala解析器组合器和递归

时间:2019-05-03 18:31:00

标签: scala parsing bnf

我正在为一些约束表达式编写解析器,例如:

(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解析器组合器,因为它将由其他人维护。

0 个答案:

没有答案