【问题标题】:Using python regex to extract namespaces from C++ sources使用 python regex 从 C++ 源代码中提取命名空间
【发布时间】:2010-11-02 23:15:49
【问题描述】:

我正在尝试提取 C++ 文件中定义的命名空间。
基本上,如果我的 C++ 文件包含:

命名空间 n1 { ... namespace n2 { ... } // 结束命名空间 n2 ... namespace n3 { ...} //结束命名空间 n3 ... } //结束命名空间n1

我希望能够检索:n1、n1::n2、n1::n3。

有人对我如何使用 python-regex 执行此操作有任何建议吗?

谢谢。

【问题讨论】:

    标签: c++ python regex namespaces


    【解决方案1】:

    使用正则表达式搜索命名空间名称非常简单。但是,要确定嵌套级别,您必须跟踪源文件中的大括号嵌套级别。这是一个解析问题,不能(理智地)用正则表达式解决。此外,您可能必须处理文件中的任何 C 预处理器指令,这些指令肯定会影响解析。

    C++ 是一种众所周知的难以完全解析的语言,但您可以使用标记器和花括号计数器来解决问题。

    【讨论】:

    • 这证实了我的担心。我相信我会听从您的建议:使用正则表达式提取命名空间名称和另一种处理大括号级别的方法。在这个阶段,我将忽略 C 预处理器指令。感谢您的回答。
    • 请注意,您可以通过 cpp(预处理器)运行您的源代码并只处理 C++ 代码,因为编译器会看到它,但这意味着您还将看到命名空间声明 #included 通过头文件(例如.std).
    【解决方案2】:

    您不能完全忽略预处理器指令,因为它们可能会引入额外的命名空间。我看过很多类似的代码:

    #define __NAMESPACE_SYSTEM__ namespace system
    
    __NAMESPACE_SYSTEM__ {
       // actual code here...
    }
    

    然而,我看不出有任何理由使用这样的指令,除了打败正则表达式解析策略......

    【讨论】:

      【解决方案3】:

      大多数时候,当有人问如何使用正则表达式做某事时,他们做错了事。我不认为这个案子有什么不同。

      如果要解析c++,则需要使用c++解析器。可以做很多事情来打败正则表达式,但仍然是有效的 c++。

      【讨论】:

        【解决方案4】:

        你可以为它写一个基本的词法分析器。没那么难。

        【讨论】:

          【解决方案5】:

          需求很简单,您可能不需要复杂的解析器。您需要:

          • 提取命名空间名称
          • 计算开/关大括号以跟踪命名空间的定义位置。

          如果满足其他条件,这种简单的方法就有效:

          • 您不会在 cmets 或字符串内部得到虚假命名空间,例如字符串
          • 您不会在 cmets 或字符串中获得无与伦比的开/关大括号

          我不认为这对你的消息来源有太多要求。

          【讨论】:

            【解决方案6】:

            这就是我今天早些时候所做的:

            • 从 C++ 文件中提取注释
            • 使用正则表达式提取命名空间定义
            • 使用简单的字符串搜索来获取左大括号和右大括号的位置

            添加的各种健全性检查表明我成功处理了 99.925% 的文件(6678 个文件中有 5 次失败)。问题是由于字符串中很少的“{”或“}”导致的 { 和 } 的数量不匹配,以及预处理器指令的不干净使用。

            但是,我只处理头文件,并且我拥有代码。这限制了可能导致某些问题的场景数量,我可以手动修改我未涵盖的场景。

            当然,我知道在很多情况下它会失败,但对于我想要实现的目标来说,这可能已经足够了。

            感谢您的回答。

            【讨论】:

              猜你喜欢
              • 2012-01-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-02
              • 2016-05-14
              相关资源
              最近更新 更多