Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Regionen ersetzen - fertige Funktionen?

  Alt 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 = 'privatvarthen
                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).
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat