私は 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。したがって、構造体にメンバーを入力する必要があります。ここに疑似コードがあります。
s = get_struct_by_name("struct_header")
...
member = Member(name, type, size)
s.append(member)
このようなパターンがすべてのファイルで繰り返されます。したがって、これを1つの複数行の文字列として処理できる正規表現を何らかの形で記述する必要があります。