JavaScript代码如下:
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
d=new Date();
var e=new Array();
var f=false;
this.g=123;
this.g++;
document.write(b.xyz+this.cc);
</script>
以上仅使用了变量b(b={xyz:"123"};)
和cc(this.cc='bbb';)
。
有人知道是否有办法用Python或Lisp删除未使用的变量吗?
尝试closure compiler
从javascript
代码中删除冗余代码和无用空白:我在closure compiler
上运行了你的代码(158 bytes
),得到了这个(89 bytes
):
a={name:"abc"};b={b:"123"};this.a="bbb";d=new Date;document.write(b.b+this.a);
http://closure-compiler.appspot.com
在Common Lisp中,有解析js来解析JavaScript代码。如果您想以交互方式评估JavaScript代码并执行某种动态分析,还可以在此基础上构建CL JavaScript解释器。至于静态分析,还有cl-uglify-js,它也是建立在parse-js之上的——要么它可以消除死代码,要么你可以尝试修改它来做到这一点。。。
TXR:中快速且肮脏的基于文本的破解
script.txr:
@(collect)
@prolog
@(last)
<script>
@(end)
@(collect :vars (code))
@ (block occurs)
@ (cases)
@{decl /(var )?/}@{var /[a-z]+/}=@expr
@ (trailer)
@ (skip)
@ (cases)
@ (skip)@var@(skip)
@ (bind code `@decl@var=@expr`)
@ (or)
</script>
@ (fail occurs)
@ (end)
@ (or)
@code
@ (end)
@ (end)
@(last)
</script>
@(end)
@(collect)
@epilog
@(end)
@(output)
@{prolog "n"}
<script>
@{code "n"}
</script>
@{epilog "n"}
@(end)
测试用例script.html
:
verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
d=new Date();
var e=new Array();
var f=false;
this.g=123;
this.g++;
</script>
left
alone
运行:
$ txr script.txr script.html
verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
var e=new Array();
this.g=123;
this.g++;
</script>
left
alone
正如你所看到的,实现了一些冷凝。
然而,代码认为aaa
构成了对变量a
的使用。由于e
出现在var f=false
中,所以变量e
被保留;但你再也看不到了,因为那一行本身被删除了,因为f
没有出现。
如果你想要的不仅仅是愚蠢的基于文本的破解,你必须解析Javascript。(在TXR中也可以以一种清晰而有纪律的基于语法的方式,但对所有语法规则进行编码是乏味的。)