Получение значений констант перед компиляцией - PullRequest
0 голосов
/ 19 марта 2019

Мне нужно проверить, используются ли некоторые константные строки функцией, я назову это 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);                                                 
}

Я хочу получить Fizz, Buzz и Bar как мой вывод.

В настоящее время я пытался реализовать это в Python, используя регулярные выражения для поиска SpecialFunc, но эта реализация становится очень запутанной и трудной, когда вам приходится искать константы.и становится еще более запутанным с вопросами определения объема.Clang был моим следующим вариантом, чтобы попытаться разобрать все, но я не был уверен, что есть лучший способ.

Как лучше всего это сделать?Python - это текущий язык, который я пытался использовать для этого, но я открыт и для перехода на другой язык.

1 Ответ

0 голосов
/ 19 марта 2019

Хорошо, поскольку вы не хотите использовать RegEx, и вы сформулировали свой вопрос так же, как и в глубоком анализе кода, я теперь предлагаю использовать (часть) компилятор для лексического анализа.Этот способ очень сложный и трудоемкий.Но вы можете проанализировать практически все, что касается вашего кода.И вы многому научитесь.

Итак, основная идея заключается в том, что компилятор берет ваш код на C / C ++ и сначала выводит его в граф, называемый AST (абстрактное синтаксическое дерево).На этом графике вы можете найти так называемые токены, которые представляют ваши различные «части» программы.

Идея проста: если вы скажете компилятору, что не хотите оптимизировать, прежде чем лексер построит AST, тогдавы найдете либо ваши строки, либо переменные, которые будут содержать строки.Поэтому вам нужно взять AST, найти все соответствующие функции и затем проверить параметры, являются ли они строками или переменными строк.

Несколько лет назад я сделал нечто подобное с пакетом python "pycparser".

Однако я должен предупредить вас, что это будет много работы.Я настоятельно рекомендую вам сначала спросить себя, почему вы хотите сделать это, и проверить, нет ли доступных инструментов для выполнения того, что вы хотите сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...