Вы указали, что хотите выполнить статический анализ для обнаружения переполнения буфера.
Во-первых, написать грамматику для C сложнее, чем кажется. В стандарте есть все это, а потом то, что на самом деле принимают настоящие компиляторы. И вы должны решить, что делать с препроцессором (и это зависит от компилятора!). Если вы не правильно понимаете грамматику и предварительную обработку, вы не сможете проанализировать реальные программы. (Если вы хотите делать игрушечные языки, это нормально, но тогда вам не нужна грамматика Си).
Для анализа вам понадобится далеко * на 1006 * больше машин, чем у AST. Вам понадобятся таблицы символов, анализ управления и потока данных, вероятный локальный и глобальный анализ точек, извлечение графа вызовов и некоторый тип анализа диапазона.
Люди просто не понимают этого.
** Получение парсера - это долгий путь от того, чтобы делать что-нибудь полезное с настоящими языками **
Я кричу, потому что вижу это снова и снова и снова.
Если вы хотите продолжить выполнение конкретной задачи анализа программы или преобразования, если вы не хотите умереть от старости до того, как приступите к выполнению своей задачи, вам лучше найти фонд, в котором уже есть большая часть того, что вам нужно. Основание на генераторе синтаксического анализатора со скрипучей грамматикой не является основанием. (Не поймите меня неправильно: ANTLR, YACC, JavaCC - все это хорошие генераторы синтаксического анализатора, и они отлично подходят для создания синтаксического анализатора для нового языка. Они отлично подходят для реализации производственных синтаксических анализаторов для реальных языков, когда осуществляются инвестиции. Но они производят парсеры , и в основном люди не выполняют производственную часть. И они не предоставляют дополнительное оборудование в долгосрочной перспективе.)
Наш набор инструментов для реинжиниринга программного обеспечения DMS содержит все вышеперечисленное оборудование, потому что оно почти всегда необходимо, и это непростая задача для реализации. (Моя команда уже инвестировала 15 лет.)
Мы также указали, что механизм - это формы, особенно полезные для COBOL и Java, C, C ++ (в несколько меньшей степени, язык действительно сложен), на различных диалектах, так что другие не нужно повторять этот долгий процесс.
GCC и Clang достаточно развиты для C и C ++ в качестве альтернативы.