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


Автор: ElKa 9.7.2010, 12:12
подскажите плиз как это можно реализовать

например, в следующем коде мне нужно заменить + на - и  int a,b; на float a,b;

Код

struct EmptyClass {};

int a, b;
a = 3;
b = 2;

int a_function(float f, EmptyClass e)
{
   return a+b;
}
 
int main(void)
{
  return 0;
}


я парсаю его с gcc_xml 
gccxml_cc1plus sample.cpp -fxml=sample.xml

и получаю такой XML код

Код

<?xml version="1.0"?>
<GCC_XML>
  <Namespace id="_1" name="::" members="_3 _4 _5 _6 _7 "/>
  <Namespace id="_2" name="std" context="_1" members=""/>
  <Function id="_3" name="main" returns="_8" context="_1" location="f0:13"/>
  <Function id="_4" name="a_function" returns="_8" context="_1" location="f0:8">
    <Argument name="f" type="_9"/>
    <Argument name="e" type="_7"/>
  </Function>
  <Variable id="_5" name="b" type="_8" init="2" context="_1" location="f0:5"/>
  <Variable id="_6" name="a" type="_8" init="3" context="_1" location="f0:4"/>
  <Struct id="_7" name="EmptyClass" context="_1" location="f0:1" members="_10 _11 " bases=""/>
  <FundamentalType id="_8" name="int"/>
  <FundamentalType id="_9" name="float"/>
  <Constructor id="_10" name="EmptyClass" context="_7" location="f0:1">
    <Argument name="_ctor_arg" type="_12"/>
  </Constructor>
  <Constructor id="_11" name="EmptyClass" context="_7" location="f0:1"/>
  <ReferenceType id="_12" type="_7c"/>
  <File id="f0" name="sample.cpp"/>
</GCC_XML>


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

Автор: Ockonal 11.7.2010, 06:39
Я думаю, вам нужно использовать "отражение", когда программа использует и обрабатывает команды как данные. Там можно делать динамический код. Проблема в том, что на С++ это пока невозможно стандартными средствами, но где-то валялась библиотека такая. Не знаю на счёт её работоспособности.

upd
http://dev.tegesoft.com/projects/camp и есть эта библиотека. Ещё пару ссылок в догонку: http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-a-c-application, http://en.wikipedia.org/wiki/Reflection_(computer_science).
Гугли по теме c++ reflection.

Автор: ElKa 13.7.2010, 19:28
Ockonal

да я уже поняла, что этот парсер ничего не дает
мне его здесь настойчиво рекомендовали, а на деле с него толку нет

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

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

а на другие парсеры у меня уже времени нет

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