Pyparsing функция setParseAction не получает аргументов

Я пытаюсь разобрать простой язык запросов ключ = значение. На самом деле я добился этого с помощью огромного синтаксического анализатора монстров, который затем я делаю во второй раз, чтобы очистить дерево синтаксического анализа. Что я хотел бы сделать, так это сделать чистый синтаксический анализ снизу вверх, который включает такие вещи, как использование наборов для пар (key, val), чтобы исключить избыточные пары и т. д. Хотя у меня это работало раньше, я не чувствую, что я полностью понял, почему pyparsing действовал именно так, как это было, поэтому я много работал и т. д., своего рода борясь с зерном.

На данный момент это начало моего «упрощенного» синтаксического анализатора:

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 и pyparsing 1.5.6

Может ли кто-нибудь дать мне некоторое представление о том, почему функция не получает нужное количество аргументов?

16
задан deontologician 16 April 2012 в 16:47
поделиться