単純なキー=値クエリ言語を解析しようとしています。私は実際に巨大な怪物パーサーでそれを達成し、それを2回目のパススルーして解析ツリーをクリーンアップしました。私がやりたいのは、ボトムアップでクリーンな解析を行うことです。これには、(key、val)ペアのセットを使用して、冗長なペアを削除するなどが含まれます。以前は機能していましたが、感じません。なぜ構文解析がそのように機能しているのかを完全に理解したように、私は穀物と戦うような多くの回避策などを行いました。
現在、これが私の「簡略化された」パーサーの始まりです。
from pyparsing import *
bool_act = lambda t: bool(t[0])
int_act = lambda t: int(t[0])
def keyval_act(instring, loc, tokens):
return set([(tokens.k, tokens.v)])
def keyin_act(instring, loc, tokens):
return set([(tokens.k, set(tokens.vs))])
string = (
Word(alphas + '_', alphanums + '_')
| quotedString.setParseAction( removeQuotes )
)
boolean = (
CaselessLiteral('true')
| CaselessLiteral('false')
)
integer = Word(nums).setParseAction( int_act )
value = (
boolean.setParseAction(bool_act)
| integer
| string
)
keyval = (string('k') + Suppress('=') + value('v')
).setParseAction(keyval_act)
keyin = (
string('k') + Suppress(CaselessLiteral('in')) +
nestedExpr('{','}', content = delimitedList(value)('vs'))
).setParseAction(keyin_act)
grammar = keyin + stringEnd | keyval + stringEnd
現在、「文法」非終端記号は単なるスタブです。最終的には、次のような検索を解析できるように、キーにネスト可能な接続詞と論理和を追加します。
a = 1, b = 2 , c in {1,2,3} | d = 4, ( e = 5 | e = 2, (f = 3, f = 4))
しかし今のところ、pyparsingがsetParseAction関数を呼び出す方法を理解するのに苦労しています。渡される引数の数に関しては魔法があることは知っていますが、関数に引数がまったく渡されていないというエラーが発生します。だから現在、私がそうするなら:
grammar.parseString('hi in {1,2,3}')
このエラーが発生します:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/site-packages/pyparsing.py", line 1021, in parseString
loc, tokens = self._parse( instring, 0 )
File "/usr/lib/python2.6/site-packages/pyparsing.py", line 894, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/usr/lib/python2.6/site-packages/pyparsing.py", line 2478, in parseImpl
ret = e._parse( instring, loc, doActions )
File "/usr/lib/python2.6/site-packages/pyparsing.py", line 894, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/usr/lib/python2.6/site-packages/pyparsing.py", line 2351, in parseImpl
loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
File "/usr/lib/python2.6/site-packages/pyparsing.py", line 921, in _parseNoCache
tokens = fn( instring, tokensStart, retTokens )
File "/usr/lib/python2.6/site-packages/pyparsing.py", line 675, in wrapper
return func(*args[limit[0]:])
TypeError: keyin_act() takes exactly 3 arguments (0 given)
トレースバックからわかるように、私はpython2.6を使用しており、1.5.6をpyparsingしています。
関数が適切な数の引数を取得していない理由について、誰かが私に洞察を与えることができますか?