Странное предупреждение, объявляющее простую рекурсивную грамматику PyParsing в Python

Я пытаюсь разобрать CLIPS-подобную грамматику в Python, используя PyParsing.

Часть кода, с которой у меня проблема:

import pyparsing as pp

...some pyparsing tokens definitions...

INTEGER_EXPRESSION = EXPRESSION

RULE_NAME = SYMBOL

RULE_PROPERTY = OB + pp.Literal('salience') + INTEGER_EXPRESSION + CB

DECLARATION = OB + pp.Literal('declare') + pp.OneOrMore(RULE_PROPERTY) + CB

ACTION = EXPRESSION

CONNECTED_CONSTRAINT = pp.Forward()

TERM = CONSTANT | SINGLEFIELD_VARIABLE | MULTIFIELD_VARIABLE | pp.Literal(':') + FUNCTION_CALL | pp.Literal('=') + FUNCTION_CALL

SINGLE_CONSTRAINT = TERM | pp.Literal('~') + TERM

CONNECTED_CONSTRAINT << SINGLE_CONSTRAINT | SINGLE_CONSTRAINT + pp.Literal('&') + CONNECTED_CONSTRAINT

CONSTRAINT = pp.Literal('?') | pp.Literal('$?') | CONNECTED_CONSTRAINT

ORDERED_PATTERN_CE = OB + SYMBOL + pp.ZeroOrMore(CONSTRAINT) + CB

PATTERN_CE = ORDERED_PATTERN_CE

CONDITIONAL_ELEMENT = PATTERN_CE

DEFRULE_CONSTRUCT = OB + pp.Literal('defrule') + RULE_NAME + pp.Optional(COMMENT) + pp.Optional(DECLARATION) + pp.ZeroOrMore(CONDITIONAL_ELEMENT) + pp.Literal('=>') + pp.ZeroOrMore(ACTION) + CB

Я опустил определение некоторых частей грамматики, потому что они слишком длинные.

Проблема в том, что переводчик выдает мне эту странную ошибку:

SyntaxWarning: Невозможно объединить элемент типа с ParserElement CONNECTED_CONSTRAINT << SINGLE_CONSTRAINT | SINGLE_CONSTRAINT + pp.Literal('&') + CONNECTED_CONSTRAINT

Я заметил, что если я напишу:

CONNECTED_CONSTRAINT << SINGLE_CONSTRAINT

вместо:

CONNECTED_CONSTRAINT << SINGLE_CONSTRAINT | SINGLE_CONSTRAINT + pp.Literal('&') + CONNECTED_CONSTRAINT

Работает без проблем.

Однако даже если я напишу что-то вроде этого:

CONNECTED_CONSTRAINT << SINGLE_CONSTRAINT | pp.Literal('test')

Это не работает.

Так что я полагаю, что проблема в том, чтобы иметь ИЛИ, заданное "|" символ в токене, объявленном с помощью pp.Forward().

Не могли бы вы мне помочь, пожалуйста?

Спасибо.

1 ответ

Задача решена.

Эта проблема была объяснена здесь:

http://pythonhosted.org/pyparsing/pyparsing.pyparsing.Forward-class.html

Я должен написать такие выражения:

x << a | b

в этом случае:

x << (a | b)

потому что оператор "|" имеет более низкий приоритет, чем оператор "<<".

В любом случае, спасибо!

Другие вопросы по тегам