我想计算关于c ++程序的“空行”,“单一评论”,“块评论”。
我使用flex编写工具。但该工具无法匹配c ++块注释。
1 flex代码:
%{
int block_flag = 0;
int empty_num = 0;
int single_line_num = 0;
int block_line_num = 0;
int line = 0;
%}
%%
^[\t ]*\n {
empty_num++;
printf("empty line\n");
}
"//" {
single_line_num++;
printf("single line comment\n");
}
"/*" {
block_flag = 1;
block_line_num++;
printf("block comment begin.block line:%d\n", block_line_num);
}
"*/" {
block_flag = 0;
printf("block comment end.block line:%d\n", block_line_num);
}
^(.*)\n {
if(block_flag)
block_line_num++;
else
line++;
}
%%
int main(int argc , char *argv[])
{
yyin = fopen(argv[1], "r");
yylex();
printf("lines :%d\n" ,line);
fclose(yyin);
return 0;
}
2 hello.c
bbg@ubuntu:~$ cat hello.c
#include <stdlib.h>
//
//
/*
*/
/* */
3输出
bbg@ubuntu:~$ ./a.out hello.c
empty line
empty line
lines :6
为什么“//”和“/ *”无法匹配单个评论和阻止评论?
答案 0 :(得分:4)
软硬度:
不搜索。它按顺序匹配模式,每个模式从另一个结束开始。
始终选择最长匹配的模式。 (如果两个或多个模式完全匹配相同的数量,则选择第一个模式。
所以,你有
"//" { /* Do something */ }
和
^.*\n { /* Do something else */ }
假设它刚刚匹配第二个,所以我们在一行的开头,并假设该行开始//
。现在,这两个模式匹配,但第二个匹配整行,而第一个匹配两个字符。所以第二个获胜。那不是你想要的。
提示1:您可能希望//
条评论与行尾
提示2:有一个正则表达式会匹配/*
个评论,虽然它有点单调乏味:"/*"[^*]*"*"+([^*/][^*]*"*"+)*"/"
不幸的是,如果你使用它,它不会为你计算行尾,但是你应该能够适应它做你想做的事。
提示3:您可能想要考虑从一行开始的注释,可能是缩进的。您的规则^.*\n
将吞下整行,甚至无需查看其中是否有评论。
提示4:字符串文字隐藏评论。