Форум: "Прочее";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
ВнизЕсть ли функция удаления всех комментариев? Найти похожие ветки
← →
KilkennyCat © (2006-05-08 17:08) [40]это из генофонда. controls.pas
компилятор не считает это комментарием.
← →
sniknik © (2006-05-08 17:08) [41]Пусик © (08.05.06 16:57) [38]
CommCtrl обьяви в модуле, после исключай
и еще попробуйprocedure TForm1.Button1Click(Sender: TObject);
begin
(*$IFDEF name*)
if OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
(*$ENDIF*)
end;
← →
KilkennyCat © (2006-05-08 17:09) [42]
> компилятор не считает это комментарием.
тем более, что выдает ошибку :))
← →
sniknik © (2006-05-08 17:10) [43]> компилятор не считает это комментарием.
директива компилятора, в принципе это и есть комментарий (в код не включается)... но только он нужен.
← →
KilkennyCat © (2006-05-08 17:12) [44]
> [43] sniknik © (08.05.06 17:10)
ну уж нет. комментарий - это комментарий, а директива - это директива :)
← →
Пусик © (2006-05-08 17:12) [45]Вот одна ошибка исправлена:
spLeft2:
begin
if s[i]="*" then State := spRight1
else Result := Result + s[i];
Inc(i);
Continue;
end;
А разве директивы компилятора не только в {} могут быть, но и в (* *) ?
← →
Пусик © (2006-05-08 17:14) [46]A compiler directive starts with a $ as the first character after the opening comment delimiter, immediately followed by a name (one or more letters) that designates the particular directive. You can include comments after the directive and any necessary parameters.
← →
Пусик © (2006-05-08 17:15) [47]Действительно, этот момент не знала.
Сейчас буду подправлять.
← →
sniknik © (2006-05-08 17:17) [48]а смысл? время то тютю.
пора Зотову пиво слать... факсом ;о))
← →
Юрий Зотов © (2006-05-08 17:18) [49]> Пусик © (08.05.06 16:21) [28]
Увы, протестировать код не удалось - после запуска программа надолго ушла в глубокую задумчивость. Ждал минут 10, но так и не дождался, пока она все же закончит работу.
Тестирующий код:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TOpenDialog.Create(nil) do
try
if Execute then
begin
with TStringList.Create do
try
LoadFromFile(FileName);
Text := DeleteComments(Text);
SaveToFile(ChangeFileExt(FileName, ".new"))
finally
Free
end
end
finally
Free
end
end;
Тестовые данные:
unit Unit2;
interface
{$R+}
{$DEFINE CompilerOption}
const
Literal = "// This { is } a (* string *)";
(* comment 1 *) A = 0;
{ comment 2 } B = 0;
// comment 3 C = 0;
(* { comment 4 } *)
(* // comment 5 *)
{ (* comment 6 *) }
{ // comment 7 }
// (* comment 8 *)
// { comment 9 }
implementation
end.
Если имелось в виду, что за час можно написать код, который не работает, то с этим я полностью согласен. Даже более того - неработающий код можно написать и еще намного быстрее.
:o)
← →
KilkennyCat © (2006-05-08 17:19) [50]
> Ждал минут 10, но так и не дождался
машина слабая? :))
← →
sniknik © (2006-05-08 17:19) [51]если для народа стараешся то убери еще глюк с
> // -= Prepare Definations =- //
символы лишние остаются
← →
Привидение Хозяина (2006-05-08 17:20) [52]Удалено модератором
← →
sniknik © (2006-05-08 17:22) [53]> машина слабая? :))
да не, оно виснет, также как и это (*$NOINCLUDE CommCtrl *)
← →
KilkennyCat © (2006-05-08 17:25) [54]мне, что ли, написать....
в принципе, у меня есть парсер самодельный для НТМЛ.... эт тоже самое.
← →
Пусик © (2006-05-08 17:29) [55]
> Юрий Зотов © (08.05.06 17:18) [49]
Сейчас на этом коде потестирую, тем более, что уже подправила.
← →
Привидение Хозяина (2006-05-08 17:31) [56]Удалено модератором
← →
Пусик © (2006-05-08 17:31) [57]Проверила.
Вот подправленный код:unit uParseComment;
interface
uses
Sysutils;
type
TStateParse=(spNone,spSlash1,spSlash2,spLeft1,spLeft2,spFLeft1,spFLeft2,spRight1 ,spLiteral1);
TParseError=Exception;
function DeleteComments(const s: String): String;
implementation
function DeleteComments(const s: String): String;
var
i: Integer;
State: TStateParse;
Len: Integer;
begin
State := spNone;
Result := "";
Len := Length(s);
i := 1;
while i<=Len do
begin
case State of
spNone:
begin
if s[i]="/" then
begin
State := spSlash1;
Inc(i);
Continue;
end;
if s[i]="(" then
begin
State := spLeft1;
Inc(i);
Continue;
end;
if s[i]="{" then
begin
State := spFLeft1;
Inc(i);
Continue;
end;
if s[i]="""" then
begin
State := spLiteral1;
Result := Result + s[i];
Inc(i);
Continue;
end;
Result := Result + s[i];
Inc(i);
end;
spSlash1:
begin
if s[i]="/" then
begin
Inc(i);
State := spSlash2;
end
else
begin
State := spNone;
Result := Result + s[i-1];
end;
Continue;
end;
spSlash2:
begin
if s[i]=#13 then
begin
State := spNone;
end;
Inc(i);
Continue;
end;
spLeft1:
begin
if s[i]="*" then
begin
if i<Len then
begin
if s[i+1]<>"$" then State := spRight1
else
begin
Result := Result+s[i-1];
State := spNone;
Continue;
end;
end;
Inc(i);
State := spLeft2;
end
else
begin
State := spNone;
Result := Result + s[i-1];
end;
Continue;
end;
spFLeft1:
begin
if s[i]<>"$" then State := spFLeft2
else
begin
State := spNone;
Result := Result + s[i-1];
Result := Result + s[i];
end;
Inc(i);
Continue;
end;
spLeft2:
begin
if s[i]="*" then State := spRight1;
Inc(i);
Continue;
end;
spFLeft2:
begin
if s[i]="}" then State := spNone;
Inc(i);
end;
spRight1:
begin
if s[i]=")"
then State := spNone
else State := spLeft2;
Inc(i);
end;
spLiteral1:
begin
if s[i]="""" then
begin
if i<>Len then
begin
if s[i+1]="""" then
begin
Result := Result + s[i+1];
Inc(i,2);
end
else
begin
State := spNone;
Result := Result + s[i];
Inc(i);
end;
end
else Inc(i);
Continue;
end
else Result := Result + s[i];
Inc(i);
end;
end;
end;
if State<>spNone then raise TParseError.Create("Ошибка в синтаксисе");
end;
end.
Вот результат обработки примера Ю. Зотова:unit Unit2;
interface
{$R+}
{$DEFINE CompilerOption}
const
Literal = "// This { is } a (* string *)";
A = 0;
B = 0;
implementation
end.
← →
Пусик © (2006-05-08 17:36) [58]Строка (*$NOINCLUDE CommCtrl *) сейчас тоже корректно обрабатывается.
← →
KilkennyCat © (2006-05-08 17:44) [59]и все-таки что-то мне кажется, что можно гораздо проще...
← →
Пусик © (2006-05-08 17:47) [60]
> Если имелось в виду, что за час можно написать код, который
> не работает, то с этим я полностью согласен. Даже более
> того - неработающий код можно написать и еще намного быстрее.
>
К сожалению, не удалось за час все варианты отработать. Но думаю, что работающий код(пусть он и не самый красивый), здесь все-таки есть.
← →
KilkennyCat © (2006-05-08 17:47) [61]Начинаю. Как раз два часа есть. Скоро будет мой неработающий вариант :)
← →
sniknik © (2006-05-08 17:51) [62]> Строка (*$NOINCLUDE CommCtrl *) сейчас тоже корректно обрабатывается.
зато коверкаются cтроки
Caption:= "Ok""";
+ там хинт на строке
if s[i+1]<>"$" then State := spRight1
значение не используется... зачастую это ошибка в логике.
← →
Пусик © (2006-05-08 17:54) [63]
> sniknik © (08.05.06 17:51) [62]
Да, действительно, хинт был, правильный кодspLeft1:
begin
if s[i]="*" then
begin
if i<Len then
begin
if s[i+1]<>"$" then
begin
Inc(i);
State := spRight1;
Continue;
end
> Caption:= "Ok""";
Значит, есть еще над чем работать.
Спасибо за замечания.
← →
sniknik © (2006-05-08 17:55) [64]> Начинаю. Как раз два часа есть. Скоро будет мой неработающий вариант :)
это будет нечестно, имхо, ты уже в курсе всех "подводных камней" на которые Пусик "напоролся". т.е. вникая в задачу на чужом примере ты уже считай начал ей заниматься...
← →
Пусик © (2006-05-08 17:57) [65]>sniknik
Вот на последнее замечание исправление:spLiteral1:
begin
if s[i]="""" then
begin
if i<>Len then
begin
if s[i+1]="""" then
begin
Result := Result + s[i];
Result := Result + s[i+1];
Inc(i,2);
end
← →
KilkennyCat © (2006-05-08 17:58) [66]
> это будет нечестно, имхо, ты уже в курсе всех "подводных
> камней"
я изначально был в курсе.
К тому же, я занимался парсингом, это плюс.
К тому же, мне неизвестны конечные автоматы, это, наверное, минус.
И вообще. :))
← →
Пусик © (2006-05-08 17:59) [67]Удалено модератором
← →
KilkennyCat © (2006-05-08 18:02) [68]
> [67] Пусик © (08.05.06 17:59)
Понятно. Феминистка.
← →
Palladin © (2006-05-08 18:36) [69]мда... 25 минут с перерывами на наполнение стакана пивом и поглощение колбасы... в основном тупил из-за Copy :) сколько куда отсчитывать...
Function RemoveComments(Const s:String):String;
// {
// (*
// //
var
i:Integer;
IsString,IsComm:Boolean;
strComm:String;
nCommType:Integer;
Begin
Result:="";
strComm:="";
IsString:=False;
IsComm:=False;
For i:=1 to Length(s) Do
Begin
If (s[i]=#39) and (i<>1) and (s[i-1]<>#39) Then IsString:=Not IsString;
If IsString Then Result:=Result+s[i] Else
If IsComm Then
Begin
strComm:=strComm+s[i];
Case nCommType Of
0 : If Length(strComm)>=1 Then IsComm:=strComm[Length(strComm)]<>"}";
1 : If Length(strComm)>=2 Then IsComm:=Copy(strComm,Length(strComm)-1,2)<>"*)";
2 : If Length(strComm)>=2 Then IsComm:=Copy(strComm,Length(strComm)-1,2)<>#13#10;
End;
End Else
Begin
strComm:="";
If (Copy(s,i,2)="(*") and (Copy(s,i,3)<>"(*$") Then Begin IsComm:=True; nCommType:=1; End Else
If (s[i]="{") and (Copy(s,i,2)<>"{$") Then Begin IsComm:=True; nCommType:=0; End Else
If Copy(s,i,2)="//" Then Begin IsComm:=True; nCommType:=2; End;
If Not IsComm Then Result:=Result+s[i];
End;
End;
End;
← →
Palladin © (2006-05-08 18:43) [70]
> If (s[i]=#39) and (i<>1) and (s[i-1]<>#39) Then IsString:
> =Not IsString;
+15 минут на исправление этого безобразия ибо в случае """" исполнится фигня и на добавление условия на под {$ }
итого 50 минут... ну пусть час...
← →
Пусик © (2006-05-08 18:44) [71]
> Palladin © (08.05.06 18:36) [69]
Не смешно. Функция совершенно нерабочая.
Для примера обработай вот такие комментарии(выжимка из моего файла):
DF1 := TDrawFigureThread.Create(FOrm1.Canvas,tfRectangle,{ """}Form1.ClientRect);
// ShowWindow(Application.Handle,SW_HIDE);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// Application.OnActivate := OnCreateApp;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
end;
end;
(*
qwe lqwie oqiwue oiqwue oiqwu e
qw eoiqwu eoiqweu oiqwu oqwieu//""""{ }
*)
← →
Пусик © (2006-05-08 18:45) [72]И это учитывая, что здесь уже были замечания опубликованы.
← →
Palladin © (2006-05-08 18:47) [73]
> Пусик © (08.05.06 18:44) [71]
см [70]
← →
Пусик © (2006-05-08 18:49) [74]
> Palladin © (08.05.06 18:47) [73]
>
>
> > Пусик © (08.05.06 18:44) [71]
>
> см [70]
А что там? Непонятно, что означает тот пост.
← →
Пусик © (2006-05-08 18:54) [75]А-а, понятно. Надо те строки закомментировать?
Ну тогда вроде работает:-)
← →
Palladin © (2006-05-08 18:59) [76]Означает что нужно отработать поподробней работу со строковыми константами.
← →
Palladin © (2006-05-08 19:02) [77]
> Пусик © (08.05.06 18:54) [75]
Кто сказал? Нет, их комментировать не нужно, их нужно исправить. На самом деле все равно то что я привел это чушь... Хоть и лаконичная, но чушь. Выработка условий приоритета между определением начала комментария и начала строковой константы довольно сложна. И если начать в это углубляться, то уж лучше сразу поставить задачу парсинга синтаксиса Паскаля.
← →
Пусик © (2006-05-08 19:02) [78]
> Palladin © (08.05.06 18:59) [76]
>
> Означает что нужно отработать поподробней работу со строковыми
> константами.
+ Оптимизировать код на предмет постоянного перераспределения памяти под строки.
← →
KilkennyCat © (2006-05-08 19:03) [79]а я мучался-мучался, родил такую жуть:
function RemComm(Data : String) : string;
var
l, i : integer;
fsString, fsSlash, fsDir, fsFig, fsScob : boolean;
begin
result := "";
i := 0;
l := length(data);
fsString := false;
fsSlash := false;
fsFig := false;
fsScob := false;
repeat
inc(i);
case data[i] of
"""" : begin
if fsString then begin
result := result + data[i];
end;
fsString := not fsString;
end;
"/" : if not fsString then if i < l then if data[i+1] = "/" then fsSlash := true;
"{" : if not fsString then fsFig := true;
"}" : if not fsString then begin
fsFig := false;
Continue;
end;
"(" : if not fsString then if data[i+1] = "*" then fsScob := true;
")" : if not fsString then if data[i-1] = "*" then begin
fsScob := false;
continue;
end;
else
if ord(data[i]) = 13 then fsslash := false;
end;
if fsString then result := result + data[i] else begin
if not fsSlash and not fsFig and not fsScob then result := result + data[i];
end
until i = l;
end;
не учитывает директивы пока. ну и фиг. я сдаюсь. не хочу пива.
← →
KilkennyCat © (2006-05-08 19:04) [80]Но у меня шустрее всех работать будет.
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Память: 0.64 MB
Время: 0.06 c