Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> автоматическая модификация кода.. нужен совет 
V
    Опции темы
ElKa
Дата 1.6.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: нет
Всего: 4



подскажите плиз как лучше такое реализовать, чтобы не пришлось изобретать велосипед

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

как это лучше всего реализовать?

я себе пока представляю следующее:
считать парсером код, построить синтаксическое дерево.. потом его пробегать и выискивать нетерминалы, которые можно модифицировать, и потом генерировать исходящий код

т.е. что-то вроде транслятора написать, который только один нетерминал переводит

может быть все гораздо проще можно сделать? может, инструменты какие-нибудь есть? 


Это сообщение отредактировал(а) ElKa - 1.6.2010, 14:42
PM   Вверх
Alek86
Дата 1.6.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



парсер для плюсов.... это сложно
инструмент есть, GCC называется

может код не плюсовой, а какой-то упрощенный?


--------------------
user posted image    user posted image
PM MAIL   Вверх
azesmcar
Дата 1.6.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(ElKa @  1.6.2010,  14:41 Найти цитируемый пост)
может быть все гораздо проще можно сделать? может, инструменты какие-нибудь есть? 

yacc, bison?

http://en.wikipedia.org/wiki/Comparison_of_parser_generators


Это сообщение отредактировал(а) azesmcar - 1.6.2010, 17:01
PM   Вверх
kamre
Дата 2.6.2010, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Цитата(azesmcar @ 1.6.2010,  16:55)
yacc, bison?

Для парсинга C++?

Это сообщение отредактировал(а) kamre - 2.6.2010, 10:22
PM MAIL   Вверх
azesmcar
Дата 2.6.2010, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(kamre @  2.6.2010,  10:12 Найти цитируемый пост)
Для парсинга C++?

почему бы и нет? я давно это смотрел, помню там был кажется пример парсера для языка паскаль, для C++ не помню, а какие проблемы?

PM   Вверх
kamre
Дата 2.6.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Цитата(azesmcar @ 2.6.2010,  10:33)
почему бы и нет? я давно это смотрел, помню там был кажется пример парсера для языка паскаль, для C++ не помню, а какие проблемы?

Потому что полноценный парсер для C++ это очень сложная задача:
Цитата

C++ grammar is ambiguous, context-dependent and potentially requires infinite lookahead to resolve some ambiguities

И нет ни одного нормального парсера C++ на yacc/bison.

Это сообщение отредактировал(а) kamre - 2.6.2010, 10:49
PM MAIL   Вверх
azesmcar
Дата 2.6.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(kamre @  2.6.2010,  10:46 Найти цитируемый пост)
Потому что полноценный парсер для C++ это очень сложная задача: http://www.nobugs.org/developer/parsingcpp/ И нет ни одного нормального парсера C++ на yacc/bison. 

по моему для задачи автора неполноценного тоже хватит, во всяком случае в решении как-то может помочь, и уж точно лучше воспользоваться генераторами, чем писать самому.

Это сообщение отредактировал(а) azesmcar - 2.6.2010, 10:53
PM   Вверх
xvr
Дата 2.6.2010, 13:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Семантический парсер для данной задачи явный overkill. Достаточно будет замены на уровне лексем.

PM MAIL   Вверх
borisbn
Дата 2.6.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(xvr @  2.6.2010,  13:40 Найти цитируемый пост)
Семантический парсер для данной задачи явный overkill. Достаточно будет замены на уровне лексем.

Полностью согласен. Обычный boost::regex_replace IMHO лучшее решение для данной задачи.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ElKa
Дата 3.6.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: нет
Всего: 4



спасибо за советы.. сейчас все посмотрю


Alek86
Цитата(Alek86 @  1.6.2010,  16:51 Найти цитируемый пост)
может код не плюсовой, а какой-то упрощенный? 
 

нет, именно плюсовой

azesmcar
Цитата(azesmcar @  1.6.2010,  16:55 Найти цитируемый пост)
yacc, bison?


еще ANTLR можно
только это не парсеры, а генераторы парсеров
там надо грамматику C++ задавать 


а парсеров, значит, нет готовых  smile 

 

PM   Вверх
azesmcar
Дата 3.6.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(ElKa @  3.6.2010,  15:41 Найти цитируемый пост)
еще ANTLR можно

он упомянут в присланной ссылке.

Цитата(ElKa @  3.6.2010,  15:41 Найти цитируемый пост)
только это не парсеры, а генераторы парсеров

а я где-то писал что это парсер?

Добавлено через 1 минуту и 31 секунду
ElKa
обрати внимание на это
Цитата(xvr @  2.6.2010,  13:40 Найти цитируемый пост)
Семантический парсер для данной задачи явный overkill. Достаточно будет замены на уровне лексем.


не думаю, что тебе действительно нужен парсер.
PM   Вверх
ElKa
Дата 3.6.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: нет
Всего: 4



Цитата(azesmcar @ 3.6.2010,  15:49)
Добавлено @ 15:50
ElKa
обрати внимание на это
Цитата(xvr @  2.6.2010,  13:40 Найти цитируемый пост)
Семантический парсер для данной задачи явный overkill. Достаточно будет замены на уровне лексем.


не думаю, что тебе действительно нужен парсер.

я обратила.. как раз над этим сейчас размышляю..

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

PM   Вверх
kamre
Дата 6.6.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Цитата(ElKa @ 3.6.2010,  17:15)
дело в том, что надо будет сначала написать мутационные операторы для модификации кода, а потом автоматизировать создание ошибочных кодов
эти операторы относятся к определенным нетерминалам, например в арифметическом выражении заменить плюс на минус
если ограничиться только лексическим анализом, то можно будет просто менять любой плюс, а плюсы же не только в арифм. выр. используются
так что я не знаю пока, достаточно ли этого
может быть придется синтаксический анализ тоже провести

Можно написать плагин на Java для Eclipse CDT, там вся инфраструктура для этого уже есть (построение AST, его обход, трансформация и т.п.). Хотя там поддержка C++ далеко не на уровне compiler front-end, на сложных шаблонах из boost плохо работает и много памяти требует для инстанцирований.
PM MAIL   Вверх
ElKa
Дата 6.6.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.2.2006

Репутация: нет
Всего: 4



kamre

а синтаксический анализ и построение деревьев для C++ кода в CDT поддерживается? может быть его можно использовать? я просто еще не знакома с этим плагином 
PM   Вверх
kamre
Дата 6.6.2010, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Цитата(ElKa @ 6.6.2010,  18:51)
а синтаксический анализ и построение деревьев для C++ кода в CDT поддерживается?

Поддерживается, на этом и основано "понимание" языка С++ в IDE. Вот хотя бы отсюда можно начать: http://wiki.eclipse.org/images/c/c7/CDT_AP...trospection.pdf

Цитата(ElKa @ 6.6.2010,  18:51)
 может быть его можно использовать?

Там уже есть некоторые простые рефакторинги, которые как раз используют AST и умеют его трансформировать. Можно попробовать сделать дополнительный "рефакторинг", который будет вносить нужные изменения в код.

Только вот совсем отвязать все это от платформы Eclipse вряд ли получится.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.