Парсер C# для разбора неполного кода C

Есть ли какой-нибудь синтаксический анализатор С#, который я мог бы использовать для анализа неполного исходного кода c. Я пытаюсь реализовать инструмент анализа эволюции исходного кода кода C на основе анализа различных версий кода C. До сих пор я пытался познакомиться с antlr4 для этой цели, но, похоже, он вообще не работает с неполным кодом.

Так может ли кто-нибудь порекомендовать мне любой парсер, который мог бы это сделать.

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

Ответы (1)

Наш набор инструментов для реинжиниринга программного обеспечения DMS с интерфейсом C может анализировать «неполный код».

В частности, при наличии синтаксического анализатора на основе DMS DMS предоставляет как

  • анализаторы нетерминальных шаблонов (то есть DMS будет анализировать любую строку, которая является нетерминалом, например, выражение, оператор, объявление. Такие анализы в случае успеха создают AST для назначенного нетерминала.
  • произвольные синтаксические анализаторы подстрок, которые анализируют именно это. Результатом является последовательность AST, покрывающая подстроку. Если подстрока окажется нетерминалом, вы получите только одно дерево.

Сложности возникают, если фрагмент использует макросы или условные операторы препроцессора. Вы можете предварительно настроить контекст синтаксического анализа с помощью необходимых определений макросов.

Конечно, DMS будет анализировать полные единицы компиляции, имеет полный препроцессор (для которого вы можете контролировать, какая часть «расширяется» по сравнению с тем, что сохраняется при разборе), а также построение таблицы символов и контроль и анализ потока данных. Последние биты применимы только к целым программам, но с некоторыми усилиями могут быть адаптированы для фрагментов программы.

Резюме:

  • Парсер на основе С#: НЕТ
  • Разбирает фрагменты C (и других языков): ДА