【发布时间】:2010-11-02 23:15:49
【问题描述】:
我正在尝试提取 C++ 文件中定义的命名空间。
基本上,如果我的 C++ 文件包含:
我希望能够检索:n1、n1::n2、n1::n3。
有人对我如何使用 python-regex 执行此操作有任何建议吗?
谢谢。
【问题讨论】:
标签: c++ python regex namespaces
我正在尝试提取 C++ 文件中定义的命名空间。
基本上,如果我的 C++ 文件包含:
我希望能够检索:n1、n1::n2、n1::n3。
有人对我如何使用 python-regex 执行此操作有任何建议吗?
谢谢。
【问题讨论】:
标签: c++ python regex namespaces
使用正则表达式搜索命名空间名称非常简单。但是,要确定嵌套级别,您必须跟踪源文件中的大括号嵌套级别。这是一个解析问题,不能(理智地)用正则表达式解决。此外,您可能必须处理文件中的任何 C 预处理器指令,这些指令肯定会影响解析。
C++ 是一种众所周知的难以完全解析的语言,但您可以使用标记器和花括号计数器来解决问题。
【讨论】:
您不能完全忽略预处理器指令,因为它们可能会引入额外的命名空间。我看过很多类似的代码:
#define __NAMESPACE_SYSTEM__ namespace system
__NAMESPACE_SYSTEM__ {
// actual code here...
}
然而,我看不出有任何理由使用这样的指令,除了打败正则表达式解析策略......
【讨论】:
大多数时候,当有人问如何使用正则表达式做某事时,他们做错了事。我不认为这个案子有什么不同。
如果要解析c++,则需要使用c++解析器。可以做很多事情来打败正则表达式,但仍然是有效的 c++。
【讨论】:
你可以为它写一个基本的词法分析器。没那么难。
【讨论】:
需求很简单,您可能不需要复杂的解析器。您需要:
如果满足其他条件,这种简单的方法就有效:
我不认为这对你的消息来源有太多要求。
【讨论】:
这就是我今天早些时候所做的:
添加的各种健全性检查表明我成功处理了 99.925% 的文件(6678 个文件中有 5 次失败)。问题是由于字符串中很少的“{”或“}”导致的 { 和 } 的数量不匹配,以及预处理器指令的不干净使用。
但是,我只处理头文件,并且我拥有代码。这限制了可能导致某些问题的场景数量,我可以手动修改我未涵盖的场景。
当然,我知道在很多情况下它会失败,但对于我想要实现的目标来说,这可能已经足够了。
感谢您的回答。
【讨论】: