Есть ли у Python опция не-жадного разбора? - PullRequest
0 голосов
/ 02 апреля 2019

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

julia> Meta.parse("(x=1)@blahblah", 1, greedy=false)
(:(x = 1), 6)

, которая анализирует только первое найденное выражение, останавливаясь перед @blahblah (который в этом случае даже не сформировал бы действительный код вместе с первой частью).

Есть ли в Python что-нибудь подобное?

Полагаю, я мог бы перебрать вызов compile и добавить по одному символу за раз в строку, пока не получу синтаксическую ошибку, хотя это кажется довольно расточительным ...

1 Ответ

1 голос
/ 03 апреля 2019

Pyparsing будет анализировать довольно сложные выражения, и поведение по умолчанию - остановка, когда правила синтаксического анализа не находят ничего другого для анализа. Например, если вы предполагаете, что ваш ведущий раздел представляет собой просто произвольную строку вложенных скобок, вы можете использовать встроенный в Pyparsing nestedExpr parser:

>>> import pyparsing as pp
>>> s = "(x=1)@blahblah"
>>> print(pp.nestedExpr().parseString(s))
[['x=1']]

Более полный пример может быть:

ppc = pp.pyparsing_common
assignment_expr = ppc.identifier + '=' + ppc.number
fn_call = ppc.identifier + pp.nestedExpr() # lazy definition of arg list in ()'s

# a woefully incomplete parser for Python statements
statement_expression = fn_call | assignment_expr

LPAR, RPAR = map(pp.Suppress, "()")
prefix = LPAR + statement_expression + RPAR
print(prefix.parseString(s))

Примечание: я автор pyparsing.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...