Разбор выражений с суффиксами с использованием pyparsing - PullRequest
3 голосов
/ 15 февраля 2020

Я хочу проанализировать следующие (упрощенные) рекурсивные выражения с помощью PyParsing:

foo
(foo + bar)
foo'attribute
foo + bar'attribute
foo.field
(foo'attribute + foo.field)'attribute

Я придумал следующий синтаксический анализатор, который работает для всех вышеприведенных выражений:

        identifier = Word(alphas)
        expr = (
            infixNotation(
                identifier,
                [
                    (Literal(".") + identifier, 1, opAssoc.LEFT),
                    (Literal("'") + identifier, 1, opAssoc.LEFT),
                    (Literal("+"), 2, opAssoc.LEFT),
                ],
            )
            + StringEnd()
        )

Что терпит неудачу, однако, это выражения, которые включают .field и суффикс 'attribute вместе. В то время как foo.field'attribute принимается, foo'attribute.field дает

pyparsing.ParseException: Expected end of text (at char 13), (line:1, col:14)

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

Есть идеи, как анализировать произвольные рекурсивные появления различных суффиксов?

1 Ответ

2 голосов
/ 15 февраля 2020

Каждый кортеж в списке определяет свой собственный уровень приоритета. Когда один оператор имеет более высокий приоритет, чем другой, оператор с более низким приоритетом может использоваться только в качестве операнда с более высоким приоритетом с помощью скобок (обратите внимание, что (foo'attribute).field синтаксический анализ штрафа).

Для унарных операторов вы обычно требуется один уровень приоритета для всех постфиксных операторов (и другой для всех префиксных операторов, если они есть). В pyparsing вы делаете это с помощью кортежа, содержащего одно правило, которое может соответствовать обоим операторам:

(oneOf(". '") + identifier, 1, opAssoc.LEFT),
...