Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

Есть ли функция удаления всех комментариев?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.054 c
15-1147251545
Ламот
2006-05-10 12:59
2006.06.04
2 сетевые на одном компе


1-1146055172
Deka
2006-04-26 16:39
2006.06.04
Импорт функций из сишной DLL... Вроде все просто, а не работает.


2-1147787382
Mahab
2006-05-16 17:49
2006.06.04
thread


2-1147873925
Мурзилка
2006-05-17 17:52
2006.06.04
ещё вопрос по TTreeView


2-1147952508
Мурзилка
2006-05-18 15:41
2006.06.04
время