Поиск вызовов определенной функции в файле c ++ с использованием Python - PullRequest
1 голос
/ 31 октября 2008

Мне нужно найти все вхождения вызова функции в файле c ++ с использованием python и извлечь аргументы для каждого вызова.
Я играю с пакетом pygccxml , и извлечь аргументы из строки с помощью вызова функции очень просто:

from pygccxml.declarations import call_invocation

def test_is_call_invocation(call):
    if call_invocation.is_call_invocation(call):
        print call_invocation.name(call)
        for arg in call_invocation.args(call):
            print "   ",arg
    else:
        print "not a function invocation"

То, что я не смог найти, - это способ получения вызовов, разбирающих файл:

from pygccxml import parser
from pygccxml import declarations

decls = parser.parse( ['main.cpp'] )
# ...

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

1 Ответ

2 голосов
/ 31 октября 2008

XML-GCC не может этого сделать, потому что он сообщает только о типах данных (и сигнатурах функций). Он игнорирует функции тела. Чтобы увидеть это, создайте a.cc:

void foo()
{}

void bar()
{
        foo();
}

и затем запустите gccxml a.cc -fxml=a.xml. Посмотрите на сгенерированный a.xml, чтобы увидеть, что единственное упоминание foo (или его id) находится в объявлении foo.

Альтернатива может быть доступна в codeviz (http://www.csn.ul.ie/~mel/projects/codeviz/).). Он состоит из патча для gcc 3.4.6, который генерирует информацию о зависимости вызовов - плюс некоторые сценарии perl, которые генерируют входные данные graphviz; последний вы можете смело игнорировать.

В качестве еще одной альтернативы (которая не нуждается в модификации gcc), вы можете скопировать подход из egypt (http://www.gson.org/egypt/);, который анализирует дампы GCC RTL. Он должен работать с любым недавним GCC, однако, это может быть Вы не получаете вызовы встроенных функций.

В любом случае, при таких подходах вы не будете получать «вызовы» макросов, но на самом деле это может быть лучший выбор.

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