您的位置:首页 > Web前端 > JavaScript

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

2013-07-19 19:06 411 查看




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;
}
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: