即使未执行内容的写操作被写入文件

时间:2014-03-15 20:05:49

标签: c lex

我是lex的新手.Below是一个简单的lex程序,它计算给定输入C文件中的printf和scanf语句的数量,并用readf和writef替换它们,写入单独的文件。

    %{
       #include<stdio.h>
       #include<stdlib.h>
       int pc=0 ,sc=0;
    %}
    %%
    "printf"             {fprintf(yyout,"writef");pc++;}
    "scanf"             {fprintf(yyout,"readf");sc++;}
    .              {fprintf(yyout,"%c",yytext[0]);}
    %%
    main()
    {
       yyin=fopen("file5","r");
       yyout=fopen("fileout5","w");
       yylex();
       printf("no.of printf statements=%d \n no.of scanf statements=%d \n",pc,sc);
       fclose(yyin);
       fclose(yyout);
   }

file5:

        #include<stdio.h>
        int main()
        {
          int a=1,b=1;
          printf("%d",a);
          scanf("%d",&a);
          //this is a comment
          fprintf(stdout,"type it to console");
          printf("hlh");
          return (0);
        }

fileout5:

        #include<stdio.h>
        int main()
        {int a=1,b=1;
         writef("%d",a);
         readf("%d",&a);
         //this is a comment
         fwritef(stdout,"type it to console");
         writef("hlh");
         return (0);
        }        

我的问题是,当我删除第三个规则时,输出产生的是相同的。我想知道文件的剩余内容来自何处?据我说,当我删除第三个规则时,只有readf和writef应该存在在fileout5中。

1 个答案:

答案 0 :(得分:0)

默认的lex行为是将输入复制到输出,这正是你的第三个语句所做的。如果你想吃输入,你就匹配&#34;。&#34;并且没有操作规则{}。