检索C ++程序/文件中使用的指针变量列表

时间:2012-09-25 17:43:39

标签: c++ parsing pointers

有什么方法可以编写一个返回C ++文件中使用的所有指针变量名的方法。

例如:c ++文件(abc.cpp)

.......
//some code here
.....
emp* emp1 = do_something();
int a = 10;
student* std1 = getdata();

... ..

当我解析这个文件(abc.cpp)时,我应该在输出中得到两个变量。

  • 输出

EMP1 STD1

有没有一些内置的方法/过程可以告诉变量的类型,只列出变量的指针类型。

由于

4 个答案:

答案 0 :(得分:1)

在C ++本身中没有内置的方法或程序。但是,您可以找到一个开源的c ++解析器并使用它来执行此操作。

关于此问题的堆栈溢出讨论:Good tools for creating a C/C++ parser/analyzer

答案 1 :(得分:0)

没有这样的事情。您必须打开文件并解析它的内容以找出您想要找到的内容。您可以使用Boost Regular Expressions执行此操作。

答案 2 :(得分:0)

当然,使用标准C ++工具无法做到这一点。我做这项工作的理论将是:

  1. 将整个.cpp读入std :: string:

    std::ifstream ifs("filename.cpp");
    std::string str((std::istreambuf_iterator<char>(ifs)), 
                     std::istreambuf_iterator<char>());
    
  2. 找到放在'*'和'='符号之间的字符串中的所有字符串,并将它们放在数组std :: vector中 - 确定它是非常粗略的算法但是适用于简单的任务;

    < / LI>
  3. 对于此数组中的每个字符串,请删除所有空格。
  4. 打印所有数组元素。

答案 3 :(得分:0)

以下是代码:

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <cctype>

using namespace std;

vector< string > types;
set< string > names;

int main() {
    types.push_back( "int" );
    types.push_back( "char" );
    types.push_back( "float" );
    types.push_back( "double" );
    types.push_back( "bool" );
    types.push_back( "unsigned" );
    types.push_back( "long" );
    types.push_back( "short" );
    types.push_back( "wchar_t" );

    // ect

    fstream in( "input.cpp", fstream::in );
    string row;
    string tmp;

    while( in >> tmp ) {
        if( tmp == "struct" || tmp == "class" ) {
            in >> tmp;
            string::iterator it = find( tmp.begin(), tmp.end(), '{' );
            tmp.erase( it, tmp.end() );
            types.push_back( tmp );
        }
        row += tmp;
    }

    for( int i=0; i<types.size(); ++i ) {
        int it=-1;

        while( ( it=row.find( types[ i ], it+1 ) ) ) {
            if( it == -1 ) break;
            int spos;
            for( spos=it; row[ spos ] != '*'; ++spos );
            spos++;

            string ptr;

            while( ( isalnum( ( int )row[ spos ] ) || row[ spos ] == '_' ) && spos < row.size()  ) {
                ptr += row[ spos ];
                spos++;
            }

            names.insert( ptr );
        }
    }

    for( set< string >::iterator i=names.begin(); i!=names.end(); ++i ) {
        cout << *i << " ";
    }


    return 0;
} 

我基本上做的是,我将整个输入程序放入一行,没有空格,然后检查用户定义的结构或类,我将其插入到类型向量中,最后我搜索每种类型(如果存在)行中<type>*形式的内容。然后,我打印出来。