Pyparsing: доступ к внешним ParseResults в parseaction - PullRequest
0 голосов
/ 16 мая 2018
from pyparsing import *
class AParseActionHolder(object):
    def __call__(self, string, index, t):
        f(info_from_outer_parse_results,t[0])
expr = operatorPrecedence( Word(nums),[
         (Literal('A'), 1, opAssoc.RIGHT,AParseActionHolder()),
         (Literal('B'), 2, opAssoc.LEFT),
         (Literal('C'), 2, opAssoc.LEFT)])
print(expr.parseString("3B1C2BA1")[0])#[['3','B','1'],'C',['2','B',"nested in B and C"]]
print(expr.parseString("A1B3")[0])#["nested in B", 'B', '3']
print(expr.parseString("A(1B3)")[0])#["not nested", ['1', 'B', '3']]

Как получить доступ к информации из внешнего результата анализа, в который вложен аргумент parseaction?Могу ли я сделать это с анализом?Если нет, то есть ли какой-нибудь другой инструмент Pyparsing для него, или я должен определить рекурсивную функцию, которая принимает pyparsing.ParseResults в качестве аргумента?

1 Ответ

0 голосов
/ 17 мая 2018

Нет, нет доступа к внешним результатам - в вашем случае, потому что они еще даже не анализировались во время анализа внутренних результатов!

Возможно, вам придется написать рекурсивную функцию, которая будет работать с полностью разобранным деревом, которое вы получите из parseString. Когда вы идете по дереву, следите за своим путем, и когда вы найдете элемент «A», замените его на путь.

Может быть трудно работать с возвращенным ParseResults напрямую, поэтому вы можете получить дерево, вызвав asList() возвращенных результатов:

tree = expr.parseString("whatever").asList()
...