DelFusa Blog 総本山

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

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

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

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

≫ EDIT

ソースコードからコメント部分を。

まだ、しぶとくコメント削除コードをもてあそんでいます。

VBのコメントアウト記号にREMというのが含まれているのには


         ∧,,∧ ガビーン
        ミ゚Д゚,,彡
        ⊂ ⊂ミ  
       ⊂゙゙ 〃  びくーりした。
       /(/″

そんな仕様わすれるわよね。
ということで大小文字区別しないように変更して
コメント部分の削除/抽出処理です。

HTMLのコメントにも対応。

いきなりソース。



ここからは呼び出し部分。VB形式やHTML形式での呼び出しを記述してます。
単にテーブルに設定をいれて、関数呼び出すだけ。

ライブラリ部分を汎用的に作っているから便利でいいね。


function VBCommentDelete(S: WideString): WideString;
var
braceTable: TBraceTable;
begin
SetLength(braceTable, 3);
with braceTable[0] do
begin beginMark := '"'; endmark := '"'; SourceStatus := ssSource; end;
with braceTable[1] do
begin beginMark := ''''; endmark := EndOfLine; SourceStatus := ssComment; end;
with braceTable[2] do
begin beginMark := 'rem'; endmark := EndOfLine; SourceStatus := ssComment; end;

Result := CommentDelete(S, braceTable);
end;

function VBCommentExtraction(S: WideString): WideString;
var
braceTable: TBraceTable;
begin
SetLength(braceTable, 4);
with braceTable[0] do
begin beginMark := '"'; endmark := '"'; SourceStatus := ssSource; end;
with braceTable[1] do
begin beginMark := ''''; endmark := EndOfLine; SourceStatus := ssComment; end;
with braceTable[2] do
begin beginMark := 'rem'; endmark := EndOfLine; SourceStatus := ssComment; end;
with braceTable[3] do
begin BeginMark := CR; EndMark := LF; SourceStatus := ssComment; end;

Result := CommentExtraction(S, braceTable);
end;

function HTMLCommentDelete(S: WideString): WideString;
var
braceTable: TBraceTable;
begin
SetLength(braceTable, 1);
with braceTable[0] do
begin beginMark := ''; SourceStatus := ssComment; end;

Result := CommentDelete(S, braceTable);
end;

function HTMLCommentExtraction(S: WideString): WideString;
var
braceTable: TBraceTable;
begin
SetLength(braceTable, 2);
with braceTable[0] do
begin beginMark := ''; SourceStatus := ssComment; end;
with braceTable[1] do
begin BeginMark := CR; EndMark := LF; SourceStatus := ssComment; end;

Result := CommentExtraction(S, braceTable);
end;


ここから下は、ライブラリ部分ね。ちょこちょこリファクタリングしてきれいになってます。

実装していたら、文字列パーサーの実装方法のコツがようやくわかってきました。
そのあたりの考察はまた後日しましょう。

とりあえず今日はこのあたりで。

const
EndOfLine = CRLF;
type
TSourceStatus = (ssSource, ssComment);
type
TBraceInfo = record
BeginMark: WideString;
EndMark: WideString;
SourceStatus: TSourceStatus
end;
type
TBraceTable = array of TBraceInfo;
function FindCommentStart(const str: WideString; FromIndex: Integer;
BraceTable: TBraceTable;
out SearchIndex: integer; out braceInfo: TBraceInfo ): boolean;
var
bt: Integer;
i: integer;
begin
SearchIndex := MaxInt;
for bt := Low(BraceTable) to High(BraceTable) do
begin
i := RangeWidePosForward(braceTable[bt].BeginMark, str ,
FromIndex, MaxInt, True);
if (0 < i) and (i < SearchIndex) then
begin
braceInfo := BraceTable[bt];
SearchIndex := i;
end;
end;
Result := False;
if SearchIndex < MaxInt then
Result := True;
end;
procedure ResultWrite(StartIndex, EndIndex: Integer;
var ResultIndex, SourceIndex: Integer;
var Dest, Source: WideString);
var
i: Integer;
begin
for i := StartIndex to EndIndex do
begin
Dest[ResultIndex] := Source[SourceIndex];
Inc(ResultIndex); Inc(SourceIndex);
end;
end;
function CommentDelete(Source: WideString; BraceTable: TBraceTable): WideString;
var
SearchIndex, i, LoopCount: integer;
removeLen: integer;
bi: TBraceInfo;
SourceIndex, ResultIndex: Integer;
begin
SetLength(Result, Length(Source));
SourceIndex := 1; ResultIndex := 1;
while FindCommentStart(Source, SourceIndex, BraceTable, SearchIndex, bi) do
begin
if bi.SourceStatus = ssSource then
begin
ResultWrite(SourceIndex, SearchIndex + Length(bi.BeginMark) - 1,
ResultIndex, SourceIndex, Result, Source);
if bi.EndMark = '' then Continue;
SearchIndex :=
RangeWidePosForward(bi.EndMark, Source,
SourceIndex, MaxInt, True);
if SearchIndex = 0 then
begin
ResultWrite(SourceIndex, Length(Source),
ResultIndex, SourceIndex, Result, Source);
SetLength(Result, ResultIndex - 1);
Exit;
end else
begin
ResultWrite(SourceIndex, SearchIndex + Length(bi.EndMark) - 1,
ResultIndex, SourceIndex, Result, Source);
end;
end else
begin
ResultWrite(SourceIndex, SearchIndex - 1,
ResultIndex, SourceIndex, Result, Source);
SourceIndex := SearchIndex + Length(bi.BeginMark);
if bi.EndMark = '' then Continue;
SearchIndex :=
RangeWidePosForward(bi.EndMark, Source,
SourceIndex, MaxInt, True);
if SearchIndex = 0 then
begin
SetLength(Result, ResultIndex - 1);
Exit;
end else
begin
if bi.EndMark = EndOfLine then
SourceIndex := SearchIndex
else
SourceIndex := SearchIndex + Length(bi.EndMark);
end;
end;
end;
ResultWrite(SourceIndex, Length(Source),
ResultIndex, SourceIndex, Result, Source);
SetLength(Result, ResultIndex-1);
end;
function CommentExtraction(Source: WideString; BraceTable: TBraceTable): WideString;
var
SearchIndex, i, LoopCount: integer;
removeLen: integer;
bi: TBraceInfo;
SourceIndex, ResultIndex: Integer;
begin
SetLength(Result, Length(Source));
SourceIndex := 1; ResultIndex := 1;
while FindCommentStart(Source, SourceIndex, BraceTable, SearchIndex, bi) do
begin
if bi.SourceStatus = ssSource then
begin
SourceIndex := SearchIndex + Length(bi.BeginMark);
SearchIndex :=
RangeWidePosForward(bi.EndMark, Source,
SourceIndex, MaxInt, True);
if SearchIndex = 0 then
begin
SetLength(Result, ResultIndex - 1);
Exit;
end else
begin
SourceIndex := SearchIndex + Length(bi.EndMark);
Continue;
end;
end else
begin
SourceIndex := SearchIndex;
SearchIndex :=
RangeWidePosForward(bi.EndMark, Source,
SourceIndex + Length(bi.BeginMark), MaxInt, True);
if SearchIndex = 0 then
begin
ResultWrite(SourceIndex, Length(Source),
ResultIndex, SourceIndex, Result, Source);
SetLength(Result, ResultIndex - 1);
Exit;
end else
begin
if bi.EndMark = EndOfLine then
ResultWrite(SourceIndex, SearchIndex - 1,
ResultIndex, SourceIndex, Result, Source)
else
ResultWrite(SourceIndex, SearchIndex + Length(bi.EndMark) - 1,
ResultIndex, SourceIndex, Result, Source);
end;
end;
end;
SetLength(Result, ResultIndex-1);
end;


スポンサーサイト

| 未分類 | 01:50 | comments:0 | trackbacks(-) | TOP↑

COMMENT















非公開コメント

PREV | PAGE-SELECT | NEXT

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