gpt4 book ai didi

c++ - 解析/处理 C++ 文件的选项

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:31:10 25 4
gpt4 key购买 nike

所以我需要能够解析一些相对简单的带有注释的 C++ 文件,并从中生成额外的源文件。

举个例子,我可能有这样的东西:

//@ service
struct MyService
{
int getVal() const;
};

我需要找到//@ 服务注释,并获取其后结构的描述。

我正在考虑是否可以利用 LLVM/Clang,因为它似乎有库支持在第三方应用程序中嵌入编译器/解析功能。但就解析源代码而言,我真的一无所知,所以我不确定我到底需要寻找什么,或者从哪里开始。

我知道 AST 是语言表示的核心,并且库支持从 Clang 中的源文件生成 AST。但是注释不会真的成为 AST 的一部分,对吗?那么,找到遵循特定注释注释的结构表示的好方法是什么?

我不太担心处理注释出现在不适当位置的情况,因为它只会用于解析专门为此应用程序编写的 C++ 文件。但当然,我做得越稳固越好。

最佳答案

我一直这样做的一种方法是注释标识符:

  • 类(class)
  • 基类
  • 类(class)成员
  • 枚举
  • 调查员

例如:

class /* @ann-class */ MyClass 
: /* @ann-base-class */ MyBaseClass
{
int /* @ann-member */ member_;
};

这样的注释使得编写逐行读取标题并提取注释和相关标识符的 python 或 perl 脚本变得容易。

注解和关联的标识符使得以函数模板的形式生成 C++ 反射成为可能,函数模板遍历将基类和成员传递给仿函数的对象,例如:

template<class Functor>
void reflect(MyClass& obj, Functor f) {
f.on_object_start(obj);
f.on_base_subobject(static_cast<MyBaseClass&>(obj));
f.on_member(obj.member_);
f.on_object_end(obj);
}

为每个基类和成员生成数字 ID(枚举)并将其传递给仿函数也很方便,例如:

    f.on_base_subobject(static_cast<MyBaseClass&>(obj), BaseClassIndex<MyClass>::MyBaseClass);
f.on_member(obj.member_, MemberIndex<MyClass>::member_);

这样的反射代码允许编写将任何对象类型序列化和反序列化为多种不同格式的仿函数。仿函数使用函数重载和/或类型推导来适本地处理不同的类型。

关于c++ - 解析/处理 C++ 文件的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9174707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com