извлечение имен из файла заголовка (строковая операция)

#c #extract #file-handling

Вопрос:

Не удалось найти ошибку:

 #include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main () {
    string line;
    ifstream myfile ("a.h");

    vector<vector<string>> vect;
  
    if (myfile.is_open())
    {
        while (getline(myfile, line) )
        {
            vector<string> temp;
            if (line.substr(0, line.find(" ")) == (string)"int"){
                temp.push_back(line.substr(line.find(" ") 1));
            }
            if (line[0] == '}' amp;amp; line[line.size()-1] == ';')
            {
                string string_temp = line.substr(1, line.size()-1);

                cout << string_temp << endl;

                temp.insert(temp.begin(), string_temp);
                vect.push_back(temp);
                temp.clear();
            }
        }
        myfile.close();
    }
    else cout << "Unable to open file"; 
  
    for(auto t : vect){
        for(string s : t){
            cout << s << " ";
        }
        cout << endl;
    }

    return 0;
}
 

Мне нужно извлечь имя структуры и имена участников из .h файла;
где a.h выглядит так:

 typedef struct{
  int a;
  int b;
  int c;
}struct_req1_t;

 typedef struct{
  int d;
   int e;
   int f;
 }struct_rsp1_t;

 typedef struct{
    int g;
    int h;
    int i;
 }struct_req1_t;
 

Я подумываю о том, чтобы извлечь имена в виде 2D-вектора:

 structure_name1 member1 member2 member3
structure_name2 member1 member2 member3
 

Комментарии:

1. И в чем же проблема? Вы получаете ошибку компилятора? Пожалуйста, скопируйте и вставьте его в свой вопрос. Разве это не дает желаемого результата? Пожалуйста, укажите выход по току.

2. Если вы реализуете синтаксический анализатор .h, почему бы не использовать существующий: github.com/tree-sitter/tree-sitter или libclang?

3. Подумайте о файле.h как о текстовом файле, и мне придется выполнять операции со строками и файлами, чтобы преобразовать имена в 2D-вектор

4. В этом коде много ошибок. Ваш цикл не учитывает тот факт, что строки , в которых есть int поле, начинаются с пробела, поэтому line.find(" ") будет возвращать индекс перед int , таким образом line.substr(0, line.find(" ")) == (string)"int" , всегда будет ложным. Или тот факт, что некоторые строки пусты, таким образом if (line[0] == '}' amp;amp; line[line.size()-1] == ';') , для этих строк будет неопределенное поведение . Или тот факт, что вместо этого line.substr(1, line.size()-1) следует использовать line.size()-2 , чтобы опустить трейлинг ; из извлеченного string .

Ответ №1:

вы можете использовать cppast : он предоставит вам Абстрактное синтаксическое дерево, и вы сможете извлечь любую информацию из любого файла заголовка. Я успешно использовал его для создания удаленного генератора кода.