使用clang / llvm AST api在C ++中解析复杂类型

时间:2016-09-21 14:07:25

标签: llvm-clang

我们说我有一个程序,其中包含以下声明:

std::vector<std::vector<std::vector<std::string> *> > s;

现在我想对此进行标记,将其分成几部分:

  1. 标准矢量
  2. 标准矢量
  3. 标准矢量指针
  4. 标准字符串
  5. 在浏览源代码时,这个例子会给我一个VarDecl。如果我理解正确,这个VarDecl包含整个声明。现在我认为下一步是在VarDecl上调用getType()。但那又怎样?我期待一种可以返回的方法,例如迭代器左右。

    在你的下方,我会看到我拥有的东西。这适用于例如&#34; int i&#34;或&#34; const char * const i = NULL;&#34;甚至对于&#34; const std :: string l =&#34; 12&#34;;&#34;但是&#34; std :: vector *&gt; &GT;秒;&#34;结果是&#34; int&#34;?(!?)。

    void dissectType(ASTContext *const Context, const QualType x)
    {
            if (x.isNull())
                    return;
    
            QualType type = x.getNonReferenceType();
    
            for(;!type.isNull();) {
                    if (type.hasQualifiers()) {
                            Qualifiers q = type.getQualifiers();
    
                            if (q.hasConst())
                                    printf("const ");
    
                            if (q.hasVolatile())
                                    printf("volatile ");
    
                            if (q.hasRestrict())
                                    printf("restrict ");
                    }
    
                    const Type *t = type.getTypePtr();
    
                    if (!t) {
                            printf("null?\n");
                            break;
                    }
                    else if (t -> isPointerType())
                            printf("* ");
                    else if (t -> isFundamentalType()) {
                            std::string curType = type.getUnqualifiedType().getAsString();
    
                            printf("%s\n", curType.c_str());
    
                            break; // should be last entry in this chain
                    }
    
                    type = type->getPointeeType();
            }
    }
    

0 个答案:

没有答案