2012-03-23 22 views
6

Tôi đang sử dụng pyparsing để phân tích một chuỗi hex và tôi đang tìm kiếm một cách tự động để in cây phân tích cú pháp.In một cây kết quả pyparsing

Cách tiếp cận gần là đổ lệnh nhưng in nhiều thông tin trùng lặp.

Ví dụ:

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() 

Mục tiêu là kết quả của result.dump() là một cái gì đó tương tự như

- 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 

Các in khá là không bắt buộc, nhưng giả vờ là cấu trúc cây .

Có cách nào để tạo bản in này hoặc tôi sẽ cần có setParseAction cho tất cả các quy tắc không?

Trả lời

4

Có vẻ như bạn sẽ cần setParseAction cho từng quy tắc.

Từ parsing to object hierarchy: "Đính kèm phân tích hành động để mỗi biểu thức, nhưng ở đây là lừa: sử dụng một lớp thay vì một hàm init phương pháp của lớp sẽ được gọi và trả về một thể hiện của lớp đó.".

+0

Cảm ơn, tôi đã thực hiện một cái gì đó giống như SimpleBool – Nine

+2

Tuyệt vời! Tôi nghĩ việc triển khai của bạn trông giống như một khởi đầu hợp lý. –

+1

chính xác những gì tôi đang tìm kiếm! mà không gắn thẻ, thật khó để hiểu được các loại trong cây. – dashesy

2

Ưu tiên thêm câu trả lời thay vì chỉnh sửa câu hỏi, cho nhiều mã ..

Không hoàn hảo, các cấp không đúng và lớp có thể bị hủy nếu tôi có thể lấy resultsName từ printAction. Có lẽ nên tạo một câu hỏi mới: -/

Nếu ai đó sử dụng nó và nâng cao xin nói như thế nào :)

#!/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] 
Các vấn đề liên quan