JS解析测试代码片段

前一日与jindw聊天,谈到了正在研究的JS代码转换。譬如JSA所作的,其实就是一种代码转换。

PIES为了实现namespace(package)的管理,对JavaScript源代码也进行了处理。为了保证效率,所以想方设法只做了最最简单的预处理,也就是对代码段加头加尾,这样只是简单的字符串串接,对于效率是没有影响的。

但是最近在考虑是否有可能支持一些JS2(ES4)的特性,譬如支持let。这就必然需要将let转换为ES3所支持的某种结构(简单的说,在let语句开始的时候,把let的scope之外的同名变量先压栈,然后到了let的scope之外再恢复出来)。

总之这里就涉及到一种代码的transform或preprocessing。所以我在寻找某种轻型的代码解析方式。为此我先要写一些测试用例。

如果要进行JS代码的parse、transform、预处理、代码生成甚或compile等等,就需要考虑到JS的语法。以下是个很不完整的代码片段,parser、lint、preprocessor、transformer等等都需要能正确处理它,才具有实用价值。


function f(test) {

return (test/*
/* //
' "
{ ;
\*/ && // /* // " ' { ; \
test &&
" /* // \
\" ' \
{ ;" &&
' /* // \
" \' \
{ ;' &&
test);

}

这个代码包含了多行注释、单行注释、字符串、多行字符串(非ES3标准,但各种引擎都支持)、转义字符等等。

这个代码没有包含的,包括正则和e4x。正则literal(如/^r(eg)ex["'\/].*?$/ig)是个很麻烦的事情,比如考虑除法!所以暂时没有放入测试用例中。e4x也是一个麻烦事情,因为涉及了内插XML,暂时不予考虑。

BTW,代码syntax highlight其实也会用到类似的处置,显然JavaEye的syntax highlight还是存在小小的地方不能辨识的,呵呵。

下面是一个正则表达式,可以匹配最常见的造成解析困难的嵌套结构,包括注释和字符串,但是没有包括前面所说的正则和e4x的xml结构。
/[/][*]([\S\s]*?)(?:[*][/]|$)|[/][/](.*)|"((?:\\"|[^"])*)"|'((?:\\'|[^'])*)'/g;


注:如果你看到上面的代码里存在奇怪的东西,那是JavaEye的bbcode解析错误。

通过这个正则,我们可以过滤一般的JS代码(当然正则和e4x除外)。比如可以把注释都删除,把字符串里的特殊字符替换掉等等。我测试了上面那段人造的代码。然后我拿dojo 0.4.3的314KB的源代码做了测试,完成整个过滤在我的T60笔记本上大概需要0.5秒。

不过因为还没有处理正则,所以这个方法还不能用于实用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值