2012-03-23 68 views
6

我正在使用pyparsing來分析十六進制字符串,並且我正在搜索打印解析器樹的自動方式。打印pyparsing結果樹

附近的方法是命令轉儲,但它打印了很多重複的信息。

例如:

from pyparsing import * #Word, Optional, OneOrMore, Group, ParseException 

data = Forward() 

arrayExpr = Forward() 

def data_array(s,l,t): 
    n = int(t[0], 16) 
    arrayExpr << (n * data) 
    return t[0] 

array = Word(hexnums, exact=2).setParseAction(data_array) + arrayExpr 

data << (Literal('01') + array.setResultsName('array') 
    | Literal('03') + Word(hexnums, exact=2)('char') 
    | Literal('04') + Word(hexnums, exact=2)('boolean')) 

frame = (Word(hexnums, exact=2)('id') \ 
    + data('data'))('frame') 

result = frame.parseString("02010203010302"); 
print result.dump() 

的目標是result.dump的是()結果是類似的東西,以

- frame: ['02', '01', '03', '03', '01', '04', '02', '03', '02'] 
    - id: 02 
    - array: ['03', '03', '01', '04', '02', '03', '02'] 
    - char: 01 
    - boolean: 02 
    - char: 02 

漂亮的印刷是不是強制性的,這個假是樹形結構。

有沒有辦法讓這個打印或我需要有一個setParseAction所有規則?

回答

4

看起來你需要每個規則的setParseAction。

parsing to object hierarchy:「附加解析動作每個表情,但這裏的竅門:使用一個類而不是函數類的初始化方法將被調用,並返回一個類的實例。」

+0

如何謝謝你,我做了類似的SimpleBool – Nine 2012-03-29 22:50:56

+2

好極了!我認爲你的實施看起來是一個合理的開始。 – 2012-03-30 20:11:23

+1

正是我在找的!沒有標籤,很難理解樹中的類型。 – dashesy 2015-01-22 17:01:08

2

寧可增加一個答案,而不是編輯的問題,以多代碼..

是不完美的,水平沒有得到正確和類可以被丟棄,如果我可以從printAction得到resultsName。或許應該創建一個新的問題: -/

如果有人使用它,並提高請說:)

#!/usr/bin/python 

from pyparsing import * #Word, Optional, OneOrMore, Group, ParseException 

data = Forward() 

level = 0 
arrayExpr = Forward() 

def data_array(s,l,t): 
    n = int(t[0], 16) 
    arrayExpr << (n * data) 
    return t[0] 

class TreeChild(object): 
    def __init__(self,t): 
     self.args = t 
    def __str__(self): 
     ret = " %s: " % self.name 
     return ' ' * level + ret + self.args[0] + "\n" 

class TreeBranch(object): 
    def __init__(self,t): 
     self.args = t 
    def __str__(self): 
     global level 
     level = level + 1 
     childs = " ".join(map(str,self.args)) 
     level = level - 1 
     ret = " %s: " % self.name + '\n' 
     return ' ' * level + ret + childs + "\n" 

class Frame(TreeBranch): 
    name = 'frame' 

class Char(TreeChild): 
    name = 'char' 

class Boolean(TreeChild): 
    name = 'boolean' 

class Id(TreeChild): 
    name = 'id' 

class Array(TreeBranch): 
    name = 'array' 

array = Suppress(Word(hexnums, exact=2).setParseAction(data_array)) + arrayExpr 

data << (Suppress(Literal('01')) + array.setResultsName('array').setParseAction(Array) 
    | Suppress(Literal('03')) + Word(hexnums, exact=2)('char').setParseAction(Char) 
    | Suppress(Literal('04')) + Word(hexnums, exact=2)('boolean').setParseAction(Boolean)) 

frame = (Word(hexnums, exact=2)('id').setParseAction(Id) \ 
    + data('data'))('frame').setParseAction(Frame) 

result = frame.parseString("020103030104020302"); 
print result[0]