Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
Delphi 11 Alexandria
|
AW: Regionen ersetzen - fertige Funktionen?
28. Mär 2011, 10:36
Falls es mal jemand brauchen kann, hier mal etwas als Grundlage:
Die Funktion interpretiert Quelltextteile (Code, StringKonstanten, Kommentare). In "Work" erfolgt dann die Verarbeitung der gefundenen Abschnitte.
Natürlich muss das jeder für seine Zwecke anpassen, aber so muss man vielleicht nicht bei 0 anfangen...
Delphi-Quellcode:
procedure TRegion.ScanRegions(var ScanCode: String; var P: Integer; BaseFlag: Boolean);
type
TCodeType = (ctCode, ctConstant, ctCommentSL, ctCommentEM, ctCommentST);
// ..............................slash .......embowed......star.......
var
R, CR: String;
CodeType: TCodeType;
ExitFlag: Boolean;
procedure Work(NewCodeType: TCodeType);
var
C, Id: String;
P1, P2: Integer;
NewRegion: TRegion;
SL: TStringList;
SS: String;
PP: Integer;
begin
case CodeType of
ctCode:
begin
end;
ctConstant:
begin
end;
ctCommentSL:
begin
end;
ctCommentEM:
begin
C := '{$REGION';
if PosEx(C, UpperCase(R)) = 1 then
begin
P1 := PosEx('''', R);
P2 := PosEx('''', R, Succ(P1));
if P2 > P1 then
begin
NewRegion := TRegion.Create(Self);
RegionList.Add(NewRegion);
NewRegion.Id := Copy(R, Succ(P1), Pred(P2 - P1));
R := NewRegion.IncludeId;
NewRegion.ScanRegions(ScanCode, P, False);
end;
end;
C := '{$ENDREGION';
if PosEx(C, UpperCase(R)) = 1 then
begin
R := '';
ExitFlag := not BaseFlag;
Exit;
end;
C := '{$INCLUDE';
if PosEx(C, UpperCase(R)) = 1 then
begin
P1 := PosEx('''', R);
P2 := PosEx('''', R, Succ(P1));
if P2 > P1 then
begin
NewRegion := TRegion.Create(Self);
RegionList.Add(NewRegion);
NewRegion.Id := Copy(R, Succ(P1), Pred(P2 - P1));
SL := TStringList.Create;
SL.LoadFromFile(OldPath + NewRegion.Id);
while Pos('_', NewRegion.Id) > 0 do
NewRegion.Id := Copy(NewRegion.Id, Succ(Pos('_', NewRegion.Id)), MaxInt);
while Pos('.', NewRegion.Id) > 0 do
NewRegion.Id := Copy(NewRegion.Id, 1, Pred(Pos('.', NewRegion.Id)));
if NewRegion.Id = 'privatvar' then
NewRegion.Id := 'privat';
R := NewRegion.IncludeId;
SS := #13#10 + SL.Text;
PP := 1;
NewRegion.ScanRegions(SS, PP, True);
FreeAndNil(SL);
NewCodeType := ctCode;
end;
end;
end;
ctCommentST:
begin
end;
end;
// R := StringReplace(R, #13#10, ' ', [rfReplaceAll]);
// OutputDebugString(PChar(R));
CR := CR + R;
R := '';
CodeType := NewCodeType;
end;
begin
P := Max(P, 1);
ExitFlag := False;
CR := '';
R := '';
CodeType := ctCode;
while P <= Length(ScanCode) do
begin
case CodeType of
ctCode:
begin
if Copy(ScanCode, P, 2) = '//' then
begin
Work(ctCommentSL);
R := R + Copy(ScanCode, P, 2);
Inc(P, 2);
end
else if Copy(ScanCode, P, 1) = '''' then
begin
Work(ctConstant);
R := R + Copy(ScanCode, P, 1);
Inc(P);
end
else if Copy(ScanCode, P, 1) = '{' then
begin
Work(ctCommentEM);
R := R + Copy(ScanCode, P, 1);
Inc(P);
end
else if Copy(ScanCode, P, 2) = '(*' then
begin
Work(ctCommentST);
R := R + Copy(ScanCode, P, 2);
Inc(P, 2);
end
else
begin
R := R + Copy(ScanCode, P, 1);
Inc(P);
end;
end;
ctConstant:
begin
if Copy(ScanCode, P, 1) = '''' then
begin
R := R + Copy(ScanCode, P, 1);
Inc(P);
Work(ctCode);
end
else
begin
R := R + Copy(ScanCode, P, 1);
Inc(P);
end;
end;
ctCommentSL:
begin
if Copy(ScanCode, P, 2) = #13#10 then
begin
Work(ctCode);
R := R + Copy(ScanCode, P, 2);
Inc(P, 2);
end
else
begin
R := R + Copy(ScanCode, P, 1);
Inc(P);
end;
end;
ctCommentEM:
begin
if Copy(ScanCode, P, 1) = '}' then
begin
R := R + Copy(ScanCode, P, 1);
Inc(P);
Work(ctCode);
end
else
begin
R := R + Copy(ScanCode, P, 1);
Inc(P);
end;
end;
ctCommentST:
begin
if Copy(ScanCode, P, 2) = '*)' then
begin
R := R + Copy(ScanCode, P, 2);
Inc(P, 2);
Work(ctCode);
end
else
begin
R := R + Copy(ScanCode, P, 1);
Inc(P);
end;
end;
end;
if ExitFlag then
begin
Code := CR;
Exit;
end;
end;
Work(ctCode);
Code := CR;
end;
TRegion ist meine Komponente.
ScanRegions analysiert den Quelltext, der in ScanCode steht.
P muss zu beginn 1 sein.
BaseFlag=True, heißt, dass die Unit (und keine Unterregion) interpretiert wird.
Es werden Quelltext, StringKonstanten und Kommentare herausgelesen.
Die Reaktion auf gefundene Teile erfolgt in Work (das muss also jeder für sich anpassen).
|