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."