antlr генерировать ast для c и анализировать ast - PullRequest
2 голосов
/ 09 ноября 2011

Я делаю статический анализ на программе c. И я ищу на веб-сайте antlr, похоже, нет подходящего файла грамматики, который производит ast для программы c. Означает ли это, что я должен сделать это сам с самого начала.Есть более быстрый метод. Мне также нужен синтаксический анализатор дерева, который может проходить через аст, созданную синтаксическим анализатором.

Ответы [ 2 ]

4 голосов
/ 11 ноября 2011

Вы указали, что хотите выполнить статический анализ для обнаружения переполнения буфера.

Во-первых, написать грамматику для C сложнее, чем кажется. В стандарте есть все это, а потом то, что на самом деле принимают настоящие компиляторы. И вы должны решить, что делать с препроцессором (и это зависит от компилятора!). Если вы не правильно понимаете грамматику и предварительную обработку, вы не сможете проанализировать реальные программы. (Если вы хотите делать игрушечные языки, это нормально, но тогда вам не нужна грамматика Си).

Для анализа вам понадобится далеко * на 1006 * больше машин, чем у AST. Вам понадобятся таблицы символов, анализ управления и потока данных, вероятный локальный и глобальный анализ точек, извлечение графа вызовов и некоторый тип анализа диапазона.

Люди просто не понимают этого.

** Получение парсера - это долгий путь от того, чтобы делать что-нибудь полезное с настоящими языками **

Я кричу, потому что вижу это снова и снова и снова.

Если вы хотите продолжить выполнение конкретной задачи анализа программы или преобразования, если вы не хотите умереть от старости до того, как приступите к выполнению своей задачи, вам лучше найти фонд, в котором уже есть большая часть того, что вам нужно. Основание на генераторе синтаксического анализатора со скрипучей грамматикой не является основанием. (Не поймите меня неправильно: ANTLR, YACC, JavaCC - все это хорошие генераторы синтаксического анализатора, и они отлично подходят для создания синтаксического анализатора для нового языка. Они отлично подходят для реализации производственных синтаксических анализаторов для реальных языков, когда осуществляются инвестиции. Но они производят парсеры , и в основном люди не выполняют производственную часть. И они не предоставляют дополнительное оборудование в долгосрочной перспективе.)

Наш набор инструментов для реинжиниринга программного обеспечения DMS содержит все вышеперечисленное оборудование, потому что оно почти всегда необходимо, и это непростая задача для реализации. (Моя команда уже инвестировала 15 лет.)

Мы также указали, что механизм - это формы, особенно полезные для COBOL и Java, C, C ++ (в несколько меньшей степени, язык действительно сложен), на различных диалектах, так что другие не нужно повторять этот долгий процесс.

GCC и Clang достаточно развиты для C и C ++ в качестве альтернативы.

2 голосов
/ 09 ноября 2011

Самое сложное - это написать грамматику.Смешение правил перезаписи для создания AST не так сложно, и создание древовидной грамматики из грамматики синтаксического анализатора, которая испускает AST, тоже не , что сложно (по сравнению с написанием грамматики синтаксического анализатора, то есть).

Вот предыдущие вопросы и ответы, которые показывают, как создать правильный AST: Как вывести AST, построенный с использованием ANTLR?

И я не смог найти приличный SO-Вопросы и ответы, в которых объясняется, как создать древовидную грамматику, поэтому вот ссылка на мой личный блог, объясняющий это: http://bkiers.blogspot.com/2011/03/6-creating-tree-grammar.html

Удачи.

...