Разбор нескольких исходных файлов C - PullRequest
0 голосов
/ 07 марта 2011

У меня есть несколько исходных файлов C и соответствующие файлы заголовков. Я пытаюсь проанализировать эти файлы с помощью компилятора, например, ANTLR. В грамматике синтаксического анализатора ANTLR вы можете определить свои заголовочные файлы, используя

@parser::includes
{#include"a.h"}

Вы можете начать анализ первого файла, например,

CommonTree tree = Parser.start("a.c"); 

и парсер проанализирует заголовочный файл

a.h 

но как анализировать файлы, если у вас есть несколько исходных файлов, например b.c, c.c и т. д. с соответствующими заголовочными файлами.

1 Ответ

3 голосов
/ 07 марта 2011

C - это свинья для анализа - семантический тип токена зависит от того, как он был объявлен.Рассмотрим:

T(*b)[4]

Если T - это имя типа, то это объявление переменной.Если это идентификатор, это функциональный вызов.Чтобы решить эту проблему, любой синтаксический анализатор C, который ожидает фактической работы, должен будет поддерживать среду полного типа, что означает, что он должен быть неприятно большим фрагментом компилятора C.

Существуют парсеры ANTLRдля C, которые все это правильно делают, но их нетривиально использовать, и я не имею никакого опыта их использования, поэтому не могу комментировать там.

Вместо этого вы можете захотеть взглянуть на использование внешних инструментов, чтобы разобрать ваш C во что-то, с чем легче иметь дело. gcc-xml является одним из таких;он использует сам gcc для разбора исходных файлов, а затем выкладывает XML, который гораздо проще обрабатывать.

...