Попробуйте опцию gcc -fdump-tree-fixupcfg-lineno
.
Он будет "красиво печатать" синтаксический анализ AST (с номерами строк) таким образом, который может быть легко проанализирован с использованием относительно простого лексера или любого механизма регулярных выражений. Просто найдите все не ключевые слова, перед которыми стоит «=», а затем «(» - это будут вызовы функций.
Все сложные выражения будут разбиты на несколько строк, поэтому в одной строке не будет двух вызовов функций.
Взять простую программу:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI (3.1415926536)
int main(int argc, char *argv[]) {
double angle = PI / 2.0;
printf("Sine = %lf, cosine = %lf\n", sin(angle), cos(angle));
return EXIT_SUCCESS;
}
Скомпилируйте его с помощью -fdump-tree-fixupcfg-lineno
, и вы получите что-то вроде этого:
main (argc, argv)
{
double angle;
int D.3381;
double D.3380;
double D.3379;
# BLOCK 2, starting at line 8
# PRED: ENTRY (fallthru)
[test.c : 8] angle = 1.57079632680000003119857865385711193084716796875e+0;
[test.c : 9] D.3379 = [test.c : 9] cos (angle);
[test.c : 9] D.3380 = [test.c : 9] sin (angle);
[test.c : 9] printf (&"Sine = %lf, cosine = %lf\n"[0], D.3380, D.3379);
[test.c : 10] D.3381 = 0;
return D.3381;
# SUCC: EXIT
}
Вы не получите никаких сложных выражений - только назначения и вызов функции и никаких макросов CPP, которые очень легко анализировать. Циклы и условные выражения не усложняют задачу.