分析牛人js版删除代码注释(状态机机制)
2013-07-19 19:06
483 查看
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; } } }
相关文章推荐
- 分析牛人js版删除代码注释(状态机机制)
- 怎样删除C/C++代码中的所有注释?浅谈状态机的编程思想
- 状态机编程思想(2):删除代码注释(目前支持C/C++和Java)
- 用js读、写、删除Cookie代码分享及详细注释说明
- node.js require 实现机制初窥;pomelo代码分析5----------- pomel-loader模块
- 状态机编程思想(2):删除代码注释(目前支持C/C++和Java)
- 1.13Android 学习+进度之十三-删除冗余代码+注释+分析设计方法
- JSP中混杂HTML、JS、CSS删除各种代码注释
- 用js读、写、删除Cookie代码分享及详细注释说明
- 怎样删除C/C++代码中的所有注释?浅谈状态机的编程思想
- js 删除前confirm确认提示代码
- js动态删除div元素基本思路及实现代码
- js实现图片向上连续滚动特效代码(含注释)
- SURF算法:OpenSURF部分代码,分析与注释
- Vue学习之源码分析--从template到DOM(Vue.js源码角度看内部运行机制)(九)
- “机器狗”病毒驱动部分逆向分析注释(C代码)
- bat脚本 删除文件夹中 JS和CSS文件中注释
- js动态添加删除,后台取数据(示例代码)
- 怎样删除C++代码中的注释——有限状态机思想的使用
- qq农场js外挂详细制作(提供源码、有注释、有抓包数据分析、不再更新、不回答提问)