Я писал парсер для некоторых выражений ограничений, таких как:
(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, потому что оно будет поддерживаться другими.