我正在尝试编写一个lex程序,它将删除单行注释和多行注释。
%{
#include<stdio.h>
int single=0;
int multi=0;
%}
%%
"//"([a-z]|[A-Z]|[0-9]|" ")* {++single;}
"/*"(.*\n)* "*/" {++multi;}
%%
int main(int argc, int **argv)
{
yyin=fopen("abc.txt","r");
yylex();
printf("no of single line comment = %d ", single);
printf("no of multi line comment = %d ", multi);
return 0;
}
此程序无法删除多行注释。
如果您的abc.txt文件中有多个多行注释,那么多行注释的模式将匹配第一个多行注释的开始和最后一个多行注释的结束之间的所有内容。这发生在lex表现出贪婪的行为并将尝试匹配输入字符串的最长前缀。您的多行注释模式允许/ *和* /匹配(。* \ n)*
此外,您的代码不会检测包含除字母数字字符和空格之外的任何字符的单行注释(例如 - ,;:etc ...)。
将您的模式操作更改为这些,它应该实现您的目标。
"//".*\n { ++single; }
"/*"[^*/]*"*/" { ++multi; }
虽然上面的代码仍然会留下一些新行来代替删除的多行注释。它有点棘手,我无法找到快速解决方案来删除这些新行。
希望这可以帮助!