这种技术对于在 pyparsing 中构造 ParseResults 是否可以接受?

发布于 2024-11-03 04:32:16 字数 413 浏览 1 评论 0原文

我觉得在尝试构建生成的解析树(在 pyparsing 中称为 ParseResults)时,ParseActions 使我的代码有点笨拙。

我现在正在做的是使用全局变量来存储 Group 元素返回的匹配标记组。最后,我会将结果注入到 toks 字典中。这样可以吗?

我的粗略语法:

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

请注意,ExprAExprB 等可以按任何顺序交错。但我想将一种类型的所有表达式分组到 ParseResults 中的一个字典条目中。你觉得我的技术怎么样?我不喜欢使用全局变量,因为它使多线程成为一个问题。我还有其他选择吗?

I feel that ParseActions make my code a bit clunky when trying to construct the resulting parse tree (known as ParseResults in pyparsing).

What I'm doing now is to have global variables that store groups of matched tokens that are returned by the Group element. Then at the end, I will inject the results back into the toks dictionary. Is this ok ?

My sketchy grammar:

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

Note that ExprA, ExprB etc. can interleave in any order. But I want to group all expressions of one type into one dictionary entry in ParseResults. What do you think of my technique ? I don't like to use global variables because it makes multithreading a problem. Do I have other choices ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

离笑几人歌 2024-11-10 04:32:16

您是否考虑过将 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()

prints:

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

编辑:

较新的形式是:

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

我发现 ".setResultsName" 在定义语法时过于冗长和混乱,这违背了我鼓励人们使用结果的意图名称。

Have you thought about using setResultsName with listAllMatches=True? Here's a demo:

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()

prints:

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

EDIT:

The newer form for this would be:

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

I found ".setResultsName" to be too verbose and cluttering when defining grammars, which worked against my intention of encouraging people to use results names.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文