Современное состояние парсеров с ++? - PullRequest
4 голосов
/ 30 апреля 2011

Я понимаю, что это очень сложно сделать, что с #ifdef, #define и шаблонами, но каково состояние синтаксических анализаторов c ++ (будь то открытый код или проприетарный?).

Я имею в виду, что для университетского проекта я думаю о создании инструмента для анализа баз кода на С ++, но, кажется, очень трудно найти для него хороший анализатор.

Должен ли я сдаться и согласиться напарсеры java?Точно так же, в каком состоянии находятся Java-парсеры?А как насчет c #?

Кроме того, будет ли разрыв части синтаксического анализатора g ++ отдельно от него когда-либо работать для целей анализа кода, или это слишком много усилий для этого?

Ответы [ 4 ]

6 голосов
/ 30 апреля 2011

Вам повезло! Clang только что смог проанализировать большинство программ на С ++ за последние несколько месяцев: http://clang.llvm.org/ Это один из немногих парсеров с открытым исходным кодом, который на самом деле способен анализировать большую часть С ++. (В основном только GCC и CLANG, я слышал, что Oink (?) Иногда может быть довольно хорошим) И он создан для использования в качестве библиотеки IDE и тому подобным, даже имеет архитектуру, поддерживающую переписывание кода.

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

Что касается разрыва gcc, это не очень удобно для анализа кода, в зависимости от того, что вы пытаетесь сделать, вы можете использовать новую архитектуру плагинов, чтобы извлечь из нее некоторую полезную информацию, однако на очень раннем уровне анализа она выполняет то, что называется свертыванием терминов, где сам синтаксический анализатор оптимизирует такие вещи, как «x = x» (упрощенный пример). И другие аспекты компилятора ожидают, что это произойдет, поэтому удалить его нетривиально. Таким образом, делая gcc практически бесполезным для всего, что напоминает переписывание исходного кода.

3 голосов
/ 30 апреля 2011

Для C ++ вы можете использовать GCC с опцией -fdump-translation-unit & friends, чтобы получить от него AST.

См .: http://www.manpagez.com/man/1/g++/

Если вы можете что-то скомпилировать с помощью g ++, тогда вы можете получитьдерево из него.

2 голосов
/ 30 апреля 2011

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

Стандарт с открытым исходным кодом - GCC компилятор .Я слышал, это трудно понять и изменить.

Там есть CLANG , как упоминалось в других ответах.У меня нет опыта здесь.Насколько я понимаю, он довольно сложный, особенно с точки зрения поддержки анализа.

Наш проприетарный DMS Software Reengineering Toolkit имеет полный синтаксический анализатор C ++ с полным именем и разрешением типа ,расширение препроцессора (или сохранение, которое другие инструменты не будут делать).Внешний интерфейс C ++ обрабатывает несколько диалектов C ++: ANSI, GCC, MS Visual Studio.Как вы можете догадаться, у меня есть много опыта с этим.

DMS / CppFrontEnd использовался для выполнения программного анализа, а также массивных преобразований исходного кода в коде C ++, включаемых анализатором шаблонов DMS, который будет анализировать любой фрагмент кода C ++.Я полагаю, что другие внешние интерфейсы C ++ не предоставляют преобразования источник-источник.С теми, которые вы, вероятно, можете взломать AST процедурно, но это довольно неудобно, потому что вы должны знать точную структуру AST, а для C ++ это довольно сложно.

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

0 голосов
/ 30 апреля 2011

лязг стоит посмотреть. это быстро, и они предоставляют API для подключения к своему бэкэнду.

Xcode 4 использует clang для таких задач, как разбор, сообщения об ошибках / обнаружение в некоторых случаях, автозаполнение и исправление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...