我觉得ParseActions
在尝试构建生成的解析树(在pyparsing中称为ParseResults
)时使我的代码有点笨拙。
我现在正在做的是拥有全局变量来存储由Group
元素返回的匹配令牌组。然后在最后,我将结果注入toks
字典。这个可以吗 ?
我粗略的语法:
grammar = ZeroOrMore( Or( ExprA, ExprB, ExprC ) )
请注意,ExprA
,ExprB
等可以按任何顺序进行交错。但我想将一种类型的所有表达式分组到ParseResults中的一个字典条目中。你觉得我的技术怎么样?我不喜欢使用全局变量,因为它使多线程成为一个问题。我还有其他选择吗?
答案 0 :(得分:2)
您是否考虑过将listResultsName与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']
编辑:
更新的形式是:
grammar = ZeroOrMore(aExpr("A*") | bExpr("B*") | cExpr("C*") )
我发现".setResultsName"
在定义语法时过于冗长和混乱,这违背了我鼓励人们使用结果名称的意图。