1

結果の解析ツリー ( pyparsing でParseActions知られている) を構築しようとすると、コードが少しぎこちなくなる気がします。ParseResults

私が今行っていることは、Group要素によって返される一致したトークンのグループを格納するグローバル変数を持つことです。toks最後に、結果を辞書に挿入します。これでよろしいですか ?

私の大ざっぱな文法:

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

などは任意の順序でインターリーブできることExprAに注意してください。ExprBしかし、ParseResults で 1 つのタイプのすべての式を 1 つの辞書エントリにグループ化したいと考えています。私の技術についてどう思いますか?マルチスレッドが問題になるため、グローバル変数を使用するのは好きではありません。他に選択肢はありますか?

4

1 に答える 1

2

listAllMatches=True で setResultsName を使用することを考えましたか? ここにデモがあります:

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"あまりにも冗長で雑然としていることに気付きました。これは、人々に結果名の使用を奨励するという私の意図に反していました。

于 2011-04-25T03:27:05.763 に答える