⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 javascript2.js

📁 javascript的解释器
💻 JS
字号:
(function(){
var Class = _JSVM_Namespace.kernel.Class;
var Object = _JSVM_Namespace.kernel.Object;
Class.prototype.$implements = function()
{
	//debugger;
	for(var i = 0; i < arguments.length; i++)
	{
		var type = arguments[i];
		try
		{
			if (typeof(type) == "string")
			{
				type = _JSVM_Namespace.kernel.Class.forName(type);
			}
			for (var each in type)
			{
				var obj = type[each];
				if(typeof(obj) == "function")
					this.prototype[each] = obj;
			}
			this.$interfaces = this.$interfaces || [];
			this.$interfaces.push(type);

			return this.prototype;
		}
		catch(ex)
		{
			throw new Exception(0x0018, "Class.$implements(type...) fail.", ex);
		}
	}
}
Object.prototype.$convert = function(asType)
{
	try{
		var ret = null;

		if(typeof(this.convert) == "function")
		{
			ret = this.convert(asType);
		}
		if(ret != null) return ret;

		ret = new asType();

		var obj = Class.forName("js.lang.Cloneable").cloneObject(this);

		for(var each in ret)
		{
			if(!/^((prototype$)|(window$)|(\_*\$))/.test(each) && typeof(ret[each]) != "function")
			{
				ret[each] = obj[each];
			}
		}

		return ret;
	}
	catch(ex)
	{
		return null;
	}
}
Object.$typeof = function(obj, shortName)
{
	if(obj.getClass)
	{
		if(shortName)
		{
			var ret = obj.getClass().getName().split(/\./g);
			return ret[ret.length - 1];
		}
		else 
			return obj.getClass().getName();
	}
	else 
		return typeof(obj);
}
})();
var _jsvmCoreFunc_extends_javascript2 = function ()
{
 var jsre = _JSVM_Namespace.runtimeEnvironment;
 var Exception = _JSVM_Namespace.kernel.Exception;

 /* set javascript2 paresr */
 jsre.JSVM.getCompiler().setParser("javascript2", new function()
  {
   // define RegExp variable
   var regExp_import = /(^|\s|;|})(\s*)(import)(\s+)((\w+\.)*(\w+))(\s*)/g;
   var regExp_class = /(^|\s|;|}\s*)(public\s+|internal\s+|private\s+)?class\s+(\w+)(\s+extends\s+[\w.]+)?(\s+implements\s+([\w.]+)(\s*,\s*[\w.]+)*)?(\s*)/;
   var regExp_super = /([^A-Za-z0-9_\$]+)super([^A-Za-z0-9_\$]+)/g;
   
   //property Attributes
   var regExp_property = /(public|private)(\s+)(static)?\s*(\n\r\s*)*var([^;]*;)/;

   //function Attributes
   var regExp_function = /(public|private)(\s+)(static)?(\s*)(\n\r\s*)*(function)(\s+)(\w+)(\s*)/;

   var regExp_const = /(const)(\s+)(\w+)(\s*)(=)(\s*)(\n\r\s*)*(\w+);/;

   var regExps_comments = [/(\s|^)+\/\/([^\n\r])*/g, /(\/\*)\/?(([^\*]\/)|[^\/])*(\*\/)/g];
   var regExps_strings = [/("(\\"|[^"\n\r]|(\\\r\n))*")/g, /('(\\'|[^'\n\r]|(\\\r\n))*')/g];

   var strings_tmpPrefix = "${COMPILE_CONST_" + new Date().getTime();
   var strings_tmpSuffix = "}";
   
   var regExp_package = /(^|\s|;|})(\s*)(package)(\s+)((\w+)(\.\w+)*)(\s*)/;

   var regExp_asExpr = /((\w+\.)*(\w+))(\s+)as(\s+)((\w+\.)*(\w+))/g;

   var regExp_ass = /(get|set)(\s+)(\w+)/g;

   var regExp_overload = /(public|private)?(\s+)(static)?(\s*)(\n\r\s*)*(function)(\s+)(\w+)\(\s*(([\w*]\:[\w.]+)\s*(\,\s*([\w*]\:[\w.]+))*)\s*\)/;

   this.parse = function(code)
   {
    // store string constant
    var constStrs = [];
    var tmpStrs = code.match(regExps_strings[0]);
    if (tmpStrs != null)
    {
     constStrs = constStrs.concat(tmpStrs);
    }
    var tmpStrs = code.match(regExps_strings[1]);
    if (tmpStrs != null)
    {
     constStrs = constStrs.concat(tmpStrs);
    }

    // remove comments
    code = code.replace(regExps_comments[0], "");
    code = code.replace(regExps_comments[1], "");

    for (var i = 0; i < constStrs.length; i++)
    {
     code = code.replace(constStrs[i],
      (strings_tmpPrefix + i + strings_tmpSuffix));
    }
    // proc package
    code = code.replace(regExp_package, "$1_$package(\"$5\");");
    var packageName = RegExp.$5;
    // proc import

    code = code.replace(regExp_import, "$1var $7 = _$import(\"$5\")");
    // proc super
    code = code.replace(regExp_super, "$1$class.$super$2");

	//getter and setter
	code = code.replace(regExp_ass, "function $1$3");

    while (regExp_class.test(code))
    {
     var shortClassName = RegExp.$3;
     var superName = RegExp.$4;
	 var implementList = RegExp.$5;
     var className = packageName + "." + shortClassName;
     var classVisibility = RegExp.$2.replace(/\s+/g,"");
	 var superName = superName.replace(/\s+extends\s+/,"");
	 var implementList = implementList.replace(/\s+implements\s+/,"");
     
	 var subCode = code.split(/[^$]class/g);

     var str = "\r\nvar $class = ";
	 if(classVisibility == "public")
		str += className + " = ";

	 str += "function(){return " + "$" 
      + shortClassName + ".apply(this,arguments);};\r\n"
      + "var " + shortClassName + " = $class;\r\n";
     if (superName == "")
     {
      str += "$class.$extends(_JSVM_Namespace.kernel.Object);";
     }
     else
     {
      str += "$class.$extends(" + superName + ");";
     }
	 str += "$class.$implements(" + implementList + ");";
	 //static fields
	 str += "var _$privateHandlerMap = {};";
	 str += "var _$getCurrentPrivateHandler = function (){var hash =  this.hashCode();return (hash in _$privateHandlerMap) ? _$privateHandlerMap[hash] : (_$privateHandlerMap[hash] = {});};";

	//debugger;
	 var overloaded = {};
	 while (regExp_overload.test(subCode[1]))
	 {
		 var pre = RegExp.$1 + " " + RegExp.$3 + " " + RegExp.$6 + " " + RegExp.$8;
		 var name = RegExp.$8;
		 var scode = "";
		 var args = RegExp.$9.split(/(\s*,\s*)/g);
		 var idx = [];
		 var arg = [];
		 
		 for(var i = 0; i < args.length; i++)
		 {
			var pair = args[i].split(/\:/g);
			idx.push(pair[1]);
			if(pair[0] != "") arg.push(pair[0]);
		 }

		 if(!overloaded[name])
		 {
			 overloaded[name] = true;
		     scode += pre + "(){var argstr = ''; var largstr = ''; for (var i = 0; i < arguments.length; i++){ argstr+=_JSVM_Namespace.kernel.Object.$typeof(arguments[i],true).replace(/\\./g,'');largstr+=_JSVM_Namespace.kernel.Object.$typeof(arguments[i]).replace(/\\./g,'');}return "+name+ "[argstr.toLowerCase()]?"+name+"[argstr.toLowerCase()].apply(this, arguments):"+name+"[largstr.toLowerCase()].apply(this, arguments);};var "+name+"={};";
		 }

		 idx = idx.join("").toLowerCase();
		 subCode[1] = subCode[1].replace(regExp_overload, scode + name + "." + idx + "=function("+arg.join(",")+")");
	 }

	 //members
	 var defin = "";
	 while (regExp_property.test(subCode[1]))
	 {
		var visibility = RegExp.$1;
		//if(visibility == "") visibility = "private";
		var ctype = RegExp.$3;
		var property = RegExp.$5;
		var propertyName = property.split(/=/)[0].replace(/(^[\s\n\t\r]*)|([\s\n\r\t]*$)/g, "");

		if(ctype != "static")
		{
			if(visibility == "public"){
				defin += "this." + property;
			}
			else{
				defin += "_$getCurrentPrivateHandler.call(this)." + property;
				var regProp = new RegExp("this\\.(\\s*)((\\r\\n)(\\s*))*"+propertyName+"(?!\\w+)","g");
				subCode[1] = subCode[1].replace(regProp,"_$getCurrentPrivateHandler.call(this)." + propertyName);
			}
			subCode[1] = subCode[1].replace(regExp_property, "");
		}
		else if(ctype == "static")
		{
			if(visibility == "public"){
				subCode[1] = subCode[1].replace(regExp_property, shortClassName + "." + property);
			}
			else 
			{
				var regProp = new RegExp(shortClassName+"\\.(\\s*)((\\r\\n)(\\s*))*"+propertyName+"(?!\\w+)","g");
				subCode[1] = subCode[1].replace(regProp, "_$" + visibility + shortClassName + "." + propertyName);
				var regDes = "_$" + visibility + shortClassName + "." + property;
				regDes = "var _$" + visibility + shortClassName + "={};" + regDes;
				subCode[1] = subCode[1].replace(regExp_property,regDes);
			}
		}
	 }
	 
	 while (regExp_function.test(subCode[1]))
	 {
		var visibility = RegExp.$1;
		//if(visibility == "") visibility = "private";
		var ctype = RegExp.$3;
		var name = RegExp.$8.replace(/(^[\s\n\t\r]*)|([\s\n\r\t]*$)/g, "");

		if(ctype != "static")
		{
			if(visibility == "public"){
				subCode[1] = subCode[1].replace(regExp_function, shortClassName + ".prototype." + name + "=function");
			}
			else
			{
				var funName = "_$" + visibility + shortClassName + "_" + name;

				subCode[1] = subCode[1].replace(regExp_function, "var " + funName + "=function");
				var regProp = new RegExp("this\\.(\\s*)((\\r\\n)(\\s*))*" + name + "(?!\\w+)","g");
				subCode[1] = subCode[1].replace(regProp, "(function(obj){return function(){return "+ funName + ".apply(obj,arguments);};})(this)");
			}
		}
		else if(ctype == "static")
		{
			if(visibility == "public"){
				subCode[1] = subCode[1].replace(regExp_function, shortClassName + "." + name + "=function");
			}
			else
			{
				var funName = "_$" + visibility + shortClassName + "_static"+ name;
				subCode[1] = subCode[1].replace(regExp_function, "var " + funName + "=function");
				var regProp = new RegExp(shortClassName+"\\.(\\s*)((\\r\\n)(\\s*))*"+name+"(?!\\w+)","g");
				subCode[1] = subCode[1].replace(regProp, "(function(obj){return function(){return "+ funName + ".apply(obj,arguments);};})("+shortClassName+")");
			}
		}
	 }
	 while (regExp_const.test(subCode[1]))
	 {
		 var name = RegExp.$3;
		 var value = RegExp.$8;
		 var regExp = new RegExp(shortClassName + "." + name + "(?!\\w+)", "g");
		 subCode[1] = subCode[1].replace(regExp, value);
		 subCode[1] = subCode[1].replace(regExp_const, "");
	 }
	 //constructors
	 var regExp_con = new RegExp("function "+shortClassName + "\\((.*)\\)(\\s*)((\\r\\n)(\\s*))*{");
	 subCode[1] = subCode[1].replace(regExp_con,  "$" + shortClassName + " = function($1){" + defin);

	 code = subCode.join(" class");
	 code = code.replace(regExp_class, "$1" + str);
	 code = code.replace(regExp_asExpr, "$1.$convert($6)");
    }

    //else
    //{
      //throw new Exception(0x0081,
       //"JSVM.compiler.parsers['javascript2'].parse Error. "
       //+ "can't found keyword 'class'.");
    //}
    // restore string constant
    for (var i = 0; i < constStrs.length; i++)
    {
     code = code.replace((strings_tmpPrefix + i
     + strings_tmpSuffix), constStrs[i]);
    }

    return code;
   }
  });
 jsre.JSVM.logs.log("JSVM.compiler set a parser for 'javascript2' succ.");
}

/**
 * auto execute & save to jsre resource-cache
 */

try
{
 var jsre = _JSVM_Namespace.runtimeEnvironment;
 if (jsre.state == 1)
 {
  _jsvmCoreFunc_extends_javascript2();
  jsre.setResource("$code{extends/javascript2}", _jsvmCoreFunc_extends_javascript2);
  jsre.log("JSVM_Namespace.rtenv: "
   + "Load core function 'extends/javascript2' succ.");
 }
}
catch(ex)
{
 jsre.state = 0;
 jsre.log("JSVM_Namespace.rtenv: "
  + "Load core function 'extends/javascript2' load fail.");
}
finally
{
 jsre = _jsvmCoreFunc_extends_javascript2 = void(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -