prosty przykład cppast

0

Ktoś może podpowiedzieć jak stworzyć prosty przykład z użyciem cppast https://github.com/standardese/cppast ?

chatgpt zaproponował rozwiązanie ale sie nie kompiluje

#include <cppast/cpp_file.hpp>
#include <cppast/cpp_class.hpp>
#include <cppast/visitor.hpp>
#include <cppast/cpp_entity.hpp>
#include <cppast/parser.hpp>

#include <iostream>
#include <string>
#include <fstream>

void visit_class(const cppast::cpp_class& cls) {
    std::cout << "Class found: " << cls.name() << std::endl;
}

int main() {
    const std::string filename = "ex1.h";  // Ścieżka do pliku nagłówkowego

    // Otwórz plik i przygotuj parser
    std::ifstream file_stream(filename);
    if (!file_stream.is_open()) {
        std::cerr << "Nie mogę otworzyć pliku: " << filename << std::endl;
        return 1;
    }

    // Wczytaj plik C++ i stwórz obiekt cpp_file
    cppast::cpp_file file;
    try {
        cppast::cpp_parser parser(file_stream);
        file = parser.parse();
    } catch (const std::exception& e) {
        std::cerr << "Błąd podczas parsowania pliku: " << e.what() << std::endl;
        return 1;
    }

    // Iteracja po jednostkach w pliku i wypisywanie nazw klas
    for (const auto& entity : file) {
        if (entity.kind() == cppast::cpp_entity_kind::class_t) {
            visit_class(static_cast<const cppast::cpp_class&>(entity));
        }
    }

    return 0;
}
0

tak przyklady obejrzałem, wszystkie bazuja na analizie compile_commands.json
ale caly projekt jest za bardzo abstrakcyjny , na szablonach i na ta chwile jeszcze nie ogarniam co tam sie dzieje 🙁

chciałem przeanalizować swoj jeden plik .H

podany przykład właśnie używa compile_commands.json
ale robi to w tak zagmatwany sposób ze nie rozumiem
chciałbym czysty prosty przykład
nawet mam pierwszy sukces bo juz mi parsuje pliki tylko nie potrafie wyswietlić zawartosci ATS
https://github.com/mariuszmaximus/cppast_one_file

do dzialania wymagany jest clang

#include <iostream>

#include <cppast/libclang_parser.hpp>
#include <cppast/visitor.hpp> 


void print_ast(const cppast::cpp_file& file)
{
    std::string prefix;
    // visit each entity in the file
    cppast::visit(file, [&](const cppast::cpp_entity& e, cppast::visitor_info info) {
        if (info.event == cppast::visitor_info::container_entity_exit) // exiting an old container
            prefix.pop_back();
        else if (info.event == cppast::visitor_info::container_entity_enter)
        // entering a new container
        {
            std::cout << prefix << "'" << e.name() << "' - " << cppast::to_string(e.kind()) << '\n';
            prefix += "\t";
        }
        else // if (info.event == cppast::visitor_info::leaf_entity) // a non-container entity
            std::cout << prefix << "'" << e.name() << "' - " << cppast::to_string(e.kind()) << '\n';
    });
}


int main()
{
    std::cout <<  "\n";
    std::cout <<  "\n";
    std::cout << "PARSE_FILE =" <<  PARSE_FILE << "\n";
    std::cout <<  "\n";
    std::cout <<  "\n";
    
    using parser_t = cppast::simple_file_parser<cppast::libclang_parser>;
    cppast::cpp_entity_index index;
    parser_t                 parser{type_safe::ref(index)};
    parser_t::config         config;
    config.set_flags(cppast::cpp_standard::cpp_17);


    auto file = parser.parse(PARSE_FILE, config);

    print_ast(file); <<< TU JEST PROBLEM !!!
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.