【问题标题】:Making a parser to extract function name, parameters, return type制作解析器以提取函数名、参数、返回类型
【发布时间】:2019-03-24 21:16:33
【问题描述】:

我需要解析一个 C++ 类文件 (.h) 并提取以下信息:

  1. 函数名称
  2. 返回类型
  3. 每个函数的参数类型列表

假设有一个特殊的标签,我可以使用它来识别我是否需要解析一个函数。

例如。

#include <someHeader>  

class Test
{
    public:
    Test();

    void fun1();
    // *Expose* //
    void fun2();  

};

所以我只需要解析 fun2()。

我阅读了基本语法here,但发现它太复杂而无法理解。

第一季度。我无法弄清楚这项任务有多复杂。有人可以为函数声明提供一个更简单的语法来执行这种解析吗?

第二季度。我的方法是正确的还是应该考虑使用一些库而不是重新发明?


编辑:澄清一下,我没有解析问题,问题更多是理解我需要解析的语法。

【问题讨论】:

  • 但是你为什么要解析 C++ 头文件?
  • 如果您不必这样做(例如,对于家庭作业),请不要重新实现,而是使用库/其他工具来执行此操作。 C++ 很难解析。
  • @NeelBasu 我将获得一个头文件,其中包含一些标记为“待公开”的函数。我需要制作相同的适配器和代理类,这需要我知道确切的函数名称、参数等。

标签: c++ parsing


【解决方案1】:

C++ 标头可能包含任意 C++ 代码。因此,解析标头可能与解析各种 C++ 代码一样困难。

如果您可以对头文件做出某些假设,您的任务就会变得更容易。例如,如果你的函数前面总是有一个 EXPOSE 标记,并且函数总是在一行上,你可以先用 grep 查找这些行:

grep -A1 EXPOSE <files>

然后你可以应用正则表达式来过滤掉你需要的信息。

不过,我还是建议使用现有工具。 This seems to be a tutorial 了解如何使用 clang 和 Python 进行操作。

【讨论】:

  • 这正是我的做法。我用 C++ 本身解析它没有问题,问题是我发现语法本身很难理解,因此要真正考虑解析所需的逻辑。
【解决方案2】:

GCC XML 是一个开源工具,它发出 AST(抽象语法树)。请参阅this 其他答案,我在其中发布了有关我使用它的信息。

您应该考虑仅在您精通(或类似学习)用于检查 AST 的 XML 分析器时使用。这是一个相当复杂的结构......

无论如何,您都需要为识别您所需的 sn-ps 的 cmets 进行“grep”,因为 cmets 在输出 XML 中丢失。

【讨论】:

    【解决方案3】:

    如果您只是为了文档而这样做,doxygen 可能是一个不错的选择。

    无论哪种方式,它都可以为您提供一些关于如何执行此操作的指示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 2023-02-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 2021-05-01
      相关资源
      最近更新 更多