Если вы используете универсальные ctags (https://ctags.io),, readtags, распространяемые как часть u-ctags, могут вам помочь. Команда readtags поддерживает фильтрацию на основе S-выражений.
[yamato@slave]~/var/ctags-github% cat /tmp/a.c
cat /tmp/a.c
int f[10];
int g;
struct point {
int x, y;
} points [64][32];
[yamato@slave]~/var/ctags-github% ./ctags --kinds-C=v --fields=+t /tmp/a.c
./ctags --kinds-C=v --fields=+t /tmp/a.c
[yamato@slave]~/var/ctags-github% cat tags
cat tags
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
!_TAG_PROGRAM_VERSION 0.0.0 /26a9333b/
f /tmp/a.c /^int f[10];$/;" v typeref:typename:int[10]
g /tmp/a.c /^int g;$/;" v typeref:typename:int
points /tmp/a.c /^} points [64][32];$/;" v typeref:struct:point[64][32]
[yamato@slave]~/var/ctags-github% ./readtags -t tags -e -Q '(substr? ($ "typeref") "[")' -l
./readtags -t tags -e -Q '(substr? ($ "typeref") "[")' -l
f /tmp/a.c /^int f[10];$/;" kind:v typeref:typename:int[10]
points /tmp/a.c /^} points [64][32];$/;" kind:v typeref:struct:point[64][32]