0

我有简单的格式,使用类似 C 的语法,但非常简单(少于 10 个可能的函数)。他们的格式不断定义。所以我决定不使用复杂的解析器,比如 pycparser 等,而是用're'模块解析东西(只需要一些信息)。所以,如果我有:

# id = AddStrucEx (-1, "struct_MTRR", 0);

然后我像这样解析它:

mkstruct_re = re.compile("""
    (?m)                                # Multiline
    ^[ \t]*id[ \t]*=[ \t]*AddStrucEx[ \t]*\(
    [ \t]*-1[ \t]*,[ \t]*
    "(?P<sname>.*)"                     # Structure name
    [ \t]*\,[ \t]*0
    [ \t]*\);[ \t]*$
""", re.VERBOSE)
mkstruct_group_name = dict([(v,k) for k,v in mkstruct_re.groupindex.items()])
mkstruct = mkstruct_re.finditer(idc)
for match in mkstruct :
    s = Struct()
    for group_index,group in enumerate(match.groups()) :
        if group :
            if mkstruct_group_name[group_index+1] == "sname" :
                s.name = group
    structs.append(s)

但是我需要做的是解析这样的事情:

# Case 1: not nested structures
# =============================
# id = GetStrucIdByName ("struct_header");
# mid = AddStructMember(id,"BCPNV", 0, 0x5000c500, 0, 7);
# mid = AddStructMember(id,"_", 0X7, 0x00500, -1, 1);
# mid = AddStructMember(id, "BCPNV_size",0X8, 0x004500, -1, 1);

其中“struct_header” - 结构的名称,以及其他 - 其成员。例如成员一 - 名称“BCPNV”,类型 0,大小 0x5000c500。所以我需要用成员填充结构,这是伪代码:

s = get_struct_by_name("struct_header")
...
member = Member(name, type, size)
s.append(member)

这种模式在所有文件中重复。所以我需要以某种方式编写正则表达式,它可以将其作为一个多行字符串处理。

4

0 回答 0