アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++言語で、読み込んだcppファイルのステップ数をカウントするツールを作成しているんですが、
複数行にまたがるブロックコメント行や、関数ごとのカウントなどがうまくいきません。
表示したいのは総ステップ、関数ごとの実ステップ、コメントステップ、その他(空白行や#include文など)です。
仕様はおおまかに以下になります。
・コメント行とはC/C++のコメントで、//で始まる行コメントと、
 複数行にまたがる/*~*/ブロックコメントのどちらも認識する。
・非コメントとコメントが1行にある場合、その一文が関数内にある場合は
 実ステップとしてカウントします。(a++ ;/* インクリメント */などの場合)
現在は"//"や"/*"や"*/"や"{"や"}"などの文字を検索し、それぞれが
見つかった場合ごとに処理を分けて考えていますが、関数の中に書かれているのか
そうでないのかや、ブロックコメントなのかなど、複雑な条件がからんでいるので
正直、どういうプログラムになるのかわからず、混乱している状況です。
どのように組んでいけばいいでしょうか。よろしくお願いいたします。

A 回答 (2件)

前回の問題(QNo.3575185)と同じですよね。

再質問するなら向こうを締めましょう。

いずれにせよ、C++から始めるのは難しいので、まずはCに対応したものを作ってみましょう。Cなら小手先の方法で簡単に出来ます。
C++の場合、コメントも関数も入れ子になりますし、テンプレートのような非常に煩雑なものもあるので、まともに構文解析を行わないと無理です。国際文字名なんかもやっかいです。
例えば、

/*
// 入れ子のコメント
*/
int 日本語名の関数()
{
 struct A {
  int 入れ子の関数() { return 12345; }
 };
 static A a;
 return a.入れ子の関数();
}

といったソースをどう扱えばよいのでしょうか?
ちなみに、「日本語名の関数」とか「入れ子の関数」というのもC++では正当な識別子です。

Cにしか対応しないツールを拡張してC++に対応させるのは困難ですが、そこで一旦経験を積むことが大事だと思います。
    • good
    • 0
この回答へのお礼

締めずに再質問してしまって、すみません。
あちらは締め切らせていただきました。

そうですね。
とりあえず簡単に考えられるところから考えをまとめていきたいと思います。
ありがとうございました。

お礼日時:2007/12/07 13:52

こんにちは。


C言語のバイブルである、「プログラム言語C」に参考となるプログラムが出ています。

その後、「Cプログラム診断室(技術評論社:刊)」の末尾に、回答が出ています。

たぶん、行をカウントした後、パターンマッチプログラムを作ればよいはずですが、パターンマッチの条件をどのようにして保持して、それをカウントするのかは、人によって異なると思います。

do-while ループを用いて、switch-caseで処理する場合、if-thenで作成する場合などなど・・。

その辺りをきちんと整理してから、プログラムを組むと良いと思います。
    • good
    • 0
この回答へのお礼

どちらの本も読んだことがありませんが、ぜひ参考にさせていただきたいと思います!!

丁寧な回答、本当にありがとうございました。

お礼日時:2007/12/07 13:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!