我试图编写一个Emacs lisp函数来查找所有" for"在C文件中循环并计算它们的长度。我还没找到一个正则表达式。将找到所有" for"声明。 (一旦我这样做,很容易计算循环长度。)正则表达式
"^[ \t]*for[ \t]*(.*\\;.*\\;.*)[:ascii:]*[^{\;]"
找到诸如
for (a;b;d) {
}
和
for (a;d;c) {ccc ;}
但不是
之类的for (a;b;c) xxxxxxxxx ;
或
for (a;b;c;)\n{
}
我目前的做法是跳过所有字符,直到遇到;
或{
,使用查看函数来决定它是哪种类型的循环。
正则表达式
^[ \t]*for[ \t]*(.*\\;.*\\;.*)[ \t\n]*[^{\;]
找到带有大括号的所有循环,但没有它们就找不到单行循环。我认为第一个正则表达式应该比这个更好,但事实并非如此。 (一旦我得到" for"陈述工作,我将继续前进到#34;而#34;循环等等。)
我很感激我能得到的任何帮助。
答案 0 :(得分:4)
尝试为这种情况找到一个万无一失的正则表达式很困难,但您可以利用cc-mode
函数来帮助浏览代码并避免计算注释或宏内的任何内容。
我不完全确定你的“长度”是什么意思,但下面的函数搜索for
循环,如果找到一个循环,则返回它确定为{{{}的结尾之间的距离。 1}}循环及其开头。如果找不到for
循环,则返回for
。如果按“长度”表示其他内容,您应该能够轻松地调整代码以执行您想要的操作。
nil
(defun for-loop-length ()
(save-excursion
(if (c-syntactic-re-search-forward "\\_<for\\_>" (point-max) t)
(let ((start (match-beginning 0)))
(c-skip-ws-forward)
(forward-sexp)
(c-skip-ws-forward)
(if (char-equal (char-after) ?{)
(forward-sexp)
(c-end-of-statement))
(- (point) start)))))
函数会自动跳过在注释,字符串文字和宏中搜索。 c-syntactic-re-search-forward
函数处理跳过水平和垂直空白的问题。 c-skip-ws-forward
函数处理没有大括号的c-end-of-statement
循环的情况,即使它在另一行上也能找到结束分号。