Scala Parser Комбинаторы и рекурсия - PullRequest
0 голосов
/ 03 мая 2019

Я писал парсер для некоторых выражений ограничений, таких как:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...