Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1146928718
ArtemESC
2006-05-06 19:18
2006.06.04
SetLength, Trim в BP


15-1146830150
Der Nechk@ssoff
2006-05-05 15:55
2006.06.04
Место встречи изменить можно!


3-1144959988
Krants
2006-04-14 00:26
2006.06.04
Развернуть БД


4-1142252972
Lord HiTTER
2006-03-13 15:29
2006.06.04
Как добавить в контекстное меню?


2-1147783724
DesperadO666
2006-05-16 16:48
2006.06.04
Помогите разобраться с pchar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский