Является ли этот метод приемлемым для построения ParseResults в pyparsing? - PullRequest
1 голос
/ 25 апреля 2011

Я чувствую, что ParseActions делает мой код немного неуклюжим при попытке создать результирующее дерево разбора (известное как ParseResults в pyparsing).

То, что я сейчас делаю, - это наличие глобальных переменных, в которых хранятся группы совпадающих токенов, возвращаемых элементом Group. Затем в конце я добавлю результаты обратно в словарь toks. Это нормально ?

Моя отрывочная грамматика:

grammar = ZeroOrMore( Or( ExprA, ExprB, ExprC ) )

Обратите внимание, что ExprA, ExprB и т. Д. Могут чередоваться в любом порядке. Но я хочу сгруппировать все выражения одного типа в одну словарную запись в ParseResults. Что вы думаете о моей технике? Я не люблю использовать глобальные переменные, потому что это делает многопоточность проблемой. У меня есть другие варианты?

1 Ответ

2 голосов
/ 25 апреля 2011

Задумывались ли вы об использовании setResultsName с listAllMatches = True? Вот демо:

from pyparsing import *

aExpr = Word("A", nums)
bExpr = Word("B", nums)
cExpr = Word("C", nums)

grammar = ZeroOrMore(aExpr.setResultsName("A",listAllMatches=True) |
                     bExpr.setResultsName("B",listAllMatches=True) |
                     cExpr.setResultsName("C",listAllMatches=True) )


results = grammar.parseString("A1 B1 A2 C1 B2 A3")
print results.dump()

печать:

['A1', 'B1', 'A2', 'C1', 'B2', 'A3']
- A: ['A1', 'A2', 'A3']
- B: ['B1', 'B2']
- C: ['C1']

EDIT:

Более новая форма для этого будет:

grammar = ZeroOrMore(aExpr("A*") | bExpr("B*") | cExpr("C*") )

Я обнаружил, что ".setResultsName" слишком многословен и беспорядочен при определении грамматик, что противоречило моему намерению побуждать людей использовать имена результатов.

...