Lex程序从给定文本中删除单行和多行注释

时间:2018-08-27 18:08:34

标签: regex yacc lex text-parsing lexical-analysis

我正在尝试编写一个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;
}

该程序无法删除多行注释。

2 个答案:

答案 0 :(得分:1)

如果abc.txt文件中有多个多行注释,则您的多行注释模式将匹配第一个多行注释的开始和最后一个多行注释的结束之间的所有内容。这是因为lex表现出贪婪的行为,并且将尝试匹配输入字符串的最长前缀。您的多行注释模式允许/ *和* /匹配(。* \ n)*

您的代码也不会检测到包含除字母数字字符和空格之外的任何字符的单行注释(例如-,;::等...)。

将模式操作更改为这些操作即可实现目标。

"//".*\n            { ++single; }
"/*"[^*/]*"*/"      { ++multi; }

尽管上面的代码仍将保留一些新行来代替已删除的多行注释。它有点棘手,我无法找到快速的方法来删除这些新行。

希望这会有所帮助!

答案 1 :(得分:0)

对于flex,

"//".* {singleLine++;}
"/*"([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/ {multiLine++;}

有关详细信息:https://blog.ostermiller.org/finding-comments-in-source-code-using-regular-expressions/