2012-02-10 51 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