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();
    }

很明显,我不能只寻找,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块来设置一些状态变量(一个用于检查您是否已阅读函数声明符,一个用于跟踪当前范围,一个用于跟踪您是否是在注释块等中)。然后您必须阅读每一行,将其拆分为字段并尝试识别函数声明符{}注释分隔符等。

老实说,我不确定编写一个简单的 C、C++ 或 Java 程序来执行此操作是否会减少工作量。

于 2012-08-20T18:56:10.593 回答