Einzelnen Beitrag anzeigen

static_cast

Registriert seit: 19. Okt 2003
Ort: Peine
300 Beiträge
 
#1

SQL-Datei parsen und Comments löschen

  Alt 14. Mär 2005, 15:20
Hallo,

ich bin gerade dabei eine Umgebung zu basteln zum entwickeln von MSSQL proceduren. Nun bin ich dabei den Parser zu bauen der zuerst mal zum internen arbeiten alle Comments durch Spaces ersetzt.

Das ist meine Aktuelle Parser procedure (z.Z. und zum Testen ersetzt sie Strings durch $ und comments durch ?):
Delphi-Quellcode:
procedure Parse;
var
  Line:String;
  Y,X,Z,Token,Flag:Integer;
begin

  FScanBuffer.Clear;
  FScanBuffer.Assign(FEditBuffer);

  Flag:=0;
  for Y:=0 to FScanBuffer.Count-1 do
  begin
    Line:=FScanBuffer[Y];

    for X:=1 to Length(Line) do
    begin

      Token:=0;

      if Copy(Line,X,1) = #039 then Token:=1 else
      if Copy(Line,X,2) = '/*then Token:=2 else
      if Copy(Line,X,2) = '--then Token:=3 else
      if Copy(Line,X,2) = '*/then Token:=4;

      case Token of
         1: begin
              if (Flag <> 2) AND (Flag <> 3) then
                if Flag = 1 then Flag:=5 else Flag:=1;
            end;
         2: begin
              if Flag <> 1 then
                Flag:=2;
            end;
         3: begin
              if (Flag <> 1) AND (Flag <> 2) then
                Flag:=3;
            end;
         4: begin
              if Flag = 2then
                Flag:=4;
            end;
      end;

      case Flag of
         1: begin
              Line[X]:='$';
            end;
         2: begin
              Line[X]:='?';
            end;
         3: begin
              Flag:=0;
              for Z:=X to Length(Line) do Line[Z]:='?';
            end;
         4: begin
              Flag:=0;
              for Z:=X to X+2 do Line[Z]:='?';
            end;
         5: begin
              Flag:=0;
              Line[X]:='$';
            end;
      end;
    end;

    FScanBuffer[Y]:=Line;
  end;

  FScanBuffer.SaveToFile('C:\test.txt');
end;
Zum testen habe ich diesen Codeschnipsel erstellt:
SQL-Code:
/*
  -->
  comment
  block
  <--
*/


SET @Tmp = '/* -- Test -- *//* comment */ ; -- comment

-- test comment

SET @Tmp = '<-->';

-- comment's & comment's /*

SET @Tmp = '*//*';

-- */
Und es kommt auch wie erwartet das als Ergebnis raus:
Code:
??
??????
??????????
????????
??????
??

SET @Tmp = $$$$$$$$$$$$$$$$$$ ??????????????; ??????????

???????????????

SET @Tmp = $$$$$$;

???????????????????????????

SET @Tmp = $$$$$$;

?????
Nur mein Problem ist das das ganze bei großen Dateien sehr inperformant wird, hatte auch schon mehrere Versuche mit dem Parser das ist jetzt der Xte der auch wohl so funzt wie er soll nur sehr langsam.

Deswegen hoffe ich auch euch, das wer eine bessere Idee hat jenes zu lösen, den ich hab keine mehr

Grüße,
Daniel

P.s.: Das ist mein erster Parser dieser größe den ich entwickle deswegen stelle ich mich wohl zu blöd an
Daniel M.
"The WM_NULL message performs no operation. An application sends the WM_NULL message if it wants to post a message that the recipient window will ignore."
  Mit Zitat antworten Zitat