Как заставить другой парсер работать с контентом, идентифицированным nestedExpr в pyparsing - PullRequest
0 голосов
/ 28 января 2019

У меня есть вложенный блок текста, который не обязательно хорошо отформатирован (с отступом), который необходимо проанализировать и обработать дальше.

Пример текста:

cell(hi) {
    param1 : true;
    param2 : false;
    func1() {
     param3 : hello;
        param4 : hi;
    }
    func2() {
    param5 : 10;
    nestedFunc1() {
        nestedParam6 : 20;
       nestedFunc2(args) {
        index1(a,b,c,d,e);
        values(1,2,3,4,\
               5);
       }
    }
    }
}

Приведенный выше фрагмент кода представляет собой образец текста, который я собираюсь проанализировать.

Пока что здесь есть синтаксический анализатор, который я придумал:

Group(Word("cell") + QuotedString('(', escChar=None, endQuoteChar=')') + nestedExpr(opener='{', closer='}').setResultsName("cell")

Я пытался использовать аргумент content=LineEnd()для вызова nestedExpr, но это не дает мне того, чего я ожидаю.

Кроме этого, у меня есть несколько других анализаторов для содержимого внутри оболочки cell {...}.Примеры:

params          = Group(Regex(r'(.*)\s*:\s*(.*);')).setResultsName("params")
LookupTables    = Group(Word(k) + QuotedString('(', escChar=None, endQuoteChar=')') + QuotedString("{", multiline=True, endQuoteChar="}") )

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

[
    ['cell', 'hi']
    {'param1': 'true'}
    {'param2': 'false'}
    ['func1'
        {'param3': 'hello'}
        {'param4': 'hi'}
    ]
    ['func2'
        {'param5': '10'}
        ['nestedFunc1'
            {'index1(a,b,c,d,e)': None}
            {'values(1,2,3,4,5)': None}
        ]
    ]
]

В основном я пытаюсь получитьсправочные таблицы внутри данных:

index1(a) = 1
index1(b) = 2
index1(c) = 3
index1(d) = 4
index1(e) = 5

Когда я пытаюсь использовать nestedExpr для моего входного текста, я получаю вложенный список всего содержимого, разделенного пробелами без символов новой строки (показанониже).По крайней мере, мне понадобятся символы новой строки, чтобы я мог присоединиться к выходным данным и воссоздать исходный вложенный блок данных, чтобы применить свои собственные анализаторы, используя setParseAction и т. Д.

Вот вывод, который яполучить в настоящее время:

Parser:
tp      = Group(Word("cell") + QuotedString('(', escChar=None, endQuoteChar=')') + nestedExpr(opener='{', closer='}') ).setResultsName("cell")

Output:
[['cell', 'hi', ['param1', ':', 'true;', 'param2', ':', 'false;', 'func1()', ['param3', ':', 'hello;', 'param4', ':', 'hi;'], 'func2()', ['param5', ':', '10;', 'nestedFunc1()', ['nestedParam6', ':', '20;', 'nestedFunc2(args)', ['index1(a,b,c,d,e);', 'values(1,2,3,4,\\', '5);']]]]]]
...