我的格式简单,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” - 结构的名称,以及其他 - 其成员。例如,成员1 - 名称“BCPNV”,类型0,大小0x5000c500。 所以我需要用成员填充struct,这里是伪代码:
s = get_struct_by_name("struct_header")
...
member = Member(name, type, size)
s.append(member)
这种模式重复所有文件。所以我需要以某种方式编写正则表达式,它可以将其作为一个多行字符串处理。