この手法は、pyparsingでParseResultsを構築するのに受け入れられますか?

pyparsing python
この手法は、pyparsingでParseResultsを構築するのに受け入れられますか?

結果の解析ツリー(pyparsingでは「ParseResults」として知られている)を構築しようとすると、「ParseActions」はコードを少し不格好にすると感じます。

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

私の大ざっぱな文法:

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

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

  1  0


ベストアンサー

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 “`が冗長すぎて煩雑であることがわかりました。これは、結果名の使用を人々に奨励するという私の意図に反していました。

2


タイトルとURLをコピーしました