Нужен парсер C ++ - PullRequest
       7

Нужен парсер C ++

8 голосов
/ 04 января 2011

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

Ответы [ 8 ]

10 голосов
/ 04 января 2011

См .: http://clang.llvm.org/ Он имеет как интерфейс C ++, так и интерфейс C (libclang).

9 голосов
/ 04 января 2011

С ++ синтаксический анализ, как известно, тяжело. AFAIK есть только три парсера, которые приемлемы по сегодняшним стандартам: EDG (широко используемый в качестве внешнего интерфейса в популярных компиляторах C ++), GCC и Microsoft. И, очевидно, Microsoft начала использовать парсер EDG в VS2010 для Intellisense.

Когда вы смотрите на бесплатные опции, вы в значительной степени застряли в GCC. Тем не менее, он может производить XML, так что легкая часть есть. (Легко по стандартам синтаксического анализа C ++, то есть)

2 голосов
/ 04 января 2011

Наш C ++ Front End способен анализировать различные диалекты C ++ (ANSI, GCC, MSVS), автоматически создает AST, чьи узлы помечены точными исходными позициями и украшены любым близким текстом комментария, и строит полную таблицу символов. (РЕДАКТИРОВАТЬ, январь 2013 г .: интерфейс C ++ уже довольно давно может обрабатывать C ++ 11).

Внешний интерфейс C ++ построен на основе нашего DMS Software Reengineering Toolkit , обобщенной технологии компиляции для анализа и преобразования программ, предназначенной для поддержки создания пользовательских инструментов. Интерфейс C ++ включает препроцессор, в котором директивы препроцессора могут быть расширены или не коллективно или индивидуально, в зависимости от задачи. Он также включает в себя полную символьную конструкцию со всеми мерзкими поисками Кенига.

DMS принимает явные определения языка (именно так он понимает C ++; есть также внешние интерфейсы для C, C #, Java, COBOL и множества других языков). DMS обеспечивает общий синтаксический анализ, построение таблицы символов, механизм анализа потоков, процедурные API-интерфейсы для навигации / проверки / модификации дерева, преобразования источника в источник и восстановления текста AST в источник, включая исходные комментарии, числа и т. Д. эти возможности доступны для использования интерфейсом C ++.

DMS также предназначен для работы с масштабами, необходимыми для серьезных задач. Часто вам нужен не просто один модуль компиляции (что GCC даст вам в лучшем случае), но и доступ ко всему набору. DMS использовался для анализа / преобразования тысяч модулей компиляции C ++ и буквально десятков тысяч модулей компиляции C (в приложении на 25 миллионов строк).

«Простая в использовании библиотека» - оксюморон, когда дело доходит до инструментов манипулирования программой. Сами языки являются сложными (C ++ является одним из самых сложных и ухудшается с C ++ 0X), и это вызывает сложность в природе вопросов, которые вы можете задать, и как выглядят ответы (например, «есть ли какие-либо экземпляры шаблона, которые может изменить локальную переменную X в методе Y в классе C в любом пространстве имен N? "). Сами вопросы сложны.

Вам нужна библиотека со необходимой сложностью, чтобы вы могли выполнять свою задачу. В течение последних 15 лет DMS постоянно совершенствуется, чтобы обеспечить необходимую сложность. Если вы хотите выполнить серьезную обработку программы, я утверждаю, что вам понадобится эта информация.

В качестве доказательства DMS была использована для проведения масштабного автоматизированного реинжиниринга программного обеспечения для авионики миссии на основе C ++ для Boeing. Я не верю, что есть другие инструменты, которые могут это сделать. (Clang, похоже, пытается, но только для C ++. YMMV).

2 голосов
/ 04 января 2011

Если вы хотите проанализировать код C или C ++, есть несколько вариантов: http://bellard.org/tcc/ http://students.ceid.upatras.gr/~sxanth/ncc/

Если вы хотите создать анализатор с использованием C / C ++, вы можете попробовать: http://boost -spirit.com / home / http://dinosaur.compilertools.net/ Лекс и Як http://www.codeguru.com/csharp/.net/net_general/patterns/article.php/c12805 Флекс и Бизон

2 голосов
/ 04 января 2011

Clang - самый современный и зрелый вариант с достойным C ++ API (но без простого C).Эльза немного устарела и необоснованна, но все еще пригодна для использования.И то, и другое можно использовать как библиотеки, так и как отдельные интерфейсы XML.

1 голос
/ 04 января 2011

Я не пробовал, но думаю, что лучшим выбором будет получение модулей для анализа от какого-нибудь популярного компилятора с открытым исходным кодом, такого как gcc для C ++;

Может быть, вы найдете что-нибудьинтересно тут http://www.nobugs.org/developer/parsingcpp/

1 голос
/ 04 января 2011

Если вы чувствуете себя смелым, ссылки в ответе на ", может ли быть полезна грамматика C ++ с поддержкой yacc? ".Gcc-xml и clang уже были предложены, и Swig также имеет вывод XML , который в зависимости от того, чего вы пытаетесь достичь, может быть уместным.

1 голос
/ 04 января 2011

Я не знаю, для cint, но я слышал, люди используют для этого gcc-xml .

Я тоже искал хорошую автономную библиотеку, но не нашел ее.

...