- 浏览: 500258 次
- 性别:
- 来自: 初到北京
最新评论
-
javamonkey:
有点老了,有个Teb测试,这个性能测试很标准http://gi ...
几款模板引擎的性能对比 -
greenlaw110:
xuyao 写道sdh5724 写道xuyao 写道很好,nn ...
几款模板引擎的性能对比 -
sefier:
不知道你看的是哪个版本的,现在所看到的版本和你所描述的不一致, ...
Facebook XHP 调研 -
javatar:
我觉得从通用语言去思考可能更有意思,满足八封其实就是一个完备集 ...
五行通天地 八卦定乾坤--打算按照先天八卦的形制重构Lite模版引擎的指令集 -
luo2pei4321:
MVEL的官方例子里面好像只支持Integer和String两 ...
表达式引擎JSEL介绍
为了支持JSI包定义中的模式匹配(方便某些懒人)。我需要一个查找脚本全局变量的脚本。
一直没有勇气编写JS的完整语法解析程序,所以,只能走一些旁门左道。
在自己机器上测试了 213个脚本文件。与Rhino的解析结果对比。测试通过。
应该比较可靠了。
这个脚本好早就写过了,一直没有满意的结果,现在算比较满意了。
一直没有勇气编写JS的完整语法解析程序,所以,只能走一些旁门左道。
/* * JavaScript Integration Framework * License LGPL(您可以在任何地方免费使用,但请不要吝啬您对框架本身的改进) * http://www.xidea.org/project/jsi/ * @author jindw * @version $Id: fn.js,v 1.5 2008/02/24 08:58:15 jindw Exp $ */ /** * * @param <String> source 脚本源文件 * @return <Array> 改脚本中的定层申明变量(包括函数) */ function findGlobals(source){ source = replaceSpecialEntry(source.replace(/^\s*#.*/,'')); //简单的实现,还以为考虑的问题很多很多: var varFlagMap = {}; var scopePattern = /\b(function\b[^\(]*)[^{]+\{|\{|\}|\[|\]/mg;//|{\s*(?:[\$\w\d]+\s*\:\s*(?:for|while|do)\b|""\:) //找到办法不用判断了,省心了。。。。 //var objectPattern = /\{\s*(?:[\$\w\d]+|"")\:/mg var varPattern = /\b(var|function|,)\b\s*([\w\$]+)\s*/mg; //var lineParrern = /([\$\w]+|[^\$\w])\s*[\r\n]+\s*([\$\w]+|[^\$\w])/g var buf = []; var fnDepth = 0; var arrayDepth = 0; var begin = 0; var match; while(match = scopePattern.exec(source)){ switch(match[0] ){ //array case '[': if(!fnDepth){ if(!arrayDepth){ buf.push(source.substring(begin,match.index),'[]'); } arrayDepth ++; } break; case ']': if(!fnDepth){ arrayDepth --; if(!arrayDepth){ begin = match.index+1; } } break; //function case '{': if(!arrayDepth && fnDepth){//in function fnDepth++; } break; case '}': if(!arrayDepth && fnDepth){//in function fnDepth--; if(fnDepth == 0){ begin = match.index+1; } } break; default://function.. if(!arrayDepth){ if(!fnDepth){ buf.push(source.substring(begin,match.index),match[1],'}'); } fnDepth++; } break; } } buf.push(source.substr(begin)) source=buf.join(''); source = source.replace(/([\w\$\]])\s*\([\w\$\d,]*\)/m,'$1()'); begin = 0; while(match = varPattern.exec(source)){ switch(match[1]){ case 'var': begin = match.index; case 'function': varFlagMap[match[2]] = 1; default://, var next = source.charAt(match.index + match[0].length); if(next!=':'){ var temp = source.indexOf(';',begin); if(temp>0 && temp<match.index){ continue; } try{ //不知道是不是还有什么问题 temp = source.substring(begin,match.index); //if(/var|if|else/.test(temp)){continue;} temp = temp.replace(/[\r\n]/g,' '); new Function(temp+',a;') }catch(e){ continue; } varFlagMap[match[2]] = 1; } } } var result = []; for(match in varFlagMap){ result.push(match) } return result; } /** * java 接口 * @param <String>source 脚本源码 * @return java.util.Collection 返回全局id集合 */ function findGlobalsAsList(source){ var result = findGlobals(source) var list = new java.util.ArrayList(); for (var i = 0; i < result.length; i++) { list.add(result[i]); } return list; } var specialRegExp = new RegExp([ //muti-comment '/\\*(?:[^\\*]|\\*[^/])*\\*/', //single-comment '//.*$', //string '"(?:\\\\(?:.|\\r|\\n|\\r\\n)|[^"\\n\\r])*"', "'(?:\\\\(?:.|\\r|\\n|\\r\\n)|[^'\\n\\r])*'", '/.*/' ].join('|'),'m'); function replaceSpecialEntry(source){ var head = ''; var tail = source; var p1 outer: while(p1 = specialRegExp.exec(tail)){ var p2 = p1.index + p1[0].length; var p1 = p1.index; if(tail.charAt(p1) == '/'){ switch(tail.charAt(p1 + 1)){ case '/': case '*': head += tail.substr(0,p1); tail = tail.substr(p2+1); continue outer; } try{//试探正则 new Function(head+tail.replace(specialRegExp,"/\\$&")); //是正则 p2 = p1; while((p2 = tail.indexOf('/',p2)+1)>p1){ //println([p1,p2]);//,tail.substring(p1,p2) try{ var text = tail.substring(p1,p2); if(/.*/.test(text)){//有效正则 new Function(text); } head += tail.substr(0,p1)+"/./"; tail = tail.substr(p2); continue outer; }catch(e){ //无效,继续探测 } } throw new Error("怎么可能??^_^"); }catch(e){ //只是一个除号:( head += tail.substr(0,p1+1); tail = tail.substr(p1+1); continue outer; } }else{ head += tail.substr(0,p1)+'""'; tail = tail.substr(p2+1); continue outer; } } return head + tail; }
在自己机器上测试了 213个脚本文件。与Rhino的解析结果对比。测试通过。
应该比较可靠了。
这个脚本好早就写过了,一直没有满意的结果,现在算比较满意了。
发表评论
-
JSA 发布一个新的预览版本
2009-07-27 01:15 1424主要功能是: 1。带上了原来的经典UI界面。 增加了一 ... -
CGI还是个不错的玩意
2009-06-20 18:52 964JSI的调试辅助程序目前提供有JavaServlet版本和ph ... -
用两句话来解释JSI是怎么隔离JavaScript变量冲突的
2009-06-01 17:08 1230“我还是一直没有明白jsi是怎么隔离名字空间的” 好,大家的 ... -
端午在家搞了一个基于JSI的脚本发布系统
2009-05-31 13:06 1307项目上线之前,脚本都要手动重新组合压缩。挺麻烦的,JSICDN ... -
把JSA部署在GoogleAppEngine上,迎接我的是一张笑脸^_^
2009-05-03 02:47 953第一个无意的测试,结果打印出了一张笑脸^_^ 只是随便输的.真 ... -
关于JSI装饰引擎改进的一些想法
2009-02-16 18:29 874今天看到bellstar大侠发布的SUI,也看了一些设计及实现 ... -
水月镜花
2009-02-07 21:11 963刚才cctv4在播放着《激情燃烧的岁月》。一些情节开始看着很有 ... -
韬光养晦 厚积薄发
2008-10-22 21:34 2001最近被反复问道,JSI还在继续吗? 开始感觉很诧异,后来想想也 ... -
JSI 类库文件格式探讨
2008-08-05 20:08 2557在JSI中打包脚本类库。 目前只有jar方式,同时支持java ... -
使用中间数据格式优化前端模板性能的想法
2008-06-12 21:24 1766前端时间这里出现了不少讨论前端模板的帖子。 我还是原来的观点 ... -
JSA压缩Prototype1.6时,经常表现的一个错误
2008-05-07 21:15 2381开始发帖错误,我的测试不够严谨。 经过测试,IE也没有踩 ... -
发布一个JSI Example Project
2008-04-30 14:58 3951部署到Tomcat中,打开script目录,可以显示你当前sc ... -
JSI Side 代码风格与规范
2008-04-29 22:07 5993准备编写JSI的外围元素 ... -
给大家展示一下JSI文档工具和导出工具
2008-02-21 11:43 3615演示地址(目前只支持Firefox): http://www. ... -
JSI的延迟装载和异步装载过程的一些原理解释
2008-02-14 17:13 6366出自该贴的回复: http://www.iteye.com/t ... -
JSIDoc设计的两个失败点
2008-02-08 00:11 3595JSIDoc是我一年前开发的用来解析JS文档的纯客户端脚本程序 ... -
JSI的导入指令参数顺序调整意见征询
2008-02-07 17:20 7781改动 2.0方式: $import(path,callbac ... -
JSI2.1计划
2008-01-01 21:13 7063先回顾历史: JSI1(2006-2007)是个简单的框架,只 ... -
JSA 压缩JS时的常见问题
2007-12-30 16:08 41581。保留字滥用 如果你的脚本中存在某些保留字或者关键字属性甚至 ... -
脚本合并时混淆隔离的三个级别
2007-12-23 13:38 3487直接合并--传统方式 根据脚本依赖关系,组织好导入顺序,简单的 ...
相关推荐
MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的...
MFCHtml 调用脚本 如题。 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信...
MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的...
MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的...
MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的...
MFCHtml 调用脚本 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的...
虚拟控制台最有用的是,当一个程序出错造成系统死锁时,可以切换到其它虚拟控制台工作,关闭这个程序。 shutdown 1.作用 shutdown命令的作用是关闭计算机,它的使用权限是超级用户。 2.格式 shutdown [-h][-i...
), interpreted (然后 PL/SQL 模块将被编译为 PL/SQL 字节代码格式), debug (PL/SQL 模块将用探测调试符号来编译), non_debug。 默认值: " interpreted, non_debug " plsql_native_linker: 说明: 此参数指定链接...
实验三 移植U-Boot-1.3.1 实验 【实验目的】 了解 U-Boot-1.3.1 的代码结构,掌握其移植方法。 【实验环境】 1、Ubuntu 7.0.4发行版 2、u-boot-1.3.1 3、FS2410平台 4、交叉编译器 arm-softfloat-linux-gnu-...
浏览QuickTest Professional 程序文件夹..............................................24 第=ff=部分:=使用测试对象 第=P=章:=了解测试对象模型.................................................................
17.6. 对远程接口不提供自动探测 17.7. 在选择这些技术时的一些考虑 18. Enterprise Java Bean(EJB)集成 18.1. 简介 18.2. 访问EJB 18.2.1. 概念 18.2.2. 访问本地的无状态Session Bean(SLSB) 18.2.3. 访问...
17.6. 对远程接口不提供自动探测 17.7. 在选择这些技术时的一些考虑 18. Enterprise Java Bean(EJB)集成 18.1. 简介 18.2. 访问EJB 18.2.1. 概念 18.2.2. 访问本地的无状态Session Bean(SLSB) 18.2.3. 访问...
7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理(autoproxy)”功能 7.9.1. 自动代理bean定义 7.9.1.1. ...