Регулярное выражение для соответствия запросам PQL

Я пытаюсь придумать регулярное выражение, которое будет по крупицам сопоставлять компоненты запроса PQL. Несколько примеров того, что я имею в виду:

a==
[('a==')]
a==22
[('a==22')]
a=="b"
[('a=="b"')]
a=="b" and/or/not <- any of these
[('a=="b"', '{logical operator}')]
a=="b" or c.
[('a=="b"', 'or'), ('c.')]
a=="b" or c.d
[('a=="b"', 'or'), ('c.d')]
a=='b' and c=="
[("a=='b'", 'and'), ('c=="')]

По сути, всякий раз, когда вводится новый раздел оператора PQL, мы создаем новое совпадение, и оно работает с запросами строк или чисел.

Мое текущее выражение выглядит так:

([a-zA-Z.\-_]+[=!<>]{0,2}([\"\']?[a-zA-Z\-!._ "\']*?[\"\']|[0-9]*))[ ]?(and|or|not)?[ ]?

Он делает хорошую работу, но терпит неудачу в чем-то вроде этого:

a==22 and b=='c

Он считает, что c относится к новому совпадению, что дает следующее:

[('a==22', '22', 'and'), ('b==', "'"), ('c')]

В отличие от

[('a==22', '22', 'and'), ('b==', "'c")]

person lightstrike    schedule 06.05.2014    source источник
comment
Мне кажется странным, что одноэлементные одинарные/двойные кавычки допустимы... В противном случае было бы проще анализировать.   -  person Jerry    schedule 06.05.2014
comment
Похоже, вы пытаетесь создать синтаксический анализатор с помощью регулярных выражений, см. здесь. У меня сложилось впечатление, что это была плохая идея ™, но, похоже, у ссылки на вопрос есть некоторые ресурсы для ее поддержки... (насколько я помню, вам нужна формальная грамматика первого типа, которую нельзя проанализировать с помощью регулярных выражений, но моя память может быть туманным).   -  person Mike H-R    schedule 06.05.2014
comment
@MikeH-R Не все формальные грамматики невозможно разобрать с помощью регулярных выражений, хотя на практике большинство из них таковыми являются. Вы правы, говоря, что грамматики типов 1 и 0 обычно неразборчивы с помощью регулярных выражений, но все грамматики типа 3 и многие грамматики типа 2 являются таковыми. Если вы можете написать свой язык для использования этих грамматик, его можно будет разобрать с помощью регулярных выражений.   -  person FrankieTheKneeMan    schedule 06.05.2014
comment
Вы правы, как я узнал, прочитав ссылку, которую я разместил, есть ряд ресурсов по разбору с помощью регулярных выражений, которые кажутся очень полезными.   -  person Mike H-R    schedule 07.05.2014