Как я могу использовать pyparsing для анализа языка с апострофами? - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь разобрать немного языка с апострофами в нем, используя pyparsing, все шло хорошо, пока вдруг я не начал получать таинственные ошибки, которые я не могу отладить.

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

В качестве примера того, что я пытаюсь сделать, рассмотрим язык с таковыми и вложенные списки из них.

например 1(11)1(1((11)1))

, который может быть проанализирован так:

from pyparsing import *

sound=Regex(r"1")
beat=sound ^ nestedExpr(content=sound)
tune=OneOrMore(beat)

print(tune.parseString("1"))
print(tune.parseString("11"))
print(tune.parseString("(1)"))
print(tune.parseString("(1(1))"))

Но если я попытаюсь добавить апостроф, то вместо этого основной единицей будет '1:

например '1('1'1)'1('1(('1'1)'1))

sound=Regex(r"'1")
beat=sound ^ nestedExpr(content=sound)
tune=OneOrMore(beat)

#These all work as expected

print(tune.parseString("'1"))
print(tune.parseString("'1'1"))
print(tune.parseString("('1)"))

#but
print(tune.parseString("('1('1))"))

вызывает исключение

pyparsing.ParseException: Expected {Re:("'1") ^ nested () expression}, found '1'  (at char 5), (line:1, col:6)

Может кто-нибудь сказать мне, как заставить второй пример работать так же, как первый, чтобы любая строка, принятая первым, была принята первый после замены каждого 1 на '1?

1 Ответ

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

nestedExpr имеет значение по умолчанию ignoreExpr=quotedString. Это попытка сопоставить ведущий ' в качестве кавычки. Отключите его, установив ignoreExpr=None:

>>> sound=Regex(r"'1")
>>> beat=sound ^ nestedExpr(content=sound, ignoreExpr=None)
>>> tune=OneOrMore(beat)
>>> print(tune.parseString("('1('1))"))
[["'1", ["'1"]]]
...