随笔-59  评论-36  文章-0  trackbacks-0

以下两则代码均是在向论坛上的高手们学习之后模仿出的结果,而自己之前写的那叫个臭呀!

代码1

 1/*
 2* 用状态机实现对代码中注释的清除.
 3*/

 4
 5#include <stdio.h>
 6#include <string.h>
 7
 8#define SCREEN
 9
10void initialize_fsm(char fsm[7][256]);
11
12int main()
13{
14    int ch , temp = 0 ;
15    int state = 0;
16    char fsm[7][256];
17
18    FILE *pfin ;
19    if ((pfin = fopen("sweep-comments.txt","r")) == NULL)
20    {
21        printf("can not open the file");
22        exit(0);
23    }

24
25    #ifdef SCREEN
26        #define OUT stdout
27    #else
28        FILE *pfout;
29        pfout = fopen("result.txt","w");
30        #define OUT pfout
31    #endif
32
33    initialize_fsm(fsm);
34
35    #pragma region FSM ///尝试#pragma region功能. Visual C++ 2005
36
37    while ((ch = fgetc(pfin)) != EOF)
38    {
39        state = fsm[state][ch];
40
41        if ( state != 2  && ch !='*' && temp == '/')
42            fputc(temp,OUT);
43
44        temp = ch;
45
46        switch(state)
47        {
48            /*0,5,6执行同一个动作*/
49            case 5:
50            case 6:
51            case 0:
52                    fputc(ch,OUT);
53                    break;
54            case 7:
55                    state = 0;
56                    break;
57        }

58
59        if(state != 1)
60            temp=0;
61    }

62    #pragma endregion
63}

64
65void initialize_fsm(char fsm[7][256])
66{
67    int lenth = sizeof(char)*256;
68
69    memset(fsm[0],0,lenth);
70    memset(fsm[1],0,lenth);
71    memset(fsm[2],2,lenth);
72    memset(fsm[3],3,lenth);
73    memset(fsm[4],3,lenth);
74    memset(fsm[5],5,lenth);
75    memset(fsm[6],5,lenth);
76
77    fsm[0]['"'= 5;
78    fsm[0]['/'= 1;
79    fsm[1]['/'= 2;
80    fsm[1]['*'= 3;
81    fsm[2]['\n'= 0;
82    fsm[3]['*'= 4;
83    fsm[4]['/'= 7;
84    fsm[5]['\\'= 6;
85    fsm[5]['"'= 0;
86}

87

代码2
 1%{
 2/*
 3*用lex实现清除代码注释
 4*/

 5void comment(int style);
 6void string_constant();
 7const int singalline =0, multiline =1;
 8
 9%}

10
11
12%%
13
14"/*"        {comment(multiline );}
15"//"        {comment(singalline);}
16"\""        {string_constant();}
17.|\n        {fprintf(yyout,"%c",*yytext);} 
18
19%%
20
21int main(int argc,char *argv[])
22{
23    FILE *pfin ,*pfout;
24    if ((pfin = fopen (argv[1],"r")) ==NULL)
25    {
26        printf("can not open the file\n");
27        exit (1);
28    }

29    pfout = fopen("output.txt","w");
30    
31    yyin = pfin;
32    yyout = pfout;
33    
34    yylex();
35
36    return 0;
37}

38
39void string_constant()
40{
41    int ch ;
42
43    fprintf(yyout,"%c",*yytext);
44
45    while ( (ch = input()) != EOF)
46    {
47        if (ch == '\\')
48        {
49            fprintf(yyout,"%c",ch);
50            ch = input();
51            fprintf(yyout,"%c",ch);
52            
53            continue;
54        }

55
56        if (ch == '\"')
57        {
58            fprintf(yyout,"%c",ch);
59            break;
60        }

61        
62        fprintf(yyout,"%c",ch);
63    }

64}

65
66void comment(int style)
67{
68    int ch , prev=0;
69    if (style == multiline)
70    {
71        while ( (ch = input()) != EOF )
72        {
73            if (prev == '*' && ch == '/')
74                return ;
75
76            prev = ch;
77        }

78        
79        return ;
80    }

81    else
82    {
83        while ( (ch = input()) != EOF )
84        {
85            if (ch == '\n')
86            {
87                fprintf(yyout,"%c",'\n');
88                return ;
89            }

90        }

91    }

92}

93int yywrap()
94{
95        return 1;
96}

97
posted on 2009-05-07 14:21 zhaoyg 阅读(540) 评论(0)  编辑 收藏 引用 所属分类: 小代码

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理