Модераторы: 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   Вверх
xvr
Дата 6.6.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если уж хочется полный парсер возьмите gcc_xml

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


Опытный
**


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

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



Цитата(xvr @ 6.6.2010,  19:56)
Если уж хочется полный парсер возьмите gcc_xml

Это называется полный:
Цитата

Why are C++ function bodies not dumped in XML?
The original sponsors of the project had no need for function bodies. So far the authors have not had time or funding to implement the support.

?
PM MAIL   Вверх
xvr
Дата 6.6.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(kamre @  6.6.2010,  20:27 Найти цитируемый пост)
Это называется полный:
Ну всеже полнее, чем голая грамматика smile Он не генерит XML для внутренностей функций, но AST для них есть. И Eclipse в нагрузку не нужен.
Хотя ТС похоже все же ни то ни другое на самом деле не нужно. Нужен лексический анализ + кусок синтаксического парсера.
А судя по первому посту вообще никакой синтаксический анализ не нужен. По крайней мере из объяснений ТС я не понял почему замена на уровне лексем не устраивает.


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


Опытный
**


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

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



xvr

а из чего следует, что синтаксический анализ не нужен? 


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



ElKa, есть ряд терминалов, которые могут появиться только в контексте выражений - операции +,-,/,&&,||,==,< и т.д. Их можно заменять не опасаясь за правильность синтаксиса.
Целочисленные встроенные типы тоже можно менять свободно, если они совместимы (неявно приводятся друг к другу) - например, long на char.
Еще можно менять значения литералов.

PM MAIL   Вверх
xvr
Дата 22.6.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ElKa @ 22.6.2010,  15:52)
xvr

а из чего следует, что синтаксический анализ не нужен?

Не нужен ПОЛНЫЙ анализ. Нужно уметь вычленить интересующие вас куски грамматики и в них модифицировать то, что вам надо.

Например - если вас интересует только выражения в функциях (но не внутри классов), то нужно уметь найти функции, попутно пропустив все классы и структуры.
Например так:
Код

if (token=="class" || token=="struct" || token == "union")
{
  skip_to("{");
  int level=1;
  while(level)
   switch(skip_to("{}"))
    {
      case '{': ++level; break;
      case '}': --level; break;
    }
}
Таким образом ОГРОМНЫЙ кусок грамматики, описывающий классы, исчезает из парсера.


PM MAIL   Вверх
ElKa
Дата 27.6.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



xvr

просто неполный анализ я себе как-то не представляю.. не сталкивалась пока

PM   Вверх
ElKa
Дата 13.7.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



xvr

этот парсер ничего не дает
 
он что-то вроде рефлексии делает, т.е. парсит структуру классов из .h-файлов и достает все функции и переменные классов, как рефлексия в яве мемберсы достает

а мне надо именно содержимое функций и значения и типы менять

 
PM   Вверх
xvr
Дата 14.7.2010, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ElKa @  13.7.2010,  19:31 Найти цитируемый пост)
этот парсер ничего не дает
'Этот' - в смысле gcc-xml? 

Цитата(ElKa @  13.7.2010,  19:31 Найти цитируемый пост)
он что-то вроде рефлексии делает,
Не совсем. Парсит он все, а вот выводит только заголовки функции и пр. Остальное игнорирует. 
Если очень хочется, то можно дописать ему и вывод всего остального  smile 


PM MAIL   Вверх
ElKa
Дата 16.7.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



остроумно 
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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