Estoy usando pyparsing para analizar una cadena hexadecimal y estoy buscando una forma automática de imprimir el árbol de análisis sintáctico.Imprimir un árbol de pyparsing resultado
Un acercamiento cercano es el volcado de comando pero imprime mucha información duplicada.
Por ejemplo:
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()
El objetivo es que la consecuencia de result.dump() era algo similar a
- 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
La impresión bonita no es obligatorio, la pretendida es la estructura de árbol .
¿Hay alguna manera de hacer esta impresión o necesitaré un setParseAction para todas las reglas?
Gracias, he hecho algo así como el SimpleBool – Nine
Excelente! Estoy pensando que su implementación parece un comienzo razonable. –
exactamente lo que estaba buscando! sin el etiquetado es difícil dar sentido a los tipos en el árbol. – dashesy