C - это свинья для анализа - семантический тип токена зависит от того, как он был объявлен.Рассмотрим:
T(*b)[4]
Если T - это имя типа, то это объявление переменной.Если это идентификатор, это функциональный вызов.Чтобы решить эту проблему, любой синтаксический анализатор C, который ожидает фактической работы, должен будет поддерживать среду полного типа, что означает, что он должен быть неприятно большим фрагментом компилятора C.
Существуют парсеры ANTLRдля C, которые все это правильно делают, но их нетривиально использовать, и я не имею никакого опыта их использования, поэтому не могу комментировать там.
Вместо этого вы можете захотеть взглянуть на использование внешних инструментов, чтобы разобрать ваш C во что-то, с чем легче иметь дело. gcc-xml является одним из таких;он использует сам gcc для разбора исходных файлов, а затем выкладывает XML, который гораздо проще обрабатывать.