Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > автоматическая модификация кода.. нужен совет


Автор: ElKa 1.6.2010, 14:41
подскажите плиз как лучше такое реализовать, чтобы не пришлось изобретать велосипед

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

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

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

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

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

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

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

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

yacc, bison?

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

Автор: kamre 2.6.2010, 10:12
Цитата(azesmcar @ 1.6.2010,  16:55)
yacc, bison?

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

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

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

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

Потому что полноценный парсер для C++ это http://www.nobugs.org/developer/parsingcpp/:
Цитата

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

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

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

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

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

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

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

Автор: ElKa 3.6.2010, 15:41
спасибо за советы.. сейчас все посмотрю


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

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

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


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


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

 

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

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

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

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

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


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

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


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

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

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

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

Можно написать плагин на Java для Eclipse CDT, там вся инфраструктура для этого уже есть (построение AST, его обход, трансформация и т.п.). Хотя там поддержка C++ далеко не на уровне compiler front-end, на сложных шаблонах из boost плохо работает и много памяти требует для инстанцирований.

Автор: ElKa 6.6.2010, 18:51
kamre

а синтаксический анализ и построение деревьев для C++ кода в CDT поддерживается? может быть его можно использовать? я просто еще не знакома с этим плагином 

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

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

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

Там уже есть некоторые простые рефакторинги, которые как раз используют 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,  19:56)
Если уж хочется полный парсер возьмите http://www.gccxml.org/HTML/Index.html

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

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.

?

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


Автор: ElKa 22.6.2010, 15:52
xvr

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


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

Автор: xvr 22.6.2010, 17:59
Цитата(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;
    }
}
Таким образом ОГРОМНЫЙ кусок грамматики, описывающий классы, исчезает из парсера.


Автор: ElKa 27.6.2010, 16:18
xvr

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

Автор: ElKa 13.7.2010, 19:31
xvr

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

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

 

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

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


Автор: ElKa 16.7.2010, 19:22
остроумно 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)