3

PyParsing を使用して、Python で CLIPS のような文法を解析しようとしています。

私が問題を抱えているコードは次のとおりです。

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')

それは動作しません。

したがって、問題は「|」で指定された OR を持つことにあると思います。pp.Forward() で宣言されたトークン内のシンボル。

私を手伝ってくれますか?

ありがとうございました。

4

1 に答える 1