- PR -

コメント行の削除

投稿者投稿内容
未記入
会議室デビュー日: 2006/06/02
投稿数: 11
投稿日時: 2006-12-21 00:45
よろしくお願いします。
例:
int a;/*整数aの宣言*/int b;/*整数bの宣言*/

int a;int b

このようにC言語のソースで同じ行に複数のコメント文がある場合の文字列の整形で
躓いています。
IndexOf関数で/*と*/の出現する位置を取得するところまでは出来たのですが
その後の/*から*/の削除方法を、ご教示お願い出来ないでしょうか。
また、正規表現で行う場合の方法もご教示していただければ幸いです。

コード:
void Search_Position(String^ str)
{
	int beginComment = 0;
	int endComment = 0;
	int tmp = 0;

	while (tmp >= 0)
	{
		beginComment = str->IndexOf( "/*", beginComment );
		endComment = str->IndexOf( "*/", endComment );
		beginComment = beginComment + 1;
		endComment = endComment + 1;
		tmp = str->IndexOf( "/*", beginComment );
	}
}

mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2006-12-21 09:35
msoです。

学校の課題は自分でやってください。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-21 09:42
引用:

未記入さんの書き込み (2006-12-21 00:45) より:

IndexOf関数で/*と*/の出現する位置を取得するところまでは出来たのですが
その後の/*から*/の削除方法を、ご教示お願い出来ないでしょうか。
また、正規表現で行う場合の方法もご教示していただければ幸いです。


位置がわかっているのであれば、Remove メソッドとか、Substring メソッドなどが使えますよね。
C++/CLI のようですから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-12-21 23:59
 設計しようよ。
コード:

string 元の文字列 = "int a;/* 整数aを宣言する */int b;/* 整数bを宣言する */";
int コメント開始位置 = 元の文字列.IndexOf("/*");
while (コメント開始位置 >= 0) {
int コメント終了位置 = 元の文字列.indexOf("*/", コメント開始位置 + 1);
if (コメント終了位置 >= 0) {
string コメントより前の文字列 = 元の文字列.SubString(0, コメント開始位置 - 1);
string コメントより後の文字列 = 元の文字列.SubString(コメント終了位置 + 2);
元の文字列 = コメントより前の文字列 + コメントより後の文字列;
} else {
break;
}
コメント開始位置 = 元の文字列.IndexOf("/*");
}


でも、ダメ。文字列の中に /* */ があったら、それも削除しちゃう。
"/* /* /* /* /* " こんなことされると、ちとまずいかも。

ステートマシンを使って、1文字ずつ読んでいくのが常道。


BB 間違うた

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-12-22 00:00 ]
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2006-12-22 06:56
/\*.*?\*/

aaa/*bbbbb/*bbbbb*/
には対処できるけど

// /*
int i=5;
/* */

まで対処するなら、可変の否定戻り読み
を使ってください

//
は、拡張されたC言語でないと使えないコメントですが

[ メッセージ編集済み 編集者: 明智重蔵 編集日時 2006-12-22 16:00 ]
未記入
会議室デビュー日: 2006/06/02
投稿数: 11
投稿日時: 2006-12-23 19:00
Jittaさん明智重蔵さんお世話になります、遅くなりましたが取り合えずですがJittaさんさんのコードコードを元に書いてみまし。
引用:

ステートマシンを使って、1文字ずつ読んでいくのが常道。


ステートマシンとはと思い検索しておぼろげに理解したのですが、/*および*/の出現の仕方をパターン化して
その場合に応じた処理を行うということでしょうか?

引用:

// /*
int i=5;
/* */

まで対処するなら、可変の否定戻り読み
を使ってください


可変の否定戻り読みの意味が良く分からないのですが、咀嚼してご教示願えませんでしょうか。

コード:

//----- Add 2006/12/20 ------------------------------------------------------//
// --------------------------------------------------------------------------
// 作成日    : 2006年12月20日
// 関数名    : void Search_Position(String^ str)
// 説明        : 一行に/*と*/のコメント記号が存在する場合の処理
// 戻り値    : Strting^ str
// 引数        : Strting^ str
//---------------------------------------------------------------------------//
String^ Partial_Deletion(String^ str)
//----- End 2006/12/20 ------------------------------------------------------//
{
int start = str->IndexOf("/*");
while (start >= 0)
{
try
{
int end = str->IndexOf("*/", start + 1);
if (end >= 0)
{
String^ org_str = str->Substring(0, start);
String^ construction_str = str->Substring(end + 2);
str = org_str + " " + construction_str;
}
else
{
break;
}
start = str->IndexOf("/*");
}
catch (System::ArgumentOutOfRangeException^ e)
{
MessageBox::Show("Partial_Deletion" + e->Message);
}
}
return str;
}



[ メッセージ編集済み 編集者: 未記入 編集日時 2006-12-24 01:35 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-12-24 01:38 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-12-24 20:50
引用:

未記入さんの書き込み (2006-12-23 19:00) より:
ステートマシンとはと思い検索しておぼろげに理解したのですが、/*および*/の出現の仕方をパターン化して
その場合に応じた処理を行うということでしょうか?


いいえ。
1文字ずつ読んで、読み込んだ文字列によって、ステートを変化させます。
変化したステートによって、次の文字列をどう扱うかを決めます。
_________________
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-12-24 22:04
こんにちは

コメントの削除を行なうには簡単な字句解析をしなければなりませんねぇ
字句解析の結果がコメントでない字句を出力すればコメントの削除は出来ます。

コード:

struct {
int kind;
char *string;
}token;

while(token = get_token())
{
if (token.kind == コメント){
// 何もしない
break;
}else{
fputs(token.string);
}
}



get_tokenの中で トークンの切り出しを行ないます。
文字列やら、演算子やら、コメントやら。
※このコードは処理の概要なので動作しませんので悪しからず。

字句解析、yacc、lex、オートマトン
などでググってみるとしわあせ(←なぜか変換できない)になれるかもw

結局は一文字ずつ処理しなければならないことがわかると思います。

[ メッセージ編集済み 編集者: 末記人 編集日時 2006-12-24 22:06 ]

[ メッセージ編集済み 編集者: 末記人 編集日時 2006-12-24 23:15 ]

スキルアップ/キャリアアップ(JOB@IT)