分析牛人js版删除代码注释(状态机机制)

function on_format(id) {
    var textarea = document.getElementById(id);
    var text = textarea.value;
    var obj = format_obj();
    obj.init();
    obj.g_trigraph_on = document.getElementById('format_trigraph').checked;
    len = text.length;
    for (var c = 0; c < len; ++c) {
        obj.deal(text.substring(c, c+1));
    }
    obj.deal('EOF');
    textarea.value = obj.g_output_string;
}
function format_obj() {
    return {
        s_normal:           0,
        s_char:             1,
        s_char_conv:        2,
        s_string:           3,
        s_string_conv:      4,
        s_linecomment:      5,
        s_linecomment_conv: 6,
        s_comment1:         7,
        s_comment:          8,
        s_commented1:       9,
        s_conv:             10,
        s_eof:              11,


        g_state:            0,
        g_conv_state:       0,
        g_convlinecnt:      0,
        g_trigraph:         0,
        g_output_string:    "",

        g_trigraph_on:      1,

        put:
            function(c) {
                this.g_output_string += c;
            },
        init:
            function() {
                this.g_state = this.s_normal;
                this.g_conv_state = this.s_normal;
                this.g_trigraph = 0;
                this.g_output_string = ""
            },

        deal:
            function(c) {
                if (this.g_trigraph_on) {
                    if (c == '?') { // trigraph pre process
                        if (this.g_trigraph < 2) {
                            this.g_trigraph++;
                            return 0;
                        }
                    } else if (this.g_trigraph == 2 && c == '/') {
                        c = '\\';
                        this.g_trigraph = 0;
                    } else if (this.g_trigraph > 0) {
                        var t = this.g_trigraph;
                        this.g_trigraph = 2;
                        while (t--) this.deal('?');
                        this.g_trigraph = 0;
                    }
                }
                if (this.g_conv_state == this.s_conv) { // '\' at end of line
                    this.g_conv_state = this.s_normal;
                    if (c == '\n') {
                        ++this.g_convlinecnt;
                        return 0;
                    } else {
                        if (this.g_state == this.s_comment1) {
                            this.put('/');
                            while (this.g_convlinecnt) --this.g_convlinecnt, this.put("\\\n");
                            this.put('\\');
                            this.g_state = this.s_normal;
                        } else if (this.g_state == this.s_commented1) {
                            this.g_state = this.s_comment;
                        }
                    }
                } else if (c == '\\') {
                    if (this.g_state == this.s_comment1 || this.g_state == this.s_commented1) {
                        this.g_conv_state = this.s_conv;
                        return 0;
                    }
                }
                switch(this.g_state) {
                    case this.s_normal:
                        if (c == '\"') this.g_state = this.s_string, this.put(c);
                        else if (c == '\'') this.g_state = this.s_char, this.put(c);
                        else if (c == '/') this.g_state = this.s_comment1, this.g_convlinecnt = 0;
                        else if (c == 'EOF') this.g_state = this.s_eof;
                        else this.put(c);
                        break;
                    case this.s_char:
                        this.put(c);
                        if (c == '\'') this.g_state = this.s_normal;
                        else if (c == '\\') this.g_state = this.s_char_conv;
                        else if (c == 'EOF') this.g_state = this.s_eof;
                        break;
                    case this.s_char_conv:
                        this.put(c);
                        this.g_state = this.s_char;
                        break;
                    case this.s_string:
                        this.put(c);
                        if (c == '\"') this.g_state = this.s_normal;
                        else if (c == '\\') this.g_state = this.s_string_conv;
                        else if (c == 'EOF') this.g_state = this.s_eof;
                        break;
                    case this.s_string_conv:
                        this.put(c);
                        this.g_state = this.s_string;
                        break;
                    case this.s_linecomment:
                        if (c == '\\') this.g_state = this.s_linecomment_conv;
                        else if (c == '\n') this.g_state = this.s_normal, this.put(c);
                        else if (c == 'EOF') this.g_state = this.s_eof;
                        break;
                    case this.s_linecomment_conv:
                        if (c == '\\') ;
                        else if (c == 'EOF') this.g_state = this.s_eof;
                        else this.g_state = this.s_linecomment;
                        break;
                    case this.s_comment1:
                        if (c == '/') this.g_state = this.s_linecomment;
                        else if (c == '*') this.g_state = this.s_comment;
                        else if (c == 'EOF') this.g_state = this.s_eof;
                        else {
                            this.put('/');
                            while (this.g_convlinecnt) --this.g_convlinecnt, this.put("\\\n");
                            this.g_state = this.s_normal;
                            this.deal(c);
                        }
                        break;
                    case this.s_comment:
                        if (c == '*') this.g_state = this.s_commented1;
                        else if (c == 'EOF') this.g_state = this.s_eof;
                        break;
                    case this.s_commented1:
                        if (c == '/') this.g_state = this.s_normal, this.put(' ');
                        else if (c == 'EOF') this.g_state = this.s_eof;
                        else this.g_state = this.s_comment;
                        break;
                    case this.s_eof:
                        return -1;
                    default:
                        return -2;
                }
                return 0;
            }
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值