Ç - 删除注释(/ *和//)和字符串 [英] c - Removing comments (/* and //) and strings

查看:106
本文介绍了Ç - 删除注释(/ *和//)和字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谁能告诉我什么是错的想去除输入注释和字符串(但不是这就是为什么它可以识别评论评论)以下的code?这是有关我的前一个问题:<一href=\"http://stackoverflow.com/questions/16086617/removing-comments-with-a-sliding-window-without-nested-while-loops\">Removing用滑动窗口的意见没有嵌套while循环

 的#include&LT;&stdio.h中GT;诠释的main()
{
    INT C,C1 = 0,C2 = 0,状态= 0,接下来= 0;
    而(1)
    {
        开关(州)
        {
           情况下0:下一=((C2 =='*'和;&放大器; C1 =='/')?1:(C2 =='\\')2:(C2 =='/'和;&放大器; C1 =='/')3:(C2 =='\\'')4:?0);打破;
           情况1:下一=((C2 =='/'和;&放大器; C1 =='*')?0:1);打破;
           案例2:下一个=((C2 =='\\'和;&安培; C1 ='\\\\')0:!?2);打破;
           情况3:下=((C2 ==的'\\ n')?0:3);打破;
           案例4:下一个=((C2 =='\\''和;&安培; C1 ='\\\\')!0:?4);打破;
           默认值:下一个=状态;
        }
        C =的getchar();如果(C&小于0)打破;
        C1 = C2; C2 = C; //滑动窗口
        如果(状态== 1)
        {
            如果(C2 =='*')
            {
                C =的getchar();
                C1 = C2; C2 = C;
                如果(C2!='/')
                   的putchar(C1);
            }
            其他
                的putchar(C2);
        }
        否则,如果(状态== 2)
        {
            如果(C2 =''||(C2 =='\\'和;!&安培;!C1 ='\\\\'))
                的putchar(C2);
        }
        否则,如果(状态== 3)
        {
                的putchar(C2);
        }
        其他
        状态=下一个;
        // C2是当前输入字节,C1是previous输入字节
    }
    返回0;
}


解决方案

我不认为你真的需要一个滑动窗口为您删除的C任务和C ++注释。您可以扩展状态机包括一些补充规定,用于跟踪逃逸等......随着越来越多的国家在code变得有点大,但它的可能的使其在概念上简单,因为只有你拥有的有一个的状态进行跟踪。所以,你的code的精神转化为新的国家机器的公式我建议,你会得到下面的code(我也同意使用枚举巴西莱的建议,其中包括它)。

 的#include&LT;&stdio.h中GT;诠释的main()
{
    枚举{
        START,斜线,
        STRING,CHAR,STRING_ESCAPE,CHAR_ESCAPE,
        SINGLE_LINE_COMMENT,MULTI_LINE_COMMENT,MULTI_LINE_END,
    }状态=启动;
    INT℃;    而((C =的getchar())!= EOF){
        开关(州){
        案例START:
        state_START:
            如果(C =='/'){状态= SLASH;打破; }
            的putchar(C);
            如果(C =='\\')=态串;
            否则,如果(C =='\\'')=状态CHAR;
            打破;
        案例SLASH:
            如果(C =='/')=状态SINGLE_LINE_COMMENT;
            否则,如果(C =='*')=态MULTI_LINE_COMMENT;
            其他{状态=启动;转到state_START; }
            打破;
        案例STRING:
            的putchar(C);
            如果(C =='')状态=开始;
            否则,如果(C =='\\\\')=态STRING_ESCAPE;
            打破;
        案例CHAR:
            的putchar(C);
            如果(C =='\\'')状态=开始;
            否则,如果(C =='\\\\')=态CHAR_ESCAPE;
            打破;
        案例SINGLE_LINE_COMMENT:
            如果(C =='\\ n')=态START;
            打破;
        案例MULTI_LINE_COMMENT:
        state_MULTI_LINE_COMMENT:
            如果(C =='*')=态MULTI_LINE_END;
            打破;
        案例STRING_ESCAPE:
            的putchar(C);
            状态= STRING;
            打破;
        案例CHAR_ESCAPE:
            的putchar(C);
            状态= CHAR;
            打破;
        案例MULTI_LINE_END:
            如果(C =='/')状态=开始;
            其他{状态= MULTI_LINE_COMMENT;转到state_MULTI_LINE_COMMENT; }
            打破;
        }
    }
    返回0;
}

Can anyone tell me whats wrong with the following code that's suppose to remove comments and strings from an input (but not comments that's why it recognizes comments)? This is related to a prior question of mine: Removing comments with a sliding window without nested while loops

#include <stdio.h>

int main()
{
    int c, c1 = 0, c2 = 0 ,state = 0, next = 0;
    while(1)
    {
        switch(state)
        {
           case 0: next = ((c2 == '*' && c1 == '/') ? 1 : (c2 == '\"') ? 2 : (c2 == '/' && c1 == '/') ? 3 : (c2 == '\'') ? 4: 0); break; 
           case 1: next = ((c2 == '/' && c1 == '*') ? 0 : 1); break; 
           case 2: next = ((c2 == '\"' && c1 != '\\') ? 0 : 2); break;
           case 3: next = ((c2 == '\n') ? 0 : 3); break;
           case 4: next = ((c2 == '\'' && c1 != '\\') ? 0 : 4); break;
           default: next = state; 
        }
        c = getchar(); if( c < 0) break;
        c1 = c2; c2 = c; // slide window
        if(state == 1)
        {
            if(c2 == '*')
            {
                c = getchar();
                c1 = c2; c2 = c;
                if(c2 != '/')
                   putchar(c1);
            }
            else
                putchar(c2);
        }
        else if(state == 2)
        {
            if(c2 != '"' || (c2 == '\"' && c1 != '\\'))
                putchar(c2);
        }
        else if(state == 3)
        {
                putchar(c2);
        }
        else
        state = next;
        // c2 is the current input byte and c1 is the previous input byte
    }
    return 0;
}

解决方案

I don't think you actually need a sliding window for your task of removing C and C++ comments. You can expand your state machine to include a few additions states for tracking escapes, etc... With more states the code gets a bit bigger, but it might make it conceptually simpler since you only have one state to track. So converting the spirit of your code to the new state machine formula I'd suggest, you get the code below (and I also agree with Basile's suggestion of using enums and included it).

#include <stdio.h>

int main()
{
    enum {
        START, SLASH,
        STRING, CHAR, STRING_ESCAPE, CHAR_ESCAPE,
        SINGLE_LINE_COMMENT, MULTI_LINE_COMMENT, MULTI_LINE_END,
    } state = START;
    int c;

    while ((c = getchar()) != EOF) {
        switch (state) {
        case START:
        state_START:
            if (c == '/') { state = SLASH; break; }
            putchar(c);
            if (c == '\"') state = STRING;
            else if (c == '\'') state = CHAR;
            break;
        case SLASH:
            if (c == '/') state = SINGLE_LINE_COMMENT;
            else if (c == '*') state = MULTI_LINE_COMMENT;
            else { state = START; goto state_START; }
            break;
        case STRING:
            putchar(c);
            if (c == '"') state = START;
            else if (c == '\\') state = STRING_ESCAPE;
            break;
        case CHAR:
            putchar(c);
            if (c == '\'') state = START;
            else if (c == '\\') state = CHAR_ESCAPE;
            break;
        case SINGLE_LINE_COMMENT:
            if (c == '\n') state = START;
            break;
        case MULTI_LINE_COMMENT:
        state_MULTI_LINE_COMMENT:
            if (c == '*') state = MULTI_LINE_END;
            break;
        case STRING_ESCAPE:
            putchar(c);
            state = STRING;
            break;
        case CHAR_ESCAPE:
            putchar(c);
            state = CHAR;
            break;
        case MULTI_LINE_END:
            if (c == '/') state = START;
            else { state = MULTI_LINE_COMMENT; goto state_MULTI_LINE_COMMENT; }
            break;
        }
    }
    return 0;
}

这篇关于Ç - 删除注释(/ *和//)和字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆