我希望按照
的方式做点什么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能够计数并能够做我想问的事。答案 0 :(得分:1)
你正在做一个ctags工作,调用ctags生成一个标签文件,然后解析标签文件将使生活更轻松。
答案 1 :(得分:1)
awk
是这项工作的错误工具。它非常适合识别正则表达式,但是这个任务需要一些诚实的解析,而awk
实际上并不是为此而构建的。您需要考虑的一些问题:
{
(可能}
)出现在同一源代码行中,而文件则出现在不同的源代码行中; {
或}
; {
或}
出现在评论中关于最后一点,请记住在C和C ++中,以下是完全合法的函数原型:
int *(*(*foo(char *s))(int x))[SIZE] { ... }
其中foo
是一个函数,返回指向另一个函数的指针,返回指向SIZE
的指针 - 指向int
的指针数组。
至少,你需要一个BEGIN
块来设置一些状态变量(一个用于检查你是否已经读取了函数声明符,一个用于跟踪当前作用域,一个用于保持跟踪你是否在评论区等。)然后,您必须阅读每一行,将其拆分为字段并尝试识别函数声明符,{
和}
,注释分隔符等。
老实说,我不确定编写一个简单的C,C ++或Java程序来完成这项工作的工作量会减少。