编译前获取常量值

时间:2019-03-18 21:40:52

标签: python c++ parsing

我需要检查某个函数是否使用了一些常量字符串,在我的示例中将其称为SpecialFunc,但这在普通情况下变得非常复杂。

假设我们有两个文件:

Foo.h:

class Foo {                                                                    
public:                                                                        
    void RandomFunc();                                                         
private:                                                                       
    static constexpr auto SomeConst {"Buzz"};                                  
}; 

Foo.cpp:

#include "Foo.h"                                                            

#include <string>                                                           

void Foo::RandomFunc() {                                                    

   SpecialFunc("Fizz");                                                     
   SpecialFunc(SomeConst);                                                  

   const std::string otherConst = "Bar";                                    
   SpecialFunc(otherConst);                                                 
}

我希望获得FizzBuzzBar作为我的输出。

当前,我尝试使用正则表达式在Python中实现此功能以找到SpecialFunc,但是当您必须搜索常量时,这种实现变得非常混乱且难以处理,并且变得更加混乱范围问题。 Clang是我尝试解析所有内容的下一个选择,但是我不确定是否有更好的方法。

解决此问题的最佳方法是什么?我一直在尝试使用Python作为当前的语言,但是我也愿意跳到另一种语言。

1 个答案:

答案 0 :(得分:0)

好吧,因为您不想使用RegEx,并且像在深度代码分析中一样想表达自己的问题,所以我现在建议使用(一部分)编译器进行词法分析。这种方式非常困难且耗时。但是您实际上可以分析有关代码的所有内容。而且您会学到很多。

因此,基本思想是编译器将您的C / C ++代码带入一个称为AST(抽象语法树)的图形中。在该图中,您可以找到所谓的令牌,它们代表程序的不同“部分”。

这个想法很简单:如果在词法分析器构建AST之前告诉编译器您不希望进行优化,那么您将找到字符串或包含字符串的变量。因此,您必须使用AST,查找所有相关功能,然后检查参数是字符串还是字符串变量。

几年前,我已经使用python包“ pycparser”做过类似的事情。

但是我必须警告您,这将是很多工作。我强烈建议您首先问自己为什么要这样做,并检查是否没有可用的工具来完成您想做的事情。