Продолжение моего квеста PyParsing - синтаксический анализ вложенных тернарных выражений (например, (x == 1 ? true : (y == 10 ? 100 : 200))
). Таким образом, я построил следующее выражение. Который, для меня, кажется интуитивным. Однако я не получаю совпадений:Разбор вложенных тернарных выражений
any = Word(printables)
conditional = Forward()
sub_exp = (conditional | any)
conditional = Literal('(') + sub_exp + Literal('?') + sub_exp + Literal(':') + sub_exp + Literal(')')
for exp in conditional.scanString(block_str):
print exp
Первоначально я думал, что проблема связана с печатаемыми вещами, потребляющими все; Я установил excludeChars не в соответствие с :?)(
, но это тоже не помогло. Альтернативой было построение вложенных выражений, по одному для «(« »,« ?: »и« :) «блоки. Но этот подход очень запутан. Есть ли у кого-нибудь рекомендации по разбору терминов?
UPDATE Используя ответ снизу, но модифицированный для работы с scanString:
При использовании scanString однако, он возвращает много других матчей тоже (в основном, все, что соответствующий атом).
lpar = Literal('(').suppress()
rpar = Literal(')').suppress()
any = Combine(OneOrMore(Word(printables, excludeChars='()?:') | White(' ', max=1)))
expr = Forward()
atom = any | Group(lpar + expr + Literal('?') + expr + Literal(':') + expr + rpar)
expr << Literal('(') + atom + ZeroOrMore(expr) + Literal('?') + atom + ZeroOrMore(expr) + Literal(':') + atom + ZeroOrMore(expr) + Literal(')')
for ternary_exp in expr.scanString(block_str):
print ternary_exp
Возможно, это проблема с интервалом. Соответствует ли ваше выражение «' (x == 1? True: (y == 10? 100: 200)) ''? – Kevin
Нет, безрезультатно. Нет совпадений (и никаких ошибок). – JB2
Вы назначаете «условный» дважды, это предназначено? Кроме того, я бы определил местозаполнитель выражений, который является вашим «(условным | любым)», и может быть протестирован отдельно. BTW: Какую часть частей вы используете отдельно? –