parseAction
withを定義する機能は気に入っていますpyarsing
が、特定のユースケースの障害に遭遇しました。入力文字列と次の簡単な文法を取ります。
from pyparsing import *
line = "[[one [two [three] two [three [four]]] one] zero]"
token = Word(alphas)
# Define the simple recursive grammar
grammar = Forward()
nestedBrackets = nestedExpr('[', ']', content=grammar)
grammar << (token | nestedBrackets)
P = grammar.parseString(line)
print P
結果を次のようにしたいと思います。
[('one',1), [('two',2), [('three',3)], ('two',2), [('three',3), [('four',4)]]] one], ('zero',0)]
つまり、それぞれを解析token
し、トークンと深さを持つタプルを返します。これは解析後に実行できることは知っていますが、を使用して実行できるかどうかを知りたいですparseAction
。このように、グローバル変数を使った私の間違った試みは次のとおりです。
# Try to count the depth
counter = 0
def action_token(x):
global counter
counter += 1
return (x[0],counter)
token.setParseAction(action_token)
def action_nest(x):
global counter
counter -= 1
return x[0]
nestedBrackets.setParseAction(action_nest)
与える:
[('one', 1), ('two', 2), ('three', 3), ('two', 3), ('three', 4), ('four', 5), ('one', 3), ('zero', 3)]