scrafter napisał(a)
Nie mam pomysłu na strukturę list.
Programujesz sobie uniwersalne funkcje operujące na wszystkich pięciu listach, a możesz to zrobić - wystarczy w każdym węźle listy przechowywać typ elementu (stała, zmienna, typ, procedura lub funkcja) oraz wskaźnik na strukturę danych o danym typie; Struktur z informacjami o danym elemencie deklarujesz sobie pięć - po jednej dla każdego typu; Do funkcji operującej na listach zamiast gołych danych podasz typ elementu i wskaźnik na strukturę informacji o tym elemencie;
Kodu w C nie podam, bo stronię od niego jak od trędowatych, ale swój pomysł mogę opisać kodem w Pascalu:
Kopiuj
type
TElementKind = (kndConstant, kndVariable, kndType, kndProcedure, kndFunction);
type
PTypeInfo = ^TTypeInfo;
TTypeInfo = record
Name: AnsiString;
Components: array of AnsiString;
end;
PConstInfo = ^TConstInfo;
TConstInfo = record
Name: AnsiString;
end;
PVarInfo = ^TVarInfo;
TVarInfo = record
Name: AnsiString;
DataType: PTypeInfo;
end;
PPropInfo = ^TProcInfo;
TProcInfo = record
Name: AnsiString;
LocalConst: array of PConstInfo;
LocalVar: array of PVarInfo;
LocalTypes: array of PTypeInfo;
end;
PFuncInfo = ^TFuncInfo;
TFuncInfo = record
Name: AnsiString;
Return: PTypeInfo;
LocalConst: array of PConstInfo;
LocalVar: array of PVarInfo;
LocalTypes: array of PTypeInfo;
end;
type
PNode = ^TNode;
TNode = record
Kind: TElementKind;
Name: PAnsiChar;
Info: Pointer;
Next: PNode;
end;
To jest tylko zarys (kompilujący się) powiązania struktur z informacjami o pięciu elementach kodu Pascala; Kwiatuszkiem jest pole TNode.Name
w strukturze węzła listy - podczas dodawania nowego węzła do listy trzeba by było przekazać utworzoną w pamięci strukturę z informacjami o danym elemencie, np. typu TVarInfo
, a jako drugi parametr przekazać wskaźnik na pole TVarInfo.Name
, aby wpisać go do pola Name
w strukturze TNode
;
Dzięki takiemu rozmieszczeniu struktur i ich powiązaniu można napisać uniwersalne funkcje do dodawania nowych węzłów do listy, a także dzięki zastosowaniu wskaźnika na nazwę dodawanego elementu będzie można także napisać uniwersalną funkcję sortującą listę, dlatego że bez względu na typ struktury zawartej w polu TNode.Info
, w polu TNode.Name
zawsze będzie wskaźnik na nazwę danego elementu;
Tak przynajmniej ja bym kombinował, choć podany wyżej przykład opracowany na szybko w głowie;
PS. Nie wiem co rozumiesz przez "składowe typu", dlatego nie wiedziałem jaki typ dla nich wybrać, stąd też pole TTypeInfo.Components
jest macierzą łańcuchów, ale był to strzał.