gpt4 book ai didi

c - 计算注释行数的 lex 程序

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:46 24 4
gpt4 key购买 nike

这里程序统计了评论行数、单行评论和多行评论的数量,并给出了一个以file.txt为输入的总评论输出

文件.txt

//hellow world
/*hello world1*/
/*hello world2
*/
/*hello world3
hello world3.1*/
#include<>

计数.l

    %{
#include<stdio.h>
#include<stdlib.h>
int a=0,b=0,c=0,d;
%}
%%
"//".* {a++;}
"/*" {b++;}
.*"*/" {b--;c++;}
%%
void main(int argc,char *argv[]){
yyin=fopen(argv[1],"r");
yylex();
printf("single line %d \nmultiline %d \n",a,c);
d=a+c;
printf("total %d \n",d);
}

这里我得到的输出是

./a.out 文件.txt

hello world2 

hello world3



#include<>
single line 1
multiline 3
total 4

我需要得到的输出就是

#include<>
single line 1
multiline 3
total 4

我也尝试过这种方式 我在 "/*" 前面添加了 .* 就像这样 "/*".* 然后它会删除该行中的 "*/" 并将多行注释计数为 2。我尝试了各种方法,但我有点卡住了。

最佳答案

这就是开始状态的用途——它们允许您为不同的状态定义不同的匹配规则:

%{
#include<stdio.h>
#include<stdlib.h>
int a=0,b=0,c=0,d;
%}
%x COMMENT /* an exclusive state that does not also match normal stuff */
%%
"//".* {a++;}
"/*" { BEGIN COMMENT; }
<COMMENT>"*/" {c++; BEGIN INITIAL; }
<COMMENT>. ;
%%
void main(int argc,char *argv[]){
yyin=fopen(argv[1],"r");
yylex();
printf("single line %d \nmultiline %d \n",a,c);
d=a+c;
printf("total %d \n",d);
}

这将妥善处理类似的事情

/*  //  */  ..this is not a comment..

这会混淆大多数其他尝试这样做的方法。它还会继续输出注释中的换行符(因此多行/../注释将显示为空行。如果您不希望这样,可以为 <COMMENT>\n 添加规则

关于c - 计算注释行数的 lex 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47228599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com