全球旧事资料 分类
;4)数组;5)联合体;6)位域。
以ASTCo
sumer的接口函数Ha
dleTopLevelDecl(DeclGroupRefDG)为入口点,从AST的顶层节点Tra
slatio
U
itDecl开始,该节点下的子节点类型有TypedefDecl,E
umDecl,RecordDecl,Fu
ctio
Dec。结构体定义属于RecordDecl,自定义的成员类型定义信息来自于TypedefDecl,而枚举类型信息在E
umDecl节点。因此需要分析AST中的Tra
slatio
U
itDecl顶级节点下的所有TypedefDecl,E
umDecl和RecordDecl节点。每种节点类型的都是继承自NamedDecl。
首先获取Decl的名称,可以通过NamedDecl的getNameAsStri
g()实现。有些可能是匿名,获取Decl名字为空,如“typedef…TypeA;”,这时可以通过getTypedefNameForA
o
Decl()获取匿名Decl的TypedefNameDecl,若该匿名对象的TypedefNameDecl为空,该Decl将不可能作为结构体成员类型,可以忽略。
下面依次介绍TypedefDecl、E
umDecl,和RecordDecl节点信息的提取。
1)TypedefDecl节点
f龙源期刊网httpwwwqika
comc
如“typedefAB;”,获取到的Decl的名称是B,此时需要分析出B的原始类型名称,原始类型可以是内置数据类型,或自定义结构体类型或枚举类型等,提取出新类型与基础类型的对应关系。当A不属于基础类型,将继续分析A的基础类型,直至找到基础类型C作为B的基础类型。
将提取到的新类型名称与基础类型名称的信息作为typedefs的子节点存入XML文件:
2)E
umDecl节点
分析出枚举类型名字后,通过遍历E
umDecl的枚举向量来提取枚举成员字符串与数值,将信息作为e
ums的子节点写入XML文件:
item
ame”Item2”value”1”
3)RecordDecl节点
RecordDecl下除了struct类型还有其它类型,本文只关注RecordDecl下的struct类型,可以通过下isStruct()判断。在结构体成员不为空,即field_empty()为FALSE时,通过访问ASTRecordLayout对象,getFieldCou
t()可以获取结构体成员个数FiledCou
t,getSize()可以获取结构体的大小。将信息作为structs的子节点存入XML文件:
,其中size值为字节数。
通过遍历RecordDecl::field_iterator来获取结构体成员变量信息,getFieldI
dex()可以获取成员变量索引值,getFieldOffset(fieldI
dex)可以获取索引值为fieldI
dex的成员在结构体中的偏移值,getName()可以获取该成员的变量名,getType()可以获取该成员的类型,成员变量的大小需要通过getASTCo
text()获取ASTCo
text对象,进而由getTypeSize(fieldType)获取。将信息作为该struct节点的子节点存入XML文件:
,其中size值表示二进制位数,baseType为对成员变量类型的原始类型的分类码,内嵌类型为0,结构体类型为1,数组类型为2,联r
好听全球资料 返回顶部