Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打印分析结果的树_Python_Pyparsing - Fatal编程技术网

Python 打印分析结果的树

Python 打印分析结果的树,python,pyparsing,Python,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

我正在使用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()
漂亮的打印不是强制性的,假装的是树结构


是否有办法进行打印,否则我需要为所有规则设置一个setParseAction?

看起来您需要为每个规则设置一个setParseAction


From:“将解析操作附加到每个表达式,但这里有一个诀窍:使用类而不是函数。将调用类的init方法,并返回该类的实例。”

对于许多代码,更喜欢添加答案而不是编辑问题

不是完美的,级别不正确,如果我可以从printAction获得resultsName,那么这些类可能会被丢弃。也许应该提出一个新问题:-/

如果有人使用它并进行改进,请说明如何:)

#/usr/bin/python
从pyparsing导入*#Word,可选,一个或多个,组,ParseException
数据=转发()
级别=0
arrayExpr=Forward()
def数据_阵列(s、l、t):
n=int(t[0],16)

谢谢,我做了一些像SimpleBoleExcellent的东西!我认为您的实现看起来是一个合理的开始。这正是我想要的!没有标记,很难理解树中的类型。
 - 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
#!/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]