完整地使用C / C ++ / Java函数

时间:2012-08-20 14:45:53

标签: java c++ c regex awk

我希望按照

的方式做点什么
awk '/begin-regex/,/end-regex/'

但更先进一点。我想搜索整个函数,特别是在Java中,但我看不出它对C / C ++或其他使用花括号({})的其他函数不起作用。 / p>

以下是一些示例代码(来自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能够计数并能够做我想问的事。

2 个答案:

答案 0 :(得分:1)

你正在做一个ctags工作,调用ctags生成一个标签文件,然后解析标签文件将使生活更轻松。

答案 1 :(得分:1)

awk是这项工作的错误工具。它非常适合识别正则表达式,但是这个任务需要一些诚实的解析,而awk实际上并不是为此而构建的。您需要考虑的一些问题:

  • 文件,其中函数类型,声明符,{(可能})出现在同一源代码行中,而文件则出现在不同的源代码行中;
  • 在同一源代码行中多次出现{};
  • 功能名称,{}出现在评论中
  • 区分函数定义和函数调用;
  • 在C和C ++中正确识别毛茸茸的函数原型;

关于最后一点,请记住在C和C ++中,以下是完全合法的函数原型:

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

其中foo是一个函数,返回指向另一个函数的指针,返回指向SIZE的指针 - 指向int的指针数组。

至少,你需要一个BEGIN块来设置一些状态变量(一个用于检查你是否已经读取了函数声明符,一个用于跟踪当前作用域,一个用于保持跟踪你是否在评论区等。)然后,您必须阅读每一行,将其拆分为字段并尝试识别函数声明符,{},注释分隔符等。

老实说,我不确定编写一个简单的C,C ++或Java程序来完成这项工作的工作量会减少。