DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

コメントデリート


           ( ,,,,,,∧,,∧
≡≡≡≡三三 ⊂  つ゚Д゚ミつ
           """""
     ビューーーーン


リンクはふせますが、とあるサイトで、Pascalのコメントの削除処理が書かれていましたので
確か2chで教えられたか何かして手持ちしているコードを漏れも晒してみます。



Constを変更するだけで機能を変える事ができて便利そう。
Deleteを毎度毎度やっているから相当遅いって言われそうだな。
まあ、チューニングはお好みで。

たとえば、引数指定はvarではなくoutで書くべきでしょうね。

function PascalCommentDelete(S: String): String;
 type
  TBraceInfo = record
   beginMark: string;
   endmark: string;
   remove: boolean;
  end;

  TBraceType = (btComment, btCompira, btBrace, btParenStar, btLineComment);

 const
  EndOfLine = #13;
  braceTable: array[TBraceType] of TBraceInfo = (
   (beginMark: ''''; endMark: ''''; remove: false),
   (beginMark: '{$'; endMark: '}'; remove: false),
   (beginMark: '{'; endMark: '}'; remove: true),
   (beginMark: '(*'; endMark: '*)'; remove: true),
   (beginMark: '//'; endMark: EndOfLine; remove: true) );

 function findCommentStart( const str: string; var index: integer;
  var braceInfo: TBraceInfo ): boolean;
 var bt: TBraceType;
  i: integer;
 begin
  index := MaxInt;
  for bt := Low(TBraceType) to High(TBraceType) do
  begin
   i := AnsiPos( braceTable[bt].beginMark, str );
   if i > 0 then
    if i < index then
    begin braceInfo := BraceTable[bt];
     index := i;
    end;
  end;
  result := False;
  if index < MaxInt then
   result := True;
 end;

var
 index: integer;
 removeLen: integer;
 bi: TBraceInfo;
 Str: String;
begin
 Str := S;
 Result := '';
 while findCommentStart(Str, index, bi) do
 begin
  Result := Result + Copy(Str, 1, index - 1);
  Delete(Str, 1, index-1);
  if not bi.remove then
   Result := Result + bi.beginMark;
  Delete(Str, 1, Length(bi.beginMark));

  index := AnsiPos( bi.endMark, Str );
  if index = 0 then
  begin
   if not bi.remove then
    Result := Result + Str;
   Exit;
  end;
  removeLen := index - 1;
  if bi.EndMark <> EndOfLine then
   Inc(removeLen, Length(bi.EndMark));
  if not bi.remove then
   Result := Result + Copy(Str, 1, removeLen);
  Delete(Str, 1, removeLen);
 end;
 Result := Result + Str;
end;

ちなみに。パフォーマンスを計ったりはしてない
ですし、文字数単位で処理をした例とかでもありません。

単にこういうコードもあったよ。って例なだけ。



ストーリーがあるとよりよいらしいということに
同意したのでストーリーを付けます。

---- ストーリー -----
Delフサギコさんが他のサイトをみたら
Pascalのコメント削除処理がのってました。
俺もPascalコメント削除処理をちょうどもっていたので
ちょっと張り合ってみよーかな、と思いました。

うちのは『(*コメント*)』にも対応だもん!

C++や他言語のコメント除去処理に応用が利きやすい気がしない?

複雑な文字列解析をすぐに改造できるレベルに簡単に
Const定義しているので結構、お気に入り。
しかも内容が非常にわかりよい。

ちなみに、作成者はおれではないです。
2ch過去ログ参照のこと。(どこで教えてもらったのかは知らない)
----- ストーリー終わり -----

※ 『以下読まないこと。』の意味が本当に全くわかりません。(w
   必要ならメールくださ...(ry



|∧,, ∧  デレ  
ミ*゚Д゚*ミ   
| ⊂ ミ
|   ミ  
|∪''∪


さて、こういう処理を書く場合には
動作確認にはとっても重要なテストコード


procedure testPascalCommentDelete;
begin
 Check('あいうえおさしすせそ', PascalCommentDelete('あいうえお{かきくけこ}さしすせそ'));
 Check('あいうえおさしすせそ', PascalCommentDelete('あいうえお(*かきくけこ*)さしすせそ'));
 Check('あいうえお'#13#10#13#10'さしすせそ',
  PascalCommentDelete('あいうえお'#13#10'//かきくけこ'#13#10'さしすせそ'));

 Check('かきくけこさしすせそ', PascalCommentDelete('{あいうえお}かきくけこさしすせそ'));
 Check('かきくけこさしすせそ', PascalCommentDelete('(*あいうえお*)かきくけこさしすせそ'));
 Check(#13#10'かきくけこ'#13#10'さしすせそ',
  PascalCommentDelete('//あいうえお'#13#10'かきくけこ'#13#10'さしすせそ'));

 Check('あいうえおかきくけこ', PascalCommentDelete('あいうえおかきくけこ{さしすせそ}'));
 Check('あいうえおかきくけこ', PascalCommentDelete('あいうえおかきくけこ(*さしすせそ*)'));
 Check('あいうえお'#13#10'かきくけこ'#13#10,
  PascalCommentDelete('あいうえお'#13#10'かきくけこ'#13#10'//さしすせそ'));

 Check('かきくけこ', PascalCommentDelete('{あいうえお}かきくけこ(*さしすせそ*)'));
 Check('かきくけこ', PascalCommentDelete('(*あいうえお*)かきくけこ{さしすせそ}'));
 Check(#13#10'かきくけこ'#13#10,
  PascalCommentDelete('//あいうえお'#13#10'かきくけこ'#13#10'{さしすせそ}'));

 Check('あい''{うえ(*''お*)', PascalCommentDelete('あい''{うえ(*''お{かき''くけこ}*)'));

 Check('かきくけこ', PascalCommentDelete('{あいうえお}かきくけこ(*さしすせそ'));
 Check('かきくけこ', PascalCommentDelete('(*あいうえお*)かきくけこ{さしすせそ'));
 Check(#13#10'かきくけこ'#13#10,
  PascalCommentDelete('//あいうえお'#13#10'かきくけこ'#13#10'{さしすせそ'));

 Check('あいうえお}かきくけこ', PascalCommentDelete('あいうえお}かきくけこ(*さしすせそ'));
 Check('あいうえお*)かきくけこ', PascalCommentDelete('あいうえお*)かきくけこ{さしすせそ'));
 Check('あい'#13#10'かきくけこ'#13#10,
  PascalCommentDelete('あい//うえお'#13#10'かきくけこ'#13#10'{さしすせそ'));

 Check('さしすせそ*)', PascalCommentDelete('(*あいうえお(*かきくけこ*)さしすせそ*)'));


 Check('あいうえお{$かきくけこ}さしすせそ', PascalCommentDelete('あいうえお{$かきくけこ}さしすせそ'));

 Check('{$あいうえお}かきくけこさしすせそ', PascalCommentDelete('{$あいうえお}かきくけこさしすせそ'));

 Check('あいうえおかきくけこ{$さしすせそ}', PascalCommentDelete('あいうえおかきくけこ{$さしすせそ}'));

 Check('{$あいうえお}かきくけこ', PascalCommentDelete('{$あいうえお}かきくけこ(*さしすせそ*)'));
 Check('かきくけこ{$さしすせそ}', PascalCommentDelete('(*あいうえお*)かきくけこ{$さしすせそ}'));
 Check(#13#10'かきくけこ'#13#10'{$さしすせそ}',
  PascalCommentDelete('//あいうえお'#13#10'かきくけこ'#13#10'{$さしすせそ}'));

 Check('あい''{$うえ(*''お{$かき''くけこ}*)', PascalCommentDelete('あい''{$うえ(*''お{$かき''くけこ}*)'));

 Check('{$あいうえお}かきくけこ', PascalCommentDelete('{$あいうえお}かきくけこ(*さしすせそ'));
 Check('かきくけこ{$さしすせそ', PascalCommentDelete('(*あいうえお*)かきくけこ{$さしすせそ'));
 Check(#13#10'かきくけこ'#13#10'{$さしすせそ',
  PascalCommentDelete('//あいうえお'#13#10'かきくけこ'#13#10'{$さしすせそ'));

 Check('あいうえお*)かきくけこ{$さしすせそ', PascalCommentDelete('あいうえお*)かきくけこ{$さしすせそ'));
 Check('あい'#13#10'かきくけこ'#13#10'{$さしすせそ',
  PascalCommentDelete('あい//うえお'#13#10'かきくけこ'#13#10'{$さしすせそ'));
end;

これまた、違うサイトで、話題になっていたSEO対策については
このブログでは何もしてません。

・内容にあったタイトルをつけてません。

自分でも見つけるのが不便なくらいやっかいです。

・ストーリーを書かない。

ストーリーを書く能力に乏しいです。

・タグをつけない

つけかたがよくわからなくてblog書き始めた当初から
カテゴリー分けとかも、よくわからなくて挫折しました。

・検索で訪れてくる人に向けて記事を修正しない。

そもそもアクセス解析のやり方がわかりません。
誰が検索で訪れてくれている人ですか?
俺の代わりに調べて教えてください。



  ∧,,∧l||l   
  ミ,,  彡 
 ミ   ∪  
 ,と,,と,,,)  ブログ1年続けて....これだ....


※※うちの『以下読まない事』(w
  某mobilefreeホストからかきこまれた内容。
  某asahi-net.or.jpホストは拒否っていたけど、mobilefreeホストからは拒否忘れてた間に
  管理者にしか見えない設定でこんな内容が。

  > おくることば
  > 自戒を込めて。
  > 必読書よりだいじなネット時代の定理
  > * きみの嫌いなタイプのひとは、きみの文章から都合のいい1行だけ選んで誤読し、残りは一切読まない。
  > * きみが何かを書いても、ぜったいに、きみの嫌いな人の考えや行動を変えることはできない。
  > * 議論で相手を知ることができると思わないほうがいい。きみが議論を通じて深く知り合えたと思う人は、もともと同じくらいの考える力を持っていたのであって、議論以外のやりかたで知り合っていたらもっと簡単に友達になれていた人だ。
  > * きみが間違っていると思う考えを批判しても、世界がつづいていくかぎり、たぶんその間違っている(ときみが思う)考えは、なくならない。
  > * きみは歳を取るが、きみが嫌いなタイプのひとは、ある一定の年代や考え方をする人のなかに、供給されつづける。
  > * きみが「こいつら頭が悪い」と思っている程度には、きみも頭が悪いと思われている。
  > では Tiburon FT で会いましょう。
  
  すぐにmobilefreeホスト拒否!(w

  これが(粘着を引き受ける)立場ってものですか!


---- ストーリー -----
仲のいい人もいれば、嫌いな人もいる。

俺は大抵の人と、blog書いているような、みんなによいテクニックを知らせようとする人は好きだが俺の(他人の)ブログに粘着していっつも、ブログ主や話し相手を傷つけようとしてくる人は嫌いだから、会話しません。

言うことに価値のない人の言うことを聞く必要はないんです。
きっぱり。
----- ストーリー終わり -----
スポンサーサイト

| 未分類 | 09:57 | comments:1 | trackbacks(-) | TOP↑

COMMENT

ところで、言語仕様を知らないのでやっていないのですが、上記コードをささっと改造すれば、C/C++/C#/Java/Bat/Ini/VB/などなど
のソースコードからコメント除去
もしくは、ソースコードからコメントだけ取り出し
というコードがかけるのではあるまいでしょうか?

最初のconst定義変えるだけで全言語に対応するそういうコードを書けたらとても汎用的ですね。

誰か。他言語に素養のあるかた。
デバッグコードを書いてみたりしない?

| ミ・д・彡 | 2008/04/10 20:46 | URL | ≫ EDIT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。