diff --git a/build/build.sh b/build/build.sh index 94745e21..df4a1dce 100755 --- a/build/build.sh +++ b/build/build.sh @@ -16,7 +16,7 @@ # commented Preprocessed but still formated and commented # stripped Formated but without comments (default) # compressed No comments and no whitespaces -# compiled Uses Google Closure Compiler to reduce file size even more +# uglified Uses UglifyJS to further reduce file size if [ $# -eq 0 ] then diff --git a/build/parse-js.sh b/build/parse-js.sh index 90c7ed24..83508e36 100755 --- a/build/parse-js.sh +++ b/build/parse-js.sh @@ -1 +1 @@ -./preprocess.sh ../lib/parse-js.js ../lib/parse-js-min.js "" compiled +./preprocess.sh ../lib/parse-js.js ../lib/parse-js-min.js "" uglified diff --git a/lib/parse-js-min.js b/lib/parse-js-min.js index cd686aa0..a2a11c13 100644 --- a/lib/parse-js-min.js +++ b/lib/parse-js-min.js @@ -1,44 +1,14 @@ -var parse_js=new (function(){function aa(g){g=g.charCodeAt(0);return g>=48&&g<=57||g>=65&&g<=90||g>=97&&g<=122}function ia(g){return aa(g)||g=="$"||g=="_"}function ja(g){g=g.charCodeAt(0);return g>=48&&g<=57}function va(g){if(wa.test(g))return parseInt(g.substr(2),16);else if(xa.test(g))return parseInt(g.substr(1),8);else if(ya.test(g))return parseFloat(g)}function ka(g,d,m,j){this.message=g;this.line=d;this.col=m;this.pos=j;try{({})()}catch(r){this.stack=r.stack}}function la(g,d,m,j){throw new ka(g, -d,m,j);}function ba(g,d,m){return g.type==d&&(m==null||g.value==m)}function ma(g){function d(){return o.text.charAt(o.pos)}function m(a){var b=o.text.charAt(o.pos++);if(a&&!b)throw ca;if(b=="\n"){o.newline_before=true;++o.line;o.col=0}else++o.col;return b}function j(a,b){a=o.text.indexOf(a,o.pos);if(b&&a==-1)throw ca;return a}function r(){o.tokline=o.line;o.tokcol=o.col;o.tokpos=o.pos}function i(a,b,c){o.regex_allowed=a=="operator"&&!x(na,b)||a=="keyword"&&x(za,b)||a=="punc"&&x(Aa,b);a={type:a,value:b, -line:o.tokline,col:o.tokcol,pos:o.tokpos,nlb:o.newline_before};if(!c){a.comments_before=o.comments_before;o.comments_before=[]}o.newline_before=false;return a}function f(){for(;x(Ba,d());)m()}function k(a){for(var b="",c=d(),n=0;c&&a(c,n++);){b+=m();c=d()}return b}function p(a){la(a,o.tokline,o.tokcol,o.tokpos)}function s(a){var b=false,c=false,n=false,u=a==".",B=k(function(I,S){if(I=="x"||I=="X"){if(n)return false;return n=true}if(!n&&(I=="E"||I=="e")){if(b)return false;return b=c=true}if(I=="-"){if(c|| -S==0&&!a)return true;return false}if(I=="+")return c;c=false;if(I=="."){if(!u)return u=true;return false}return aa(I)});if(a)B=a+B;var X=va(B);if(isNaN(X))p("Invalid syntax: "+B);else return i("num",X)}function R(){var a=m(true);switch(a){case "n":return"\n";case "r":return"\r";case "t":return"\t";case "b":return"\u0008";case "v":return"\u000b";case "f":return"\u000c";case "0":return"\u0000";case "x":return String.fromCharCode(w(2));case "u":return String.fromCharCode(w(4));default:return a}}function w(a){for(var b= -0;a>0;--a){var c=parseInt(m(true),16);isNaN(c)&&p("Invalid hex-character pattern in string");b=b<<4|c}return b}function F(){return K("Unterminated string constant",function(){for(var a=m(),b="";;){var c=m(true);if(c=="\\")c=R();else if(c==a)break;b+=c}return i("string",b)})}function G(){m();var a=j("\n"),b;if(a==-1){b=o.text.substr(o.pos);o.pos=o.text.length}else{b=o.text.substring(o.pos,a);o.pos=a}return i("comment1",b,true)}function t(){m();return K("Unterminated multiline comment",function(){var a= -j("*/",true),b=o.text.substring(o.pos,a),c=i("comment2",b,true);o.pos=a+2;o.line+=b.split("\n").length-1;o.newline_before=b.indexOf("\n")>=0;return c})}function H(){return K("Unterminated regular expression",function(){for(var a=false,b="",c,n=false;c=m(true);)if(a){b+="\\"+c;a=false}else if(c=="["){n=true;b+=c}else if(c=="]"&&n){n=false;b+=c}else if(c=="/"&&!n)break;else if(c=="\\")a=true;else b+=c;a=k(function(u){return x(Ca,u)});return i("regexp",[b,a])})}function M(a){function b(c){if(!d())return c; -var n=c+d();if(x(Y,n)){m();return b(n)}else return c}return i("operator",b(a||m()))}function q(){m();var a=o.regex_allowed;switch(d()){case "/":o.comments_before.push(G());o.regex_allowed=a;return N();case "*":o.comments_before.push(t());o.regex_allowed=a;return N()}return o.regex_allowed?H():M("/")}function P(){m();return ja(d())?s("."):i("punc",".")}function A(){var a=k(ia);return!x(oa,a)?i("name",a):x(Y,a)?i("operator",a):x(pa,a)?i("atom",a):i("keyword",a)}function K(a,b){try{return b()}catch(c){if(c=== -ca)p(a);else throw c;}}function N(a){if(a)return H();f();r();a=d();if(!a)return i("eof");if(ja(a))return s();if(a=='"'||a=="'")return F();if(x(Da,a))return i("punc",m());if(a==".")return P();if(a=="/")return q();if(x(Ea,a))return M();if(ia(a))return A();p("Unexpected character '"+a+"'")}var o={text:g.replace(/\r\n?|[\n\u2028\u2029]/g,"\n").replace(/^\uFEFF/,""),pos:0,tokpos:0,line:0,tokline:0,col:0,tokcol:0,newline_before:false,regex_allowed:false,comments_before:[]};N.context=function(a){if(a)o= -a;return o};return N}function da(g,d,m){this.name=g;this.start=d;this.end=m}function Fa(g,d,m){function j(e,h){return ba(l.token,e,h)}function r(){return l.peeked||(l.peeked=l.input())}function i(){l.prev=l.token;if(l.peeked){l.token=l.peeked;l.peeked=null}else l.token=l.input();return l.token}function f(){return l.prev}function k(e,h,v,z){var Q=l.input.context();la(e,h!=null?h:Q.tokline,v!=null?v:Q.tokcol,z!=null?z:Q.tokpos)}function p(e,h){k(h,e.line,e.col)}function s(e){if(e==null)e=l.token;p(e, -"Unexpected token: "+e.type+" ("+e.value+")")}function R(e,h){if(j(e,h))return i();p(l.token,"Unexpected token "+l.token.type+", expected "+e)}function w(e){return R("punc",e)}function F(){return!d&&(l.token.nlb||j("eof")||j("punc","}"))}function G(){if(j("punc",";"))i();else F()||s()}function t(){return O(arguments)}function H(){w("(");var e=C();w(")");return e}function M(e,h,v){return e instanceof da?e:new da(e,h,v)}function q(){if(j("operator","/")){l.peeked=null;l.token=l.input(true)}switch(l.token.type){case "num":case "string":case "regexp":case "operator":case "atom":return A(); -case "name":return ba(r(),"punc",":")?P(D(l.token.value,i,i)):A();case "punc":switch(l.token.value){case "{":return t("block",b());case "[":case "(":return A();case ";":i();return t("block");default:s()}case "keyword":switch(D(l.token.value,i)){case "break":return K("break");case "continue":return K("continue");case "debugger":G();return t("debugger");case "do":return function(e){R("keyword","while");return t("do",D(H,G),e)}(T(J));case "for":return N();case "function":return ea(true);case "if":return a(); -case "return":l.in_function==0&&k("'return' outside of function");return t("return",j("punc",";")?(i(),null):F()?null:D(C,G));case "switch":return t("switch",H(),Ga());case "throw":return t("throw",D(C,G));case "try":return c();case "var":return D(u,G);case "const":return D(B,G);case "while":return t("while",H(),T(J));case "with":return t("with",H(),J());default:s()}}}function P(e){l.labels.push(e);var h=l.token,v=J();d&&!x(Ha,v[0])&&s(h);l.labels.pop();return t("label",e,v)}function A(){return t("stat", -D(C,G))}function K(e){var h=j("name")?l.token.value:null;if(h!=null){i();U(h,l.labels)||k("Label "+h+" without matching loop or statement")}else l.in_loop==0&&k(e+" not inside a loop or switch");G();return t(e,h)}function N(){w("(");var e=j("keyword","var");e&&i();if(j("name")&&ba(r(),"operator","in")){var h=l.token.value;i();i();var v=C();w(")");return t("for-in",e,h,v,T(J))}else{e=j("punc",";")?null:e?u():C();w(";");h=j("punc",";")?null:C();w(";");v=j("punc",")")?null:C();w(")");return t("for", -e,h,v,T(J))}}function o(e){var h=j("name")?D(l.token.value,i):null;e&&!h&&s();w("(");return t(e?"defun":"function",h,function(v,z){for(;!j("punc",")");){if(v)v=false;else w(",");j("name")||s();z.push(l.token.value);i()}i();return z}(true,[]),function(){++l.in_function;var v=l.in_loop;l.in_loop=0;var z=b();--l.in_function;l.in_loop=v;return z}())}function a(){var e=H(),h=J(),v;if(j("keyword","else")){i();v=J()}return t("if",e,h,v)}function b(){w("{");for(var e=[];!j("punc","}");){j("eof")&&s();e.push(J())}i(); -return e}function c(){var e=b(),h,v;if(j("keyword","catch")){i();w("(");j("name")||k("Name expected");h=l.token.value;i();w(")");h=[h,b()]}if(j("keyword","finally")){i();v=b()}!h&&!v&&k("Missing catch/finally blocks");return t("try",e,h,v)}function n(){for(var e=[];;){j("name")||s();var h=l.token.value;i();if(j("operator","=")){i();e.push([h,C(false)])}else e.push([h]);if(!j("punc",","))break;i()}return e}function u(){return t("var",n())}function B(){return t("const",n())}function X(){var e=I(false), -h;if(j("punc","(")){i();h=S(")")}else h=[];return L(t("new",e,h),true)}function I(e){if(j("operator","new")){i();return X()}if(j("operator")&&x(Ia,l.token.value))return qa("unary-prefix",D(l.token.value,i),I(e));if(j("punc")){switch(l.token.value){case "(":i();return L(D(C,Z(w,")")),e);case "[":i();return L(Ja(),e);case "{":i();return L(Ka(),e)}s()}if(j("keyword","function")){i();return L(ea(false),e)}if(x(La,l.token.type)){var h=l.token.type=="regexp"?t("regexp",l.token.value[0],l.token.value[1]): -t(l.token.type,l.token.value);return L(D(h,i),e)}s()}function S(e,h,v){for(var z=true,Q=[];!j("punc",e);){if(z)z=false;else w(",");if(h&&j("punc",e))break;j("punc",",")&&v?Q.push(["atom","undefined"]):Q.push(C(false))}i();return Q}function Ja(){return t("array",S("]",!d,true))}function Ka(){for(var e=true,h=[];!j("punc","}");){if(e)e=false;else w(",");if(!d&&j("punc","}"))break;var v=l.token.type,z=Ma();if(v=="name"&&(z=="get"||z=="set")&&!j("punc",":"))h.push([fa(),ea(false),z]);else{w(":");h.push([z, -C(false)])}}i();return t("object",h)}function Ma(){switch(l.token.type){case "num":case "string":return D(l.token.value,i)}return fa()}function fa(){switch(l.token.type){case "name":case "operator":case "keyword":case "atom":return D(l.token.value,i);default:s()}}function L(e,h){if(j("punc",".")){i();return L(t("dot",e,fa()),h)}if(j("punc","[")){i();return L(t("sub",e,D(C,Z(w,"]"))),h)}if(h&&j("punc","(")){i();return L(t("call",e,S(")")),true)}if(h&&j("operator")&&x(na,l.token.value))return D(Z(qa, -"unary-postfix",l.token.value,e),i);return e}function qa(e,h,v){if((h=="++"||h=="--")&&!ra(v))k("Invalid use of "+h+" operator");return t(e,h,v)}function ga(e,h){var v=j("operator")?l.token.value:null,z=v!=null?V[v]:null;if(z!=null&&z>h){i();z=ga(I(true),z);return ga(t("binary",v,e,z),h)}return e}function Na(){return ga(I(true),0)}function Oa(){var e=Na();if(j("operator","?")){i();var h=C(false);w(":");return t("conditional",e,h,C(false))}return e}function ra(e){switch(e[0]){case "dot":case "sub":return true; -case "name":return e[1]!="this"}}function sa(){var e=Oa(),h=l.token.value;if(j("operator")&&x(ta,h)){if(ra(e)){i();return t("assign",ta[h],e,sa())}k("Invalid assignment")}return e}function C(e){if(arguments.length==0)e=true;var h=sa();if(e&&j("punc",",")){i();return t("seq",h,C())}return h}function T(e){try{++l.in_loop;return e()}finally{--l.in_loop}}var l={input:typeof g=="string"?ma(g,true):g,token:null,prev:null,peeked:null,in_function:0,in_loop:0,labels:[]};l.token=i();var J=m?function(){var e= -l.token,h=q.apply(this,arguments);h[0]=M(h[0],e,f());return h}:q,ea=m?function(){var e=f(),h=o.apply(this,arguments);h[0]=M(h[0],e,f());return h}:o,Ga=Z(T,function(){w("{");for(var e=[],h=null;!j("punc","}");){j("eof")&&s();if(j("keyword","case")){i();h=[];e.push([C(),h]);w(":")}else if(j("keyword","default")){i();w(":");h=[];e.push([null,h])}else{h||s();h.push(J())}}i();return e});return t("toplevel",function(e){for(;!j("eof");)e.push(J());return e}([]))}function ua(){function g(f){return[this[0], -y(f,function(k){var p=[k[0]];if(k.length>1)p[1]=d(k[1]);return p})]}function d(f){if(f==null)return null;try{i.push(f);var k=f[0],p=r[k];if(p){var s=p.apply(f,f.slice(1));if(s!=null)return s}p=j[k];return p.apply(f,f.slice(1))}finally{i.pop()}}function m(f,k){var p={},s;for(s in f)if(x(f,s)){p[s]=r[s];r[s]=f[s]}f=k();for(s in p)if(x(p,s))if(p[s])r[s]=p[s];else delete r[s];return f}var j={string:function(f){return[this[0],f]},num:function(f){return[this[0],f]},name:function(f){return[this[0],f]},toplevel:function(f){return[this[0], -y(f,d)]},block:function(f){var k=[this[0]];f!=null&&k.push(y(f,d));return k},"var":g,"const":g,"try":function(f,k,p){return[this[0],y(f,d),k!=null?[k[0],y(k[1],d)]:null,p!=null?y(p,d):null]},"throw":function(f){return[this[0],d(f)]},"new":function(f,k){return[this[0],d(f),y(k,d)]},"switch":function(f,k){return[this[0],d(f),y(k,function(p){return[p[0]?d(p[0]):null,y(p[1],d)]})]},"break":function(f){return[this[0],f]},"continue":function(f){return[this[0],f]},conditional:function(f,k,p){return[this[0], -d(f),d(k),d(p)]},assign:function(f,k,p){return[this[0],f,d(k),d(p)]},dot:function(f){return[this[0],d(f)].concat(O(arguments,1))},call:function(f,k){return[this[0],d(f),y(k,d)]},"function":function(f,k,p){return[this[0],f,k.slice(),y(p,d)]},defun:function(f,k,p){return[this[0],f,k.slice(),y(p,d)]},"if":function(f,k,p){return[this[0],d(f),d(k),d(p)]},"for":function(f,k,p,s){return[this[0],d(f),d(k),d(p),d(s)]},"for-in":function(f,k,p,s){return[this[0],f,k,d(p),d(s)]},"while":function(f,k){return[this[0], -d(f),d(k)]},"do":function(f,k){return[this[0],d(f),d(k)]},"return":function(f){return[this[0],d(f)]},binary:function(f,k,p){return[this[0],f,d(k),d(p)]},"unary-prefix":function(f,k){return[this[0],f,d(k)]},"unary-postfix":function(f,k){return[this[0],f,d(k)]},sub:function(f,k){return[this[0],d(f),d(k)]},object:function(f){return[this[0],y(f,function(k){return k.length==2?[k[0],d(k[1])]:[k[0],d(k[1]),k[2]]})]},regexp:function(f,k){return[this[0],f,k]},array:function(f){return[this[0],y(f,d)]},stat:function(f){return[this[0], -d(f)]},seq:function(){return[this[0]].concat(y(O(arguments),d))},label:function(f,k){return[this[0],f,d(k)]},"with":function(f,k){return[this[0],d(f),d(k)]},atom:function(f){return[this[0],f]}},r={},i=[];return{walk:d,with_walkers:m,parent:function(){return i[i.length-2]},stack:function(){return i}}}function $(g){return!g||g[0]=="block"&&(!g[1]||g[1].length==0)}function ha(g){var d=0,m=0;g=g.replace(/[\\\b\f\n\r\t\x22\x27]/g,function(j){switch(j){case "\\":return"\\\\";case "\u0008":return"\\b";case "\u000c":return"\\f"; -case "\n":return"\\n";case "\r":return"\\r";case "\t":return"\\t";case '"':++d;return'"';case "'":++m;return"'"}return j});return d>m?"'"+g.replace(/\x27/g,"\\'")+"'":'"'+g.replace(/\x22/g,'\\"')+'"'}function Pa(g,d){function m(a){if(a==null)a="";if(d)a=(new Array(d.indent_start+P*d.indent_level)).join(" ")+a;return a}function j(a,b){if(b==null)b=1;P+=b;try{return a.apply(null,O(arguments,1))}finally{P-=b}}function r(a){if(d)return a.join(" ");for(var b=[],c=0;c0,B=j(function(){return m(c[0]?r(["case",q(c[0])+":"]):"default:")},0.5)+(u?A+j(function(){return G(c[1]).join(A)}):"");if(!d&&u&&n0?"("+i(y(b,q))+")":"";return r(["new",f(a,"seq","binary","conditional","assign",function(c){var n=ua(),u={};try{n.with_walkers({call:function(){throw u;},"function":function(){return this}},function(){n.walk(c)})}catch(B){if(B===u)return true;throw B;}})+b])},"switch":function(a,b){return r(["switch", -"("+q(a)+")",t(b)])},"break":function(a){var b="break";if(a!=null)b+=" "+F(a);return b+";"},"continue":function(a){var b="continue";if(a!=null)b+=" "+F(a);return b+";"},conditional:function(a,b,c){return r([f(a,"assign","seq","conditional"),"?",f(b,"seq"),":",f(c,"seq")])},assign:function(a,b,c){if(a&&a!==true)a+="=";else a="=";return r([q(b),a,f(c,"seq")])},dot:function(a){var b=q(a),c=1;if(a[0]=="num")b+=".";else if(p(a))b="("+b+")";for(;cV[b[1]])n="("+n+")";if(U(c[0],["assign","conditional","seq"])||c[0]=="binary"&&V[a]>=V[c[1]]&&!(c[1]==a&&U(a,["&&","||","*"])))u="("+u+")";return r([n,a,u])}, -"unary-prefix":function(a,b){var c=q(b);b[0]=="num"||b[0]=="unary-prefix"&&!x(Y,a+b[1])||!p(b)||(c="("+c+")");return a+(aa(a.charAt(0))?" ":"")+c},"unary-postfix":function(a,b){var c=q(b);b[0]=="num"||b[0]=="unary-postfix"&&!x(Y,a+b[1])||!p(b)||(c="("+c+")");return c+a},sub:function(a,b){var c=q(a);if(p(a))c="("+c+")";return c+"["+q(b)+"]"},object:function(a){if(a.length==0)return"{}";return"{"+A+j(function(){return y(a,function(b){if(b.length==3)return m(w(b[0],b[1][2],b[1][3],b[2]));var c=b[0]; -b=q(b[1]);if(d&&d.quote_keys)c=ha(c);else if((typeof c=="number"||!d&&+c+""==c)&&parseFloat(c)>=0)c=s(+c);else Sa(c)||(c=ha(c));return m(r(d&&d.space_colon?[c,":",b]:[c+":",b]))}).join(","+A)})+A+m("}")},regexp:function(a,b){return"/"+a+"/"+b},array:function(a){if(a.length==0)return"[]";return r(["[",i(y(a,function(b){if(!d&&b[0]=="atom"&&b[1]=="undefined")return"";return f(b,"seq")})),"]"])},stat:function(a){return q(a).replace(/;*\s*$/,";")},seq:function(){return i(y(O(arguments),q))},label:function(a, -b){return r([F(a),":",q(b)])},"with":function(a,b){return r(["with","("+q(a)+")",q(b)])},atom:function(a){return F(a)}},o=[];return q(g)}function Z(g){var d=O(arguments,1);return function(){return g.apply(this,d.concat(O(arguments)))}}function D(g){if(g instanceof Function)g=g();for(var d=1,m=arguments.length;--m>0;++d)arguments[d]();return g}function E(g){for(var d={},m=0;m=0;)if(d[m]===g)return true;return false}function Ra(g,d){var m={};if(g===true)g={};for(var j in d)if(x(d,j))m[j]=g&&x(g,j)?g[j]:d[j];return m}function Sa(g){return/^[a-z_$][a-z0-9_$]*$/i.test(g)&&g!="this"&&!x(pa,g)&&!x(Ta,g)&&!x(oa,g)}function x(g,d){return Object.prototype.hasOwnProperty.call(g,d)}function y(g,d,m){for(var j=[],r=0;r!?|~^")),wa=/^0x[0-9a-f]+$/i,xa=/^0[0-7]+$/,ya=/^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i,Y=E(["in","instanceof","typeof","new","void","delete","++","--","+","-","!","~","&","|","^","*","/","%",">>","<<",">>>","<",">","<=",">=","==","===","!=","!==","?","=","+=","-=","/=","*=","%=",">>=","<<=",">>>=","%=","|=","^=","&=","&&","||"]),Ba=E(W(" \n\r\t")),Aa=E(W("[{}(,.;:")),Da=E(W("[]{}(),;:")),Ca=E(W("gmsiy"));ka.prototype.toString=function(){return this.message+" (line: "+ -this.line+", col: "+this.col+", pos: "+this.pos+")\n\n"+this.stack};var ca={},Ia=E(["typeof","void","delete","--","++","!","~","-","+"]),na=E(["--","++"]),ta=function(g,d,m){for(;m>=","<<=",">>>=","|=","^=","&="],{"=":true},0),V=function(g,d){for(var m=0,j=1;m","<=",">=","in", -"instanceof"],[">>","<<",">>>"],["+","-"],["*","/","%"]],{}),Ha=E(["for","do","while","switch"]),La=E(["atom","num","string","regexp","name"]);da.prototype.toString=function(){return this.name};var Qa=E(["name","array","string","dot","sub","call","regexp"]);return{parse:Fa,stringify:Pa,tokenizer:ma,walker:ua}}); +/** + * A JavaScript tokenizer / parser / generator. + * + * Distributed under the BSD license. + * + * Copyright (c) 2010, Mihai Bazon + * http://mihai.bazon.net/blog/ + * + * Modifications and adaption to browser (c) 2011, Juerg Lehni + * http://lehni.org/ + * + * Based on parse-js, (c) Marijn Haverbeke + * http://marijn.haverbeke.nl/parse-js/ + */var parse_js=new function(){function S(a,b,c){var d=[];for(var e=0;e=0;)if(b[c]===a)return!0;return!1}function N(a){return a.split("")}function M(a,b){return Array.prototype.slice.call(a,b==null?0:b)}function L(a){var b={};for(var c=0;c0;++b)arguments[b]();return a}function J(a){var b=M(arguments,1);return function(){return a.apply(this,b.concat(M(arguments)))}}function I(a,b){function y(a){var b=a[0],c=p[b];if(!c)throw new Error("Can't find generator for \""+b+'"');x.push(a);var d=c.apply(b,a.slice(1));x.pop();return d}function w(a){var b=a[0],c=a[1];c!=null&&(b=h([b,"=",y(c)]));return b}function v(a){if(!a)return";";if(a.length==0)return"{}";return"{"+d+g(function(){return t(a).join(d)})+d+f("}")}function u(a){var c=a.length;if(c==0)return"{}";return"{"+d+S(a,function(a,e){var i=a[1].length>0,j=g(function(){return f(a[0]?h(["case",y(a[0])+":"]):"default:")},.5)+(i?d+g(function(){return t(a[1]).join(d)}):"");!b&&i&&e0?"("+j(S(b,y))+")":"";return h(["new",k(a,"seq","binary","conditional","assign",function(a){var b=E(),c={};try{b.with_walkers({call:function(){throw c},"function":function(){return this}},function(){b.walk(a)})}catch(d){if(d===c)return!0;throw d}})+b])},"switch":function(a,b){return h(["switch","("+y(a)+")",u(b)])},"break":function(a){var b="break";a!=null&&(b+=" "+s(a));return b+";"},"continue":function(a){var b="continue";a!=null&&(b+=" "+s(a));return b+";"},conditional:function(a,b,c){return h([k(a,"assign","seq","conditional"),"?",k(b,"seq"),":",k(c,"seq")])},assign:function(a,b,c){a&&a!==!0?a+="=":a="=";return h([y(b),a,k(c,"seq")])},dot:function(a){var b=y(a),c=1;a[0]=="num"?b+=".":m(a)&&(b="("+b+")");while(cz[b[1]])d="("+d+")";if(O(c[0],["assign","conditional","seq"])||c[0]=="binary"&&z[a]>=z[c[1]]&&(c[1]!=a||!O(a,["&&","||","*"])))e="("+e+")";return h([d,a,e])},"unary-prefix":function(a,b){var c=y(b);b[0]=="num"||b[0]=="unary-prefix"&&!R(i,a+b[1])||!m(b)||(c="("+c+")");return a+(n(a.charAt(0))?" ":"")+c},"unary-postfix":function(a,b){var c=y(b);b[0]=="num"||b[0]=="unary-postfix"&&!R(i,a+b[1])||!m(b)||(c="("+c+")");return c+a},sub:function(a,b){var c=y(a);m(a)&&(c="("+c+")");return c+"["+y(b)+"]"},object:function(a){if(a.length==0)return"{}";return"{"+d+g(function(){return S(a,function(a){if(a.length==3)return f(r(a[0],a[1][2],a[1][3],a[2]));var c=a[0],d=y(a[1]);b&&b.quote_keys?c=H(c):(typeof c=="number"||!b&&+c+""==c)&&parseFloat(c)>=0?c=o(+c):Q(c)||(c=H(c));return f(h(b&&b.space_colon?[c,":",d]:[c+":",d]))}).join(","+d)})+d+f("}")},regexp:function(a,b){return"/"+a+"/"+b},array:function(a){if(a.length==0)return"[]";return h(["[",j(S(a,function(a){if(!b&&a[0]=="atom"&&a[1]=="undefined")return"";return k(a,"seq")})),"]"])},stat:function(a){return y(a).replace(/;*\s*$/,";")},seq:function(){return j(S(M(arguments),y))},label:function(a,b){return h([s(a),":",y(b)])},"with":function(a,b){return h(["with","("+y(a)+")",y(b)])},atom:function(a){return s(a)}},x=[];return y(a)}function H(a){var b=0,c=0;a=a.replace(/[\\\b\f\n\r\t\x22\x27]/g,function(a){switch(a){case"\\":return"\\\\";case"\b":return"\\b";case"\f":return"\\f";case"\n":return"\\n";case"\r":return"\\r";case"\t":return"\\t";case'"':++b;return'"';case"'":++c;return"'"}return a});return b>c?"'"+a.replace(/\x27/g,"\\'")+"'":'"'+a.replace(/\x22/g,'\\"')+'"'}function F(a){return!a||a[0]=="block"&&(!a[1]||a[1].length==0)}function E(){function f(a,b){var d={},e;for(e in a)R(a,e)&&(d[e]=c[e],c[e]=a[e]);var f=b();for(e in d)R(d,e)&&(d[e]?c[e]=d[e]:delete c[e]);return f}function e(a){if(a==null)return null;try{d.push(a);var e=a[0],f=c[e];if(f){var g=f.apply(a,a.slice(1));if(g!=null)return g}f=b[e];return f.apply(a,a.slice(1))}finally{d.pop()}}function a(a){return[this[0],S(a,function(a){var b=[a[0]];a.length>1&&(b[1]=e(a[1]));return b})]}var b={string:function(a){return[this[0],a]},num:function(a){return[this[0],a]},name:function(a){return[this[0],a]},toplevel:function(a){return[this[0],S(a,e)]},block:function(a){var b=[this[0]];a!=null&&b.push(S(a,e));return b},"var":a,"const":a,"try":function(a,b,c){return[this[0],S(a,e),b!=null?[b[0],S(b[1],e)]:null,c!=null?S(c,e):null]},"throw":function(a){return[this[0],e(a)]},"new":function(a,b){return[this[0],e(a),S(b,e)]},"switch":function(a,b){return[this[0],e(a),S(b,function(a){return[a[0]?e(a[0]):null,S(a[1],e)]})]},"break":function(a){return[this[0],a]},"continue":function(a){return[this[0],a]},conditional:function(a,b,c){return[this[0],e(a),e(b),e(c)]},assign:function(a,b,c){return[this[0],a,e(b),e(c)]},dot:function(a){return[this[0],e(a)].concat(M(arguments,1))},call:function(a,b){return[this[0],e(a),S(b,e)]},"function":function(a,b,c){return[this[0],a,b.slice(),S(c,e)]},defun:function(a,b,c){return[this[0],a,b.slice(),S(c,e)]},"if":function(a,b,c){return[this[0],e(a),e(b),e(c)]},"for":function(a,b,c,d){return[this[0],e(a),e(b),e(c),e(d)]},"for-in":function(a,b,c,d){return[this[0],a,b,e(c),e(d)]},"while":function(a,b){return[this[0],e(a),e(b)]},"do":function(a,b){return[this[0],e(a),e(b)]},"return":function(a){return[this[0],e(a)]},binary:function(a,b,c){return[this[0],a,e(b),e(c)]},"unary-prefix":function(a,b){return[this[0],a,e(b)]},"unary-postfix":function(a,b){return[this[0],a,e(b)]},sub:function(a,b){return[this[0],e(a),e(b)]},object:function(a){return[this[0],S(a,function(a){return a.length==2?[a[0],e(a[1])]:[a[0],e(a[1]),a[2]]})]},regexp:function(a,b){return[this[0],a,b]},array:function(a){return[this[0],S(a,e)]},stat:function(a){return[this[0],e(a)]},seq:function(){return[this[0]].concat(S(M(arguments),e))},label:function(a,b){return[this[0],a,e(b)]},"with":function(a,b){return[this[0],e(a),e(b)]},atom:function(a){return[this[0],a]}},c={},d=[];return{walk:e,with_walkers:f,parent:function(){return d[d.length-2]},stack:function(){return d}}}function D(a,b,c){function bj(a){try{++d.in_loop;return a()}finally{--d.in_loop}}function bi(a){arguments.length==0&&(a=!0);var b=bh();if(a&&e("punc",",")){g();return p("seq",b,bi())}return b}function bh(){var a=bf(),b=d.token.value;if(e("operator")&&R(y,b)){if(bg(a)){g();return p("assign",y[b],a,bh())}i("Invalid assignment")}return a}function bg(a){switch(a[0]){case"dot":case"sub":return!0;case"name":return a[1]!="this"}}function bf(){var a=be();if(e("operator","?")){g();var b=bi(!1);m(":");return p("conditional",a,b,bi(!1))}return a}function be(){return bd(X(!0),0)}function bd(a,b){var c=e("operator")?d.token.value:null,f=c!=null?z[c]:null;if(f!=null&&f>b){g();var h=bd(X(!0),f);return bd(p("binary",c,a,h),b)}return a}function bc(a,b,c){(b=="++"||b=="--")&&!bg(c)&&i("Invalid use of "+b+" operator");return p(a,b,c)}function bb(a,b){if(e("punc",".")){g();return bb(p("dot",a,ba()),b)}if(e("punc","[")){g();return bb(p("sub",a,K(bi,J(m,"]"))),b)}if(b&&e("punc","(")){g();return bb(p("call",a,Y(")")),!0)}if(b&&e("operator")&&R(x,d.token.value))return K(J(bc,"unary-postfix",d.token.value,a),g);return a}function ba(){switch(d.token.type){case"name":case"operator":case"keyword":case"atom":return K(d.token.value,g);default:k()}}function _(){switch(d.token.type){case"num":case"string":return K(d.token.value,g)}return ba()}function $(){var a=!0,c=[];while(!e("punc","}")){a?a=!1:m(",");if(!b&&e("punc","}"))break;var f=d.token.type,h=_();f!="name"||h!="get"&&h!="set"||!!e("punc",":")?(m(":"),c.push([h,bi(!1)])):c.push([ba(),I(!1),h])}g();return p("object",c)}function Z(){return p("array",Y("]",!b,!0))}function Y(a,b,c){var d=!0,f=[];while(!e("punc",a)){d?d=!1:m(",");if(b&&e("punc",a))break;e("punc",",")&&c?f.push(["atom","undefined"]):f.push(bi(!1))}g();return f}function X(a){if(e("operator","new")){g();return W()}if(e("operator")&&R(w,d.token.value))return bc("unary-prefix",K(d.token.value,g),X(a));if(e("punc")){switch(d.token.value){case"(":g();return bb(K(bi,J(m,")")),a);case"[":g();return bb(Z(),a);case"{":g();return bb($(),a)}k()}if(e("keyword","function")){g();return bb(I(!1),a)}if(R(B,d.token.type)){var b=d.token.type=="regexp"?p("regexp",d.token.value[0],d.token.value[1]):p(d.token.type,d.token.value);return bb(K(b,g),a)}k()}function W(){var a=X(!1),b;e("punc","(")?(g(),b=Y(")")):b=[];return bb(p("new",a,b),!0)}function V(){return p("const",T())}function U(){return p("var",T())}function T(){var a=[];for(;;){e("name")||k();var b=d.token.value;g(),e("operator","=")?(g(),a.push([b,bi(!1)])):a.push([b]);if(!e("punc",","))break;g()}return a}function S(){var a=P(),b,c;if(e("keyword","catch")){g(),m("("),e("name")||i("Name expected");var f=d.token.value;g(),m(")"),b=[f,P()]}e("keyword","finally")&&(g(),c=P()),!b&&!c&&i("Missing catch/finally blocks");return p("try",a,b,c)}function P(){m("{");var a=[];while(!e("punc","}"))e("eof")&&k(),a.push(u());g();return a}function N(){var a=q(),b=u(),c;e("keyword","else")&&(g(),c=u());return p("if",a,b,c)}function L(a){var b=e("name")?K(d.token.value,g):null;a&&!b&&k(),m("(");return p(a?"defun":"function",b,function(a,b){while(!e("punc",")"))a?a=!1:m(","),e("name")||k(),b.push(d.token.value),g();g();return b}(!0,[]),function(){++d.in_function;var a=d.in_loop;d.in_loop=0;var b=P();--d.in_function,d.in_loop=a;return b}())}function H(){m("(");var a=e("keyword","var");a&&g();if(e("name")&&t(f(),"operator","in")){var b=d.token.value;g(),g();var c=bi();m(")");return p("for-in",a,b,c,bj(u))}var h=e("punc",";")?null:a?U():bi();m(";");var i=e("punc",";")?null:bi();m(";");var j=e("punc",")")?null:bi();m(")");return p("for",h,i,j,bj(u))}function G(a){var b=e("name")?d.token.value:null;b!=null?(g(),O(b,d.labels)||i("Label "+b+" without matching loop or statement")):d.in_loop==0&&i(a+" not inside a loop or switch"),o();return p(a,b)}function F(){return p("stat",K(bi,o))}function E(a){d.labels.push(a);var c=d.token,e=u();b&&!R(A,e[0])&&k(c),d.labels.pop();return p("label",a,e)}function D(){e("operator","/")&&(d.peeked=null,d.token=d.input(!0));switch(d.token.type){case"num":case"string":case"regexp":case"operator":case"atom":return F();case"name":return t(f(),"punc",":")?E(K(d.token.value,g,g)):F();case"punc":switch(d.token.value){case"{":return p("block",P());case"[":case"(":return F();case";":g();return p("block");default:k()};case"keyword":switch(K(d.token.value,g)){case"break":return G("break");case"continue":return G("continue");case"debugger":o();return p("debugger");case"do":return function(a){l("keyword","while");return p("do",K(q,o),a)}(bj(u));case"for":return H();case"function":return I(!0);case"if":return N();case"return":d.in_function==0&&i("'return' outside of function");return p("return",e("punc",";")?(g(),null):n()?null:K(bi,o));case"switch":return p("switch",q(),Q());case"throw":return p("throw",K(bi,o));case"try":return S();case"var":return K(U,o);case"const":return K(V,o);case"while":return p("while",q(),bj(u));case"with":return p("with",q(),u());default:k()}}}function r(a,b,c){return a instanceof C?a:new C(a,b,c)}function q(){m("(");var a=bi();m(")");return a}function p(){return M(arguments)}function o(){e("punc",";")?g():n()||k()}function n(){return!b&&(d.token.nlb||e("eof")||e("punc","}"))}function m(a){return l("punc",a)}function l(a,b){if(e(a,b))return g();j(d.token,"Unexpected token "+d.token.type+", expected "+a)}function k(a){a==null&&(a=d.token),j(a,"Unexpected token: "+a.type+" ("+a.value+")")}function j(a,b){i(b,a.line,a.col)}function i(a,b,c,e){var f=d.input.context();s(a,b!=null?b:f.tokline,c!=null?c:f.tokcol,e!=null?e:f.tokpos)}function h(){return d.prev}function g(){d.prev=d.token,d.peeked?(d.token=d.peeked,d.peeked=null):d.token=d.input();return d.token}function f(){return d.peeked||(d.peeked=d.input())}function e(a,b){return t(d.token,a,b)}var d={input:typeof a=="string"?v(a,!0):a,token:null,prev:null,peeked:null,in_function:0,in_loop:0,labels:[]};d.token=g();var u=c?function(){var a=d.token,b=D.apply(this,arguments);b[0]=r(b[0],a,h());return b}:D,I=c?function(){var a=h(),b=L.apply(this,arguments);b[0]=r(b[0],a,h());return b}:L,Q=J(bj,function(){m("{");var a=[],b=null;while(!e("punc","}"))e("eof")&&k(),e("keyword","case")?(g(),b=[],a.push([bi(),b]),m(":")):e("keyword","default")?(g(),m(":"),b=[],a.push([null,b])):(b||k(),b.push(u()));g();return a});return p("toplevel",function(a){while(!e("eof"))a.push(u());return a}([]))}function C(a,b,c){this.name=a,this.start=b,this.end=c}function v(b){function N(a){if(a)return H();y(),v();var b=g();if(!b)return w("eof");if(p(b))return B();if(b=='"'||b=="'")return E();if(R(l,b))return w("punc",h());if(b==".")return K();if(b=="/")return J();if(R(e,b))return I();if(o(b))return L();A("Unexpected character '"+b+"'")}function M(a,b){try{return b()}catch(c){if(c===u)A(a);else throw c}}function L(){var b=z(o);return R(a,b)?R(i,b)?w("operator",b):R(d,b)?w("atom",b):w("keyword",b):w("name",b)}function K(){h();return p(g())?B("."):w("punc",".")}function J(){h();var a=f.regex_allowed;switch(g()){case"/":f.comments_before.push(F()),f.regex_allowed=a;return N();case"*":f.comments_before.push(G()),f.regex_allowed=a;return N()}return f.regex_allowed?H():I("/")}function I(a){function b(a){if(!g())return a;var c=a+g();if(R(i,c)){h();return b(c)}return a}return w("operator",b(a||h()))}function H(){return M("Unterminated regular expression",function(){var a=!1,b="",c,d=!1;while(c=h(!0))if(a)b+="\\"+c,a=!1;else if(c=="[")d=!0,b+=c;else if(c=="]"&&d)d=!1,b+=c;else{if(c=="/"&&!d)break;c=="\\"?a=!0:b+=c}var e=z(function(a){return R(m,a)});return w("regexp",[b,e])})}function G(){h();return M("Unterminated multiline comment",function(){var a=t("*/",!0),b=f.text.substring(f.pos,a),c=w("comment2",b,!0);f.pos=a+2,f.line+=b.split("\n").length-1,f.newline_before=b.indexOf("\n")>=0;return c})}function F(){h();var a=t("\n"),b;a==-1?(b=f.text.substr(f.pos),f.pos=f.text.length):(b=f.text.substring(f.pos,a),f.pos=a);return w("comment1",b,!0)}function E(){return M("Unterminated string constant",function(){var a=h(),b="";for(;;){var c=h(!0);if(c=="\\")c=C();else if(c==a)break;b+=c}return w("string",b)})}function D(a){var b=0;for(;a>0;--a){var c=parseInt(h(!0),16);isNaN(c)&&A("Invalid hex-character pattern in string"),b=b<<4|c}return b}function C(){var a=h(!0);switch(a){case"n":return"\n";case"r":return"\r";case"t":return"\t";case"b":return"\b";case"v":return" ";case"f":return"\f";case"0":return"";case"x":return String.fromCharCode(D(2));case"u":return String.fromCharCode(D(4));default:return a}}function B(a){var b=!1,c=!1,d=!1,e=a==".",f=z(function(f,g){if(f=="x"||f=="X"){if(d)return!1;return d=!0}if(!d&&(f=="E"||f=="e")){if(b)return!1;return b=c=!0}if(f=="-"){if(c||g==0&&!a)return!0;return!1}if(f=="+")return c;c=!1;if(f=="."){if(!e)return e=!0;return!1}return n(f)});a&&(f=a+f);var g=q(f);if(!isNaN(g))return w("num",g);A("Invalid syntax: "+f)}function A(a){s(a,f.tokline,f.tokcol,f.tokpos)}function z(a){var b="",c=g(),d=0;while(c&&a(c,d++))b+=h(),c=g();return b}function y(){while(R(j,g()))h()}function w(a,b,d){f.regex_allowed=a=="operator"&&!R(x,b)||a=="keyword"&&R(c,b)||a=="punc"&&R(k,b);var e={type:a,value:b,line:f.tokline,col:f.tokcol,pos:f.tokpos,nlb:f.newline_before};d||(e.comments_before=f.comments_before,f.comments_before=[]),f.newline_before=!1;return e}function v(){f.tokline=f.line,f.tokcol=f.col,f.tokpos=f.pos}function t(a,b){var c=f.text.indexOf(a,f.pos);if(b&&c==-1)throw u;return c}function r(){return!f.peek()}function h(a){var b=f.text.charAt(f.pos++);if(a&&!b)throw u;b=="\n"?(f.newline_before=!0,++f.line,f.col=0):++f.col;return b}function g(){return f.text.charAt(f.pos)}var f={text:b.replace(/\r\n?|[\n\u2028\u2029]/g,"\n").replace(/^\uFEFF/,""),pos:0,tokpos:0,line:0,tokline:0,col:0,tokcol:0,newline_before:!1,regex_allowed:!1,comments_before:[]};N.context=function(a){a&&(f=a);return f};return N}function t(a,b,c){return a.type==b&&(c==null||a.value==c)}function s(a,b,c,d){throw new r(a,b,c,d)}function r(a,b,c,d){this.message=a,this.line=b,this.col=c,this.pos=d;try{({})()}catch(e){this.stack=e.stack}}function q(a){if(f.test(a))return parseInt(a.substr(2),16);if(g.test(a))return parseInt(a.substr(1),8);if(h.test(a))return parseFloat(a)}function p(a){a=a.charCodeAt(0);return a>=48&&a<=57}function o(a){return n(a)||a=="$"||a=="_"}function n(a){a=a.charCodeAt(0);return a>=48&&a<=57||a>=65&&a<=90||a>=97&&a<=122}var a=L(["break","case","catch","const","continue","default","delete","do","else","finally","for","function","if","in","instanceof","new","return","switch","throw","try","typeof","var","void","while","with"]),b=L(["abstract","boolean","byte","char","class","debugger","double","enum","export","extends","final","float","goto","implements","import","int","interface","long","native","package","private","protected","public","short","static","super","synchronized","throws","transient","volatile"]),c=L(["return","new","delete","throw","else","case"]),d=L(["false","null","true","undefined"]),e=L(N("+-*&%=<>!?|~^")),f=/^0x[0-9a-f]+$/i,g=/^0[0-7]+$/,h=/^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i,i=L(["in","instanceof","typeof","new","void","delete","++","--","+","-","!","~","&","|","^","*","/","%",">>","<<",">>>","<",">","<=",">=","==","===","!=","!==","?","=","+=","-=","/=","*=","%=",">>=","<<=",">>>=","%=","|=","^=","&=","&&","||"]),j=L(N(" \n\r\t")),k=L(N("[{}(,.;:")),l=L(N("[]{}(),;:")),m=L(N("gmsiy"));r.prototype.toString=function(){return this.message+" (line: "+this.line+", col: "+this.col+", pos: "+this.pos+")"+"\n\n"+this.stack};var u={},w=L(["typeof","void","delete","--","++","!","~","-","+"]),x=L(["--","++"]),y=function(a,b,c){while(c>=","<<=",">>>=","|=","^=","&="],{"=":!0},0),z=function(a,b){for(var c=0,d=1;c","<=",">=","in","instanceof"],[">>","<<",">>>"],["+","-"],["*","/","%"]],{}),A=L(["for","do","while","switch"]),B=L(["atom","num","string","regexp","name"]);C.prototype.toString=function(){return this.name};var G=L(["name","array","string","dot","sub","call","regexp"]);return{parse:D,stringify:I,tokenizer:v,walker:E}} \ No newline at end of file