0

私はの線に沿って何かをしたいと思っています

awk '/begin-regex/,/end-regex/'

しかし、もう少し進んでいます。{特にJavaで関数全体を検索したいのですが、中括弧(および)を使用するC /C++やその他の関数で機能しない理由がわかりません}

ここにいくつかのサンプルコードがあります(http://introcs.cs.princeton.edu/java/14array/Sample.java.htmlから供給されています)

public class Sample {
    public static void main(String[] args) {
        int M = Integer.parseInt(args[0]);    // choose this many elements
        int N = Integer.parseInt(args[1]);    // from 0, 1, ..., N-1

        // create permutation 0, 1, ..., N-1
        int[] perm = new int[N];
        for (int i = 0; i < N; i++)
            perm[i] = i;

        // create random sample in perm[0], perm[1], ..., perm[M-1]
        for (int i = 0; i < M; i++)  {

            // random integer between i and N-1
            int r = i + (int) (Math.random() * (N-i));

            // swap elements at indices i and r
            int t = perm[r];
            perm[r] = perm[i];
            perm[i] = t;
        }

        // print results
        for (int i = 0; i < M; i++)
            System.out.print(perm[i] + " ");
        System.out.println();
    }
}

main今、私は関数を引き出したいだけです。

    public static void main(String[] args) {
        int M = Integer.parseInt(args[0]);    // choose this many elements
        int N = Integer.parseInt(args[1]);    // from 0, 1, ..., N-1

        // create permutation 0, 1, ..., N-1
        int[] perm = new int[N];
        for (int i = 0; i < N; i++)
            perm[i] = i;

        // create random sample in perm[0], perm[1], ..., perm[M-1]
        for (int i = 0; i < M; i++)  {

            // random integer between i and N-1
            int r = i + (int) (Math.random() * (N-i));

            // swap elements at indices i and r
            int t = perm[r];
            perm[r] = perm[i];
            perm[i] = t;
        }

        // print results
        for (int i = 0; i < M; i++)
            System.out.print(perm[i] + " ");
        System.out.println();
    }

2番目のループmain(.*?) {.*?}の終わりで停止して戻ってくるので、明らかに私はただ探すことはできませんfor

    public static void main(String[] args) {
        int M = Integer.parseInt(args[0]);    // choose this many elements
        int N = Integer.parseInt(args[1]);    // from 0, 1, ..., N-1

        // create permutation 0, 1, ..., N-1
        int[] perm = new int[N];
        for (int i = 0; i < N; i++)
            perm[i] = i;

        // create random sample in perm[0], perm[1], ..., perm[M-1]
        for (int i = 0; i < M; i++)  {

            // random integer between i and N-1
            int r = i + (int) (Math.random() * (N-i));

            // swap elements at indices i and r
            int t = perm[r];
            perm[r] = perm[i];
            perm[i] = t;
        }

それだけでは不十分です。

この単純なawkスクリプトを変更して、開いた中括弧と閉じた中括弧の数を保持し、コメントを無視するにはどうすればよいですか?そして、それが最初の関数よりも優れている関数のすべての出現を出力する場合。

編集:これは以前は本当に明確ではありませんでしたが、正規言語ではこれを解決できないことを認識しています。そのため、awkで何かを求めています。awkは数えることができ、私が求めていることを実行できることを私は知っています。

4

2 に答える 2

1

ctagsジョブを実行し、ctagsを呼び出しタグファイルを生成してから、タグファイルを解析すると作業が楽になります。

于 2012-08-20T14:53:21.070 に答える
1

awkこの仕事には間違ったツールです。正規表現の認識には優れていますが、このタスクには、神に正直な構文解析が必要です。これは、awk実際には構築されていません。あなたが説明しなければならないいくつかの問題:

  • 関数型、宣言子{(および場合によって}は)が同じソース行に表示されるファイルと、それらがすべて異なるソース行にあるファイル。
  • 同じソース行の{複数のオカレンス。}
  • 関数名、、{または}コメントに表示
  • 関数定義と関数呼び出しを区別する;
  • CおよびC++でヘアリー関数のプロトタイプを正しく認識する。

その最後のビットに関して、CおよびC ++では、以下が完全に合法的な関数プロトタイプであることを覚えておいてください。

int *(*(*foo(char *s))(int x))[SIZE] { ... }

ここで、fooは別の関数へのポインタを返す関数であり、へのポインタのSIZE-element配列へのポインタを返しますint

少なくとも、BEGINいくつかの状態変数を設定するためのブロックが必要です(1つは関数宣言子を読んだかどうかを確認するため、1つは現在のスコープを追跡するため、もう1つは自分がコメントブロックなど)。次に、すべての行を読み取り、フィールドに分割して関数宣言子、コメント区切り文字などを認識しようとする必要があり{ます}

正直なところ、これを行うための単純なC、C ++、またはJavaプログラムを作成する作業が少なくなるかどうかはわかりません。

于 2012-08-20T18:56:10.593 に答える