我正在尝试编写一个 Emacs lisp 函数来查找 C 文件中的所有“for”循环并计算它们的长度。我还没有找到一个正则表达式。将找到所有“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”语句起作用,我将继续使用“while”循环等)
如果能得到任何帮助,我将不胜感激。
最佳答案
尝试为这种情况找到一个万无一失的正则表达式很困难,但您可以利用 cc-mode
函数来帮助导航代码,同时避免计算注释或宏中的任何内容。
我不太确定你所说的“长度”是什么意思,但下面的函数搜索一个 for
循环,如果找到一个,返回它确定的结束点之间的距离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
函数处理不带大括号的 for
循环的情况,找到结束分号,即使它在另一行也是如此。
关于regex - 我需要一个 Emacs 正则表达式来查找 "for"循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47130741/