前一日与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秒。
不过因为还没有处理正则,所以这个方法还不能用于实用。
分享到:
相关推荐
源代码解析器 使您可以在自己喜欢的浏览器浏览器的舒适范围内测试HTML / CSS和Javascript源代码的片段。
代码片段 图片预处理 mvvm 实现 dom 操作封装 剪切板操纵 mocha 在浏览器中测试 es6 代码 监听用户离开页面 监听页面是否可见 gulp 配置 kafka clickhouse elasticsearch mysql linux nginx rsyslog 隐藏浏览器滚动...
template.js 一款 JavaScript 模板引擎,简单,好用。提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同的效果。https://github.com/aui/artTemplate 1、特性 ...
” ## 解决方案我们将创建一个全新的领域特定语言(DSL) 来表示 JS 代码片段的结构,而不是构建用于测试的 JavaScript API 。 我们的挑战框架将解析学生的代码(使用Esprima )并将其转换为结构表达式(或structexp...
to-gfm-代码块 生成一个 github-flavored-markdown 围栏代码块片段。 使用安装npm i to-gfm-code-block --save用法 var mdpre = require ( 'to-gfm-code-block' ) ;mdpre ( 'var foo = bar;' , 'js' ) ; 结果是: ``...
Yazur(代号凯文) 具有多芯片支持的 YOLOL 解释器,用于测试您计划的 Starbase 想法:D 在 Pasukaru 的 Yolol 教程网站上查看此解释器的运行情况,该解释器首次出现第可以通过 require 作为节点模块来运行服务器端...
《Rails之道》详细讨论了Rails的程序代码并通过分析Rails中的代码片段来深入解释它的功能,同时,《Rails之道》部分章节也摘录了一些API文档中的内容,使读者能够快速地找到对应的API文档、相关的示例代码以及深入的...
3.6.2 使用示例HTML片段进行测试 3.6.3 扩充ADS库 3.6.4 generateDOM对象的框架 3.7 小结 第4章 响应用户操作和事件 4.1 DOM2级事件 4.2 事件的类型 4.2.1 对象事件 ...
一个非常小的,快速的,无依赖的URL解析器和格式化程序,用于Node.js和Web 快速地 几行代码 100%的测试覆盖率 为什么这么小又快? 它使用一个大型正则表达式一步一步提取所有url片段 用法 npm install -- save ...
3.6.2 使用示例HTML片段进行测试 3.6.3 扩充ADS库 3.6.4 generateDOM对象的框架 3.7 小结 第4章 响应用户操作和事件 4.1 DOM2级事件 4.2 事件的类型 4.2.1 对象事件 ...
3.6.2 使用示例HTML片段进行测试 3.6.3 扩充ADS库 3.6.4 generateDOM对象的框架 3.7 小结 第4章 响应用户操作和事件 4.1 DOM2级事件 4.2 事件的类型 4.2.1 对象事件 ...
Micropython片段有用的micropython东西的代码片段,可以随意使用HTTP服务器-httpserver.py 一个基于官方micropython文档的简单http服务器,实现为类/对象而不是函数。 在设备根目录中提供单个index.html页面,但包括...
有关我的演示中使用的代码/配置片段,请参见此仓库: : 这是什么? 与 “法规遵从性”工具的Prometheus集成。 它有什么作用? 将InSpec json报告转换为Prometheus指标,因此您可以使用Prometheus监视合规性检查...
CWS通过直观的用户界面,可审核的日志记录,具有代码片段和适应层的可扩展性以及许多其他有用的工具(例如功能强大的外部任务引擎,自定义流程启动器等)来扩展Camunda的功能。 虽然此存储库大部分都是完整的,但...
使用标记片段 6.6。将标题内容添加到最终页面 6.7。在我们的页面/面板中使用存根标记 6.8。如何仅渲染组件主体 6.9。用wicket隐藏装饰元素:enclosure标签 6.10。使用Border包围现有标记 6.11。摘要 7.组件生命周期 ...
Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...
这是一段测试文本 </body> 3、标记的属性 1、什么是属性 用来修饰标记的效果的内容,就是属性 2、语法 1、属性必须声明在开始标记中 2、属性与标记名称之间,用 空格 隔开 3、属性的值 与 属性...