Lex程序检查评论行

时间:2014-03-09 08:53:28

标签: lex

有没有人可以帮我写一个LEX程序来检查和计算C程序中的注释行。我到处搜索它并没能得到完整的代码。

3 个答案:

答案 0 :(得分:4)

评论行的格式为

  

%%   {START} {无论符号,字母数字和字母} {END}   %%

  • START符号可以是//或/ *在C中。
  • END符号为* /
  • 如果是“//”,任何其他符号都可以在 LINE 中跟随它,包括第二次出现 // (被忽略)。
  • 如果它是“/ *”,它将找到“* /”的下一个立即匹配,并且其间出现的所有其他模式都匹配(此匹配可能包括空格,制表符,“//”和“/ *”在其中)

以下是执行此操作的示例代码

`   

%{
#include<stdio.h>
int c=0;
%}
START "/*"
END "*/"
SIMPLE [^*]
SPACE [ \t\n]
COMPLEX "*"[^/]
%s newstate
%%
"//"(.*[ \t]*.*)*[\n]+    {c++; fprintf(yyout," ");}
{START}                    {yymore();BEGIN newstate;}
 <newstate>{SIMPLE}        {yymore();BEGIN newstate;}
 <newstate>{COMPLEX}      {yymore();BEGIN newstate;}
 <newstate>{SPACE}        {yymore();BEGIN newstate;}
 <newstate>{END}  {c++;fprintf(yyout," ");BEGIN 0;}
%%
main()
{//program to remove comment lines
yyin=fopen("file4","r");
yyout=fopen("fileout4","w");system("cat file4");
yylex();system("cat fileout4");
printf("no.of comments=%d",c);
fclose(yyin);
fclose(yyout);
}
`

输入文件“file4”位于

之下
/* #include <stdlib.h>


    {}.@All nonsense symbols */
//another comment
int main{}
{/**/
 printf("hello");
 /* comment inside// comment is ignored */
 //how about//this?
 /* now we /* try this */ */
 printf("COOL!!");
 return (0);
}

它提供以下输出,存储在“fileout4”`

 int main{}
{


 printf("hello");
     */
 printf("COOL!!");
 return (0);
}

`

上述程序中的注释行数为6。

答案 1 :(得分:0)

您可以维护一个 boolean 变量,该变量可以跟踪您要解析的行是否在多行注释中。

%{
#include <stdio.h>
#include <stdbool.h>
int comment_lines = 0;
bool in_comment = false;
%}

%%
"/*".*\n { in_comment = true; ++comment_lines; }
.*"*/"\n { in_comment = false; ++comment_lines; }
"//".*\n { ++comment_lines; }
.*\n { 
    if (in_comment) {
    ++comment_lines;
    } else {
    fprintf(yyout, yytext);  
    }
}

%%

int yywrap() {
    return 1;
}

int main(void) {
    printf("Enter input file: ");
    char filename[64];
    scanf("%s", filename);
    yyin = fopen(filename, "r");

    printf("Enter output file: ");
    scanf("%s", filename);
    yyout = fopen(filename, "w");

    yylex();
    printf("Number of comments: %d\n", comment_lines);
}

在上面的代码中,in_comment用于指示正​​在分析的行的状态。如果在注释中,则comment_lines的值将增加,否则文本将被写入由yyout给出的输出文件。

输入文件

#include <stdio.h>

/*
 *
 * This is a multi-line comment
 *
 */

void dummy();

// main function is the entry point.
int main(void) {
    /* 
     * Here we print a message on user's 
     * console.
     */
    printf("Hello world\n");
    // That is it.
}

词法分析后生成的

输出文件

#include <stdio.h>


void dummy();

int main(void) {
    printf("Hello world\n");
}

Number of comments: 11

答案 2 :(得分:0)

%{


#undef yywrap
#define yywrap() 1
int single=0, multiline =0;
%}


%%


"//".*"\n" {printf("%s\n", yytext); single++;}
"/*".*[\n]*.*"*/" {printf("%s\n", yytext); multiline++;}
.;

%%


int main()
{
 yyin = fopen("yourfile","r");
 yylex(); //calling the rules section
 printf(" Single line comments = %d, multiline comments = %d", single, multiline);
 fclose(yyin);
}