анализаторы/парсеры C или C++

shlyumper

Нужен анализатор С или C++, который было бы не очень сложно дополнить своей функциональностью. Задача достаточно простая: промаркировать все функции в исходниках в зависимости от каких-то их свойств (например, наличие обращения к глобальным переменным). Писать свой парсер совершенно не хочется. Соответственно, вопрос: можете посоветовать какие-нибудь готовые парсеры для C или C++, которые на выходе бы давали AST. Лучше, чтобы сам парсер был на чем-либо более читаемом, типа python, perl, lisp, ML... (то есть elsa/oink можно не советовать).

kokoc88

Для Си можно взять описание стандарта в формате для lexx/yacc, только дерево придётся делать самостоятельно.
Для Си++ найти нормальный парсер очень тяжело, почти все они коммерческие. Как вариант - брать исходники gcc. Или в гугл, первая ссылка на шокала: http://www.cs.berkeley.edu/~smcpeak/elkhound/

yolki

без анализа семантики не получится отделить глобальные и локальные переменные.
нужно будет полноценный анализатор писать.
Мы делаем кое-что подобное. если интересно - в приват.

shlyumper

Да, я все понимаю, взять там antlr и нагенерировать сколько угодно. Не хотелось.
elsa и oink - как раз используют elkhound.
C++ в общем-то и не нужен, к счастью.

ppplva

Для Си++ найти нормальный парсер очень тяжело, почти все они коммерческие.
Их мало, но elsa очень радует. Она умеет через typechecking разрюхивать неоднозначности и даже находит все instantiation шаблонов.

cyberrod

Жестокая штука.

vall

глянь что там в eclipse cdt натворили, когда я писал диплом там уже много что было, AST там точно есть а семантика тогда только там появлялась. но код там конечно монстроидный слегка, IBM всё-таки =)
из gcc ничего выковырять точно не получится, оно там надёжно привязано чтоб не упёрли.

Chupa

на всякий случай напомню про CIL

shlyumper

о, на этого зверя еще не натыкался, спасибо.

karkar

antlr C не распарсит, кажися, - грамматика LR.

shlyumper

на сайте antlr есть грамматики и для C и для C++.
Оставить комментарий
Имя или ник:
Комментарий: