W odpowiedzi na maila:
Przykladowo przerabiasz taki kod:
int a;
int b;
class abc{};
void fun(){ return 0;}
int main()
{
a abc();
abc* b = new abc();
}
na taki kod:
{deklaracja_zmiennej} int;
{deklaracja_zmiennej} int;
{deklaracja_klasy} klasa1
{definicja_funkcji} void argumenty(void)
{
return 0;
}
{definicja_funkcji}
{
{definicja_zmiennej typ klasa_1}
{definicja_wskaznika typ klasa_1}
}
W ten sposob wszelkie nazwy przestaja miec znaczenie. Z klasami jest wiekszy problem, ale mozesz sobie zapisywac typy tych klas poprzez oznaczenie jakie skladowe posiadaja, np.
class a
{
int a;
char* b;
}
{deklaracja_klasy} klasa_1 skladowe int, char*
gdzie skladowe, to jakas lista typow skladowych klasy. Poprzez porownanie listy mozemy stwierdzic, czy klasa jest podobna do innej czy nie.
Fajnie byloby wykrywac operacje charakterystyczne, np. pomijac wszystkie deklaracje i definicje, pozostawic tylko dzialania (operatory i typy elementow, na jakich dzialaja, wywolania funkcji). To opieraloby sie na tym, ze program to uporzadkowana lista polecen - jezeli w liscie wazne elementy sa podobne to i algorytm jest podobny, a tym samym duza szansa, ze program rowniez.
Tak ja bym to widzial.