Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > автоматическая модификация кода.. нужен совет |
Автор: ElKa 1.6.2010, 14:41 |
подскажите плиз как лучше такое реализовать, чтобы не пришлось изобретать велосипед нужно для входного C++ кода сгенерировать множество исходящих кодов, в каждом из которых содержится одна семантическая ошибка т.е. надо заменить например плюс на минус или заменить тип переменной как это лучше всего реализовать? я себе пока представляю следующее: считать парсером код, построить синтаксическое дерево.. потом его пробегать и выискивать нетерминалы, которые можно модифицировать, и потом генерировать исходящий код т.е. что-то вроде транслятора написать, который только один нетерминал переводит может быть все гораздо проще можно сделать? может, инструменты какие-нибудь есть? |
Автор: Alek86 1.6.2010, 16:51 |
парсер для плюсов.... это сложно инструмент есть, GCC называется может код не плюсовой, а какой-то упрощенный? |
Автор: kamre 2.6.2010, 10:12 | ||
Для парсинга C++? |
Автор: azesmcar 2.6.2010, 10:33 |
почему бы и нет? я давно это смотрел, помню там был кажется пример парсера для языка паскаль, для C++ не помню, а какие проблемы? |
Автор: kamre 2.6.2010, 10:46 | ||||
Потому что полноценный парсер для C++ это http://www.nobugs.org/developer/parsingcpp/:
И нет ни одного нормального парсера C++ на yacc/bison. |
Автор: azesmcar 2.6.2010, 10:49 | ||
по моему для задачи автора неполноценного тоже хватит, во всяком случае в решении как-то может помочь, и уж точно лучше воспользоваться генераторами, чем писать самому. |
Автор: xvr 2.6.2010, 13:40 |
Семантический парсер для данной задачи явный overkill. Достаточно будет замены на уровне лексем. |
Автор: borisbn 2.6.2010, 15:51 | ||
Полностью согласен. Обычный boost::regex_replace IMHO лучшее решение для данной задачи. |
Автор: ElKa 3.6.2010, 15:41 |
спасибо за советы.. сейчас все посмотрю Alek86, нет, именно плюсовой azesmcar, еще ANTLR можно только это не парсеры, а генераторы парсеров там надо грамматику C++ задавать а парсеров, значит, нет готовых ![]() |
Автор: azesmcar 3.6.2010, 15:49 | ||
он упомянут в присланной ссылке. а я где-то писал что это парсер? Добавлено через 1 минуту и 31 секунду ElKa обрати внимание на это
не думаю, что тебе действительно нужен парсер. |
Автор: ElKa 3.6.2010, 17:15 | ||||
я обратила.. как раз над этим сейчас размышляю.. дело в том, что надо будет сначала написать мутационные операторы для модификации кода, а потом автоматизировать создание ошибочных кодов эти операторы относятся к определенным нетерминалам, например в арифметическом выражении заменить плюс на минус если ограничиться только лексическим анализом, то можно будет просто менять любой плюс, а плюсы же не только в арифм. выр. используются так что я не знаю пока, достаточно ли этого может быть придется синтаксический анализ тоже провести |
Автор: kamre 6.6.2010, 14:37 | ||
Можно написать плагин на Java для Eclipse CDT, там вся инфраструктура для этого уже есть (построение AST, его обход, трансформация и т.п.). Хотя там поддержка C++ далеко не на уровне compiler front-end, на сложных шаблонах из boost плохо работает и много памяти требует для инстанцирований. |
Автор: ElKa 6.6.2010, 18:51 |
kamre, а синтаксический анализ и построение деревьев для C++ кода в CDT поддерживается? может быть его можно использовать? я просто еще не знакома с этим плагином |
Автор: kamre 6.6.2010, 19:27 | ||||
Поддерживается, на этом и основано "понимание" языка С++ в IDE. Вот хотя бы отсюда можно начать: http://wiki.eclipse.org/images/c/c7/CDT_APIs_for_code_introspection.pdf
Там уже есть некоторые простые рефакторинги, которые как раз используют AST и умеют его трансформировать. Можно попробовать сделать дополнительный "рефакторинг", который будет вносить нужные изменения в код. Только вот совсем отвязать все это от платформы Eclipse вряд ли получится. |
Автор: xvr 6.6.2010, 19:56 |
Если уж хочется полный парсер возьмите http://www.gccxml.org/HTML/Index.html |
Автор: kamre 6.6.2010, 20:27 | ||||
Это называется полный:
? |
Автор: xvr 6.6.2010, 23:10 |
Ну всеже полнее, чем голая грамматика ![]() Хотя ТС похоже все же ни то ни другое на самом деле не нужно. Нужен лексический анализ + кусок синтаксического парсера. А судя по первому посту вообще никакой синтаксический анализ не нужен. По крайней мере из объяснений ТС я не понял почему замена на уровне лексем не устраивает. |
Автор: ElKa 22.6.2010, 15:52 |
xvr, а из чего следует, что синтаксический анализ не нужен? |
Автор: baldina 22.6.2010, 16:46 |
ElKa, есть ряд терминалов, которые могут появиться только в контексте выражений - операции +,-,/,&&,||,==,< и т.д. Их можно заменять не опасаясь за правильность синтаксиса. Целочисленные встроенные типы тоже можно менять свободно, если они совместимы (неявно приводятся друг к другу) - например, long на char. Еще можно менять значения литералов. |
Автор: xvr 22.6.2010, 17:59 | ||||
Не нужен ПОЛНЫЙ анализ. Нужно уметь вычленить интересующие вас куски грамматики и в них модифицировать то, что вам надо. Например - если вас интересует только выражения в функциях (но не внутри классов), то нужно уметь найти функции, попутно пропустив все классы и структуры. Например так:
|
Автор: ElKa 27.6.2010, 16:18 |
xvr, просто неполный анализ я себе как-то не представляю.. не сталкивалась пока |
Автор: ElKa 13.7.2010, 19:31 |
xvr, этот парсер ничего не дает он что-то вроде рефлексии делает, т.е. парсит структуру классов из .h-файлов и достает все функции и переменные классов, как рефлексия в яве мемберсы достает а мне надо именно содержимое функций и значения и типы менять |
Автор: xvr 14.7.2010, 09:29 |
'Этот' - в смысле gcc-xml? Не совсем. Парсит он все, а вот выводит только заголовки функции и пр. Остальное игнорирует. Если очень хочется, то можно дописать ему и вывод всего остального ![]() |
Автор: ElKa 16.7.2010, 19:22 |
остроумно |