2012-02-10 87 views
1

我是一个pyparsing的新蜜蜂我想尝试setParseAction,但它并没有被调用有时。 下面是代码Pyparsing SetParseAction问题

def fun(): 
    comdty_tok = StringStart() + Word(alphas) + StringEnd() 
    comdty_tok.setParseAction(call_back) 
    comdty_tok.leaveWhitespace() 
    return comdty_tok 

def call_back(p): 
    print 'Calling ....' 
    print p 

class ComdtyTok(Token): 

    comdty_tok = StringStart() + Word(alphas) + StringEnd() 
    comdty_tok.setParseAction(call_back) 
    comdty_tok.leaveWhitespace() 
    parseImpl = comdty_tok.parseImpl 

class SymParser(object): 
    tok = ComdtyTok() 
    @staticmethod 
    def parse(symbol): 
     p = SymParser.tok.parseString(symbol) 
     print p 
     print "Second" 
     x = fun() 
     x.parseString(symbol) 
     return p 

SymParser.parse('ABCD') 

我不明白为什么setParseAction不叫首次。

回答

2

我只是打了pyparsing的第一次,所以...

在初始化类变量comdty_tok你从来没有实际调用parseString(),因此与解析对象关联的回调永远不会被调用。

+0

我不认为这是它 - 解析中的第一条语句是'p = SymParser.tok.parseString(symbol)'。 – PaulMcG 2012-02-10 19:26:24

+0

@PaulMcGuire:你说得对。我刚刚在这只小狗的胆量中花了大约1/2小时,坦率地说,我很困惑。在两个令牌实例上设置'setDebug()'只会增加神秘感。第一次调用显示根本没有调试输出,而第二次调用按预期进行。如果你用'= fun()'初始化'SymParser.tok',那么所有东西都是甜美和轻盈的。 – 2012-02-10 20:32:41

+0

+1为了尽力弄清楚这个...... – PaulMcG 2012-02-10 21:07:00

1

我只能说,我并没有真正打算让像Token这样的班级以你所做的方式扩展。我怀疑在您的代表团中所包含的cmdty_tok属性中,您已省略公开某些其他属性,例如parseAction,这通常会在解析时引用parseImpl。另一方面,您的fun()的实现与我已经使用和看到的其他帮助程序和关闭非常一致,并且毫不奇怪,此方法可行。

你想用ComdtyTok完成什么?

+0

基本上我想抽象出一个类中的所有正则表达式,我读过这个我们可以通过继承Token类来做到这一点,但是我不确定控件正在与此流动。 – 2012-02-11 12:41:17