![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
подскажите плиз как лучше такое реализовать, чтобы не пришлось изобретать велосипед
нужно для входного C++ кода сгенерировать множество исходящих кодов, в каждом из которых содержится одна семантическая ошибка т.е. надо заменить например плюс на минус или заменить тип переменной как это лучше всего реализовать? я себе пока представляю следующее: считать парсером код, построить синтаксическое дерево.. потом его пробегать и выискивать нетерминалы, которые можно модифицировать, и потом генерировать исходящий код т.е. что-то вроде транслятора написать, который только один нетерминал переводит может быть все гораздо проще можно сделать? может, инструменты какие-нибудь есть? Это сообщение отредактировал(а) ElKa - 1.6.2010, 14:42 |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
парсер для плюсов.... это сложно
инструмент есть, GCC называется может код не плюсовой, а какой-то упрощенный? |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
yacc, bison? http://en.wikipedia.org/wiki/Comparison_of_parser_generators Это сообщение отредактировал(а) azesmcar - 1.6.2010, 17:01 |
|||
|
||||
kamre |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 1 Всего: 13 |
Для парсинга C++? Это сообщение отредактировал(а) kamre - 2.6.2010, 10:22 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
kamre |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 1 Всего: 13 |
Потому что полноценный парсер для C++ это очень сложная задача:
И нет ни одного нормального парсера C++ на yacc/bison. Это сообщение отредактировал(а) kamre - 2.6.2010, 10:49 |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
по моему для задачи автора неполноценного тоже хватит, во всяком случае в решении как-то может помочь, и уж точно лучше воспользоваться генераторами, чем писать самому. Это сообщение отредактировал(а) azesmcar - 2.6.2010, 10:53 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Семантический парсер для данной задачи явный overkill. Достаточно будет замены на уровне лексем.
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Полностью согласен. Обычный boost::regex_replace IMHO лучшее решение для данной задачи. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
спасибо за советы.. сейчас все посмотрю
Alek86, нет, именно плюсовой azesmcar, еще ANTLR можно только это не парсеры, а генераторы парсеров там надо грамматику C++ задавать а парсеров, значит, нет готовых ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
я обратила.. как раз над этим сейчас размышляю.. дело в том, что надо будет сначала написать мутационные операторы для модификации кода, а потом автоматизировать создание ошибочных кодов эти операторы относятся к определенным нетерминалам, например в арифметическом выражении заменить плюс на минус если ограничиться только лексическим анализом, то можно будет просто менять любой плюс, а плюсы же не только в арифм. выр. используются так что я не знаю пока, достаточно ли этого может быть придется синтаксический анализ тоже провести |
|||
|
||||
kamre |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 1 Всего: 13 |
Можно написать плагин на Java для Eclipse CDT, там вся инфраструктура для этого уже есть (построение AST, его обход, трансформация и т.п.). Хотя там поддержка C++ далеко не на уровне compiler front-end, на сложных шаблонах из boost плохо работает и много памяти требует для инстанцирований. |
|||
|
||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
kamre,
а синтаксический анализ и построение деревьев для C++ кода в CDT поддерживается? может быть его можно использовать? я просто еще не знакома с этим плагином |
|||
|
||||
kamre |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 1 Всего: 13 |
Поддерживается, на этом и основано "понимание" языка С++ в IDE. Вот хотя бы отсюда можно начать: http://wiki.eclipse.org/images/c/c7/CDT_AP...trospection.pdf
Там уже есть некоторые простые рефакторинги, которые как раз используют AST и умеют его трансформировать. Можно попробовать сделать дополнительный "рефакторинг", который будет вносить нужные изменения в код. Только вот совсем отвязать все это от платформы Eclipse вряд ли получится. |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
kamre |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 1 Всего: 13 |
Это называется полный:
? |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Ну всеже полнее, чем голая грамматика
![]() Хотя ТС похоже все же ни то ни другое на самом деле не нужно. Нужен лексический анализ + кусок синтаксического парсера. А судя по первому посту вообще никакой синтаксический анализ не нужен. По крайней мере из объяснений ТС я не понял почему замена на уровне лексем не устраивает. |
|||
|
||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
xvr,
а из чего следует, что синтаксический анализ не нужен? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
ElKa, есть ряд терминалов, которые могут появиться только в контексте выражений - операции +,-,/,&&,||,==,< и т.д. Их можно заменять не опасаясь за правильность синтаксиса.
Целочисленные встроенные типы тоже можно менять свободно, если они совместимы (неявно приводятся друг к другу) - например, long на char. Еще можно менять значения литералов. |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Не нужен ПОЛНЫЙ анализ. Нужно уметь вычленить интересующие вас куски грамматики и в них модифицировать то, что вам надо. Например - если вас интересует только выражения в функциях (но не внутри классов), то нужно уметь найти функции, попутно пропустив все классы и структуры. Например так:
|
||||
|
|||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
xvr,
просто неполный анализ я себе как-то не представляю.. не сталкивалась пока |
|||
|
||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
xvr,
этот парсер ничего не дает он что-то вроде рефлексии делает, т.е. парсит структуру классов из .h-файлов и достает все функции и переменные классов, как рефлексия в яве мемберсы достает а мне надо именно содержимое функций и значения и типы менять |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
'Этот' - в смысле gcc-xml?
Не совсем. Парсит он все, а вот выводит только заголовки функции и пр. Остальное игнорирует. Если очень хочется, то можно дописать ему и вывод всего остального ![]() |
|||
|
||||
ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
остроумно
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |