| | 812 | |
|---|
| | 813 | //begin compiler |
|---|
| | 814 | var or=function(){ |
|---|
| | 815 | var a=[]; |
|---|
| | 816 | for(var i=0;i<arguments.length;i++){ |
|---|
| | 817 | a.push(grp(arguments[i])); |
|---|
| | 818 | } |
|---|
| | 819 | return a.join('|'); |
|---|
| | 820 | } |
|---|
| | 821 | var grp=function(a){return '(' + a + ')'; }; |
|---|
| | 822 | var wrd=function(w){ |
|---|
| | 823 | w= w.replace(/\\/g,'\\\\'); |
|---|
| | 824 | w= w.replace(/\(/g,'\\('); |
|---|
| | 825 | w= w.replace(/\)/g,'\\)'); |
|---|
| | 826 | w= w.replace(/\//g,'\\/'); |
|---|
| | 827 | w= w.replace(/\*/g,'\\*'); |
|---|
| | 828 | w= w.replace(/\./g,'\\.'); |
|---|
| | 829 | w= w.replace(/\]/g,'\\]'); |
|---|
| | 830 | w= w.replace(/\[/g,'\\['); |
|---|
| | 831 | w= w.replace(/\{/g,'\\{'); |
|---|
| | 832 | w= w.replace(/\}/g,'\\}'); |
|---|
| | 833 | return '\\b' + w + '\\b'; |
|---|
| | 834 | }; |
|---|
| | 835 | |
|---|
| | 836 | var parens= function(a){return '\\('+a+'\\)';}; |
|---|
| | 837 | var re=function(s){ return new RegExp(s,'g');}; |
|---|
| | 838 | var string=function(d){return d + '(\\\\'+d+'|.' + d + ')*?' ;}; |
|---|
| | 839 | var identifier=function(){return '\\w+';}; |
|---|
| | 840 | var anyWhiteSpaceStart= grp('(^|[\\n\\r])\\s*') ; |
|---|
| | 841 | var someWhiteSpaceStart= grp('(^|[\\n\\r])\\s*') ; |
|---|
| | 842 | var startOfLine= grp('^|[\\n\\r]'); |
|---|
| | 843 | var blockComment='/\\*([\\n\\r]|.)*?\\*/'; |
|---|
| | 844 | var comment='//' + '.*' ; |
|---|
| | 845 | var methodDecl= grp([wrd('function'), wrd('def'),wrd('publ')].join('|')) +'\\s+' +grp(identifier()) + '\\s*' + grp(parens('.*?')); |
|---|
| | 846 | |
|---|
| | 847 | var moduleFunctionStatement = startOfLine + methodDecl ; |
|---|
| | 848 | var classMethodStatement = someWhiteSpaceStart + methodDecl; |
|---|
| | 849 | |
|---|
| | 850 | var classMember= someWhiteSpaceStart + wrd('publ')+ '\\s+' +grp(identifier()); |
|---|
| | 851 | var classStatement = anyWhiteSpaceStart + wrd('class')+'\\s+' +grp(identifier()) + '\\s+' + wrd('extends') +'\\s+' + grp('.+?') + '\\s*\\(\\{'; |
|---|
| | 852 | var simpleClassStatement = anyWhiteSpaceStart + wrd('class')+'\\s+' +grp(identifier()) + '\\s*\\(\\{'; |
|---|
| | 853 | |
|---|
| | 854 | var importStatement = anyWhiteSpaceStart + wrd('import')+'\\s+' + grp('.+?') + '[\\r\\n;]'; |
|---|
| | 855 | var iterStatement= anyWhiteSpaceStart + wrd('iter') + '\\s*\\(\\s*' +grp(identifier())+ '\\s+' + wrd('in') + '\\s+' + grp('.+?') + '\\)\\s*\\{'; |
|---|
| | 856 | var modLevelAssignment=startOfLine +grp(identifier())+'\\s*='; |
|---|
| | 857 | var modGlobaling =wrd('mod') + '\\s+' + grp(identifier()) +'\\s*='; |
|---|
| | 858 | var tupleAssingnment ='\\s\\[' + grp('.*?') + '\\]\\s*=' + grp('.+?') + ';'; |
|---|
| | 859 | var allStatments=re(or(blockComment, comment, string("'"), string('"'), |
|---|
| | 860 | classStatement, simpleClassStatement, classMethodStatement, moduleFunctionStatement, |
|---|
| | 861 | classMember,importStatement,iterStatement,modLevelAssignment,modGlobaling,tupleAssingnment)); |
|---|
| | 862 | |
|---|
| | 863 | var Replacer=Class(function(publ,priv,supr){ |
|---|
| | 864 | publ.__init__=function(match, repl){ |
|---|
| | 865 | this.match=re(match); |
|---|
| | 866 | this.replacement=repl; |
|---|
| | 867 | }; |
|---|
| | 868 | |
|---|
| | 869 | publ.run = function(a){ |
|---|
| | 870 | if(a.match(this.match)){ |
|---|
| | 871 | if(typeof this.replacement=='function'){ |
|---|
| | 872 | return this.replacement(a,RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4,RegExp.$5,RegExp.$6,RegExp.$7,RegExp.$8,RegExp.$9); |
|---|
| | 873 | }else{ |
|---|
| | 874 | return a.replace(this.match, this.replacement); |
|---|
| | 875 | } |
|---|
| | 876 | }else{ |
|---|
| | 877 | return null; |
|---|
| | 878 | } |
|---|
| | 879 | }; |
|---|
| | 880 | }); |
|---|
| | 881 | |
|---|
| 846 | | var or=function(){ |
|---|
| 847 | | var a=[]; |
|---|
| 848 | | for(var i=0;i<arguments.length;i++){ |
|---|
| 849 | | a.push(grp(arguments[i])); |
|---|
| 850 | | } |
|---|
| 851 | | return a.join('|'); |
|---|
| 852 | | } |
|---|
| 853 | | |
|---|
| 854 | | var grp=function(a){ |
|---|
| 855 | | return '(' + a + ')'; |
|---|
| 856 | | } |
|---|
| 857 | | |
|---|
| 858 | | var wrd=function(w){ |
|---|
| 859 | | w= w.replace(/\\/g,'\\\\'); |
|---|
| 860 | | w= w.replace(/\(/g,'\\('); |
|---|
| 861 | | w= w.replace(/\)/g,'\\)'); |
|---|
| 862 | | w= w.replace(/\//g,'\\/'); |
|---|
| 863 | | w= w.replace(/\*/g,'\\*'); |
|---|
| 864 | | w= w.replace(/\./g,'\\.'); |
|---|
| 865 | | w= w.replace(/\]/g,'\\]'); |
|---|
| 866 | | w= w.replace(/\[/g,'\\['); |
|---|
| 867 | | w= w.replace(/\{/g,'\\{'); |
|---|
| 868 | | w= w.replace(/\}/g,'\\}'); |
|---|
| 869 | | |
|---|
| 870 | | return '\\b' + w + '\\b'; |
|---|
| 871 | | }; |
|---|
| 872 | | |
|---|
| 873 | | |
|---|
| 874 | | var parens= function(a){ |
|---|
| 875 | | return '\\('+a+'\\)'; |
|---|
| 876 | | } |
|---|
| 877 | | |
|---|
| 878 | | var re=function(s){ |
|---|
| 879 | | return new RegExp(s,'g'); |
|---|
| 880 | | }; |
|---|
| 881 | | |
|---|
| 882 | | var string=function(d){ |
|---|
| 883 | | return d + '(\\\\'+d+'|.' + d + ')*?' ; |
|---|
| 884 | | }; |
|---|
| 885 | | |
|---|
| 886 | | var identifier=function(){ |
|---|
| 887 | | return '\\w+'; |
|---|
| 888 | | }; |
|---|
| 889 | | |
|---|
| 890 | | var anyWhiteSpaceStart= grp('(^|[\\n\\r])\\s*') ; |
|---|
| 891 | | var someWhiteSpaceStart= grp('(^|[\\n\\r])\\s*') ; |
|---|
| 892 | | var startOfLine= grp('^|[\\n\\r]'); |
|---|
| 893 | | |
|---|
| 894 | | var blockComment='/\\*([\\n\\r]|.)*?\\*/'; |
|---|
| 895 | | |
|---|
| 896 | | var comment='//' + '.*' ; |
|---|
| 897 | | |
|---|
| 898 | | var methodDecl= grp([wrd('function'), wrd('def'),wrd('publ')].join('|')) ; |
|---|
| 899 | | |
|---|
| 900 | | var moduleFunctionStatement = startOfLine + methodDecl +'\\s+' +grp(identifier()) + '\\s*' + grp(parens('.*?')); |
|---|
| 901 | | |
|---|
| 902 | | var classMethodStatement = someWhiteSpaceStart + methodDecl +'\\s+' +grp(identifier()) + '\\s*' + grp(parens('.*?')); |
|---|
| 903 | | |
|---|
| 904 | | var classMember= someWhiteSpaceStart + wrd('publ')+ '\\s+' +grp(identifier()); |
|---|
| 905 | | |
|---|
| 906 | | var classStatement = anyWhiteSpaceStart + wrd('class')+'\\s+' +grp(identifier()) + '\\s+' + wrd('extends') +'\\s+' + grp('.+?') + '\\(\\{'; |
|---|
| 907 | | var simpleClassStatement = anyWhiteSpaceStart + wrd('class')+'\\s+' +grp(identifier()) + '\\s*\\(\\{'; |
|---|
| 908 | | |
|---|
| 909 | | var importStatement = anyWhiteSpaceStart + wrd('import')+'\\s+' + grp('.+?') + '[\\r\\n;]'; |
|---|
| 910 | | |
|---|
| 911 | | var iterStatement= anyWhiteSpaceStart + wrd('iter') + '\\s*\\(\\s*' +grp(identifier())+ '\\s+' + wrd('in') + '\\s+' + grp('.+?') + '\\)\\{'; |
|---|
| 912 | | |
|---|
| 913 | | var modLevelAssignment=startOfLine +grp(identifier())+'\\s*='; |
|---|
| 914 | | |
|---|
| 915 | | var modGlobaling =wrd('mod') + '\\s+' + grp(identifier()) +'\\s*='; |
|---|
| 916 | | |
|---|
| 917 | | var tupleAssingnment ='\\s\\[' + grp('.*?') + '\\]\\s*=' + grp('.+?') + ';'; |
|---|
| 918 | | |
|---|
| 919 | | var allStatments=re(or(blockComment, comment, string("'"), string('"'), |
|---|
| 920 | | classStatement, simpleClassStatement, classMethodStatement, moduleFunctionStatement, |
|---|
| 921 | | classMember,importStatement,iterStatement,modLevelAssignment,modGlobaling,tupleAssingnment)); |
|---|
| 922 | | |
|---|
| 923 | | |
|---|
| 924 | | var Replacer=Class(function(publ,priv,supr){ |
|---|
| 925 | | publ.__init__=function(match, repl){ |
|---|
| 926 | | this.match=re(match); |
|---|
| 927 | | this.replacement=repl; |
|---|
| 928 | | }; |
|---|
| 929 | | |
|---|
| 930 | | publ.run = function(a){ |
|---|
| 931 | | if(a.match(this.match)){ |
|---|
| 932 | | return a.replace(this.match, this.replacement); |
|---|
| 933 | | }else{ |
|---|
| 934 | | return null; |
|---|
| 935 | | } |
|---|
| 936 | | }; |
|---|
| | 883 | var imports=[]; |
|---|
| | 884 | |
|---|
| | 885 | var replacers=[ |
|---|
| | 886 | new Replacer(moduleFunctionStatement, '$1var $3 = mod.$3=function$4' ), |
|---|
| | 887 | new Replacer(classMethodStatement, '$1publ.$4=function$5' ) , |
|---|
| | 888 | new Replacer(classStatement, function(s, re1,re2,re3,baseNames){ |
|---|
| | 889 | s=s.replace(this.match,'$1var $3 = mod.$3=Class("$3", $4, function(publ,priv,supr){var '); |
|---|
| | 890 | var names = baseNames.split(','); |
|---|
| | 891 | for(var i=0;i<names.length;i++){ |
|---|
| | 892 | var name=names[i].replace(/\s/g,''); |
|---|
| | 893 | names[i]='$' + name + '=' + name + '.prototype'; |
|---|
| | 894 | } |
|---|
| | 895 | s= s + names.join(', ') + ';'; |
|---|
| | 896 | return s; |
|---|
| | 897 | }), |
|---|
| | 898 | new Replacer(simpleClassStatement, '$1var $3 = mod.$3=Class("$3", function(publ,priv,supr){' ), |
|---|
| | 899 | new Replacer(classMember, '$1publ.$3' ), |
|---|
| | 900 | new Replacer(modLevelAssignment, '$1var $2 = mod.$2 =' ), |
|---|
| | 901 | new Replacer(modGlobaling, '$1 = mod.$1 =' ), |
|---|
| | 902 | new Replacer(importStatement, function(s, re1,re2,impcode){ |
|---|
| | 903 | imports.push(impcode); |
|---|
| | 904 | return '/*' + s + '*/'; |
|---|
| | 905 | }), |
|---|
| | 906 | new Replacer(iterStatement, function(s){ |
|---|
| | 907 | imports.push('itertools:iter'); |
|---|
| | 908 | return s.replace(this.match, "$1for(var $3, _$3_iterator_= iter($4); ($3=_$3_iterator_.next())!== undefined;){"); |
|---|
| | 909 | }), |
|---|
| | 910 | new Replacer(tupleAssingnment, function(s, names, expr){ |
|---|
| | 911 | names = names.replace(/\s/g,'').split(','); |
|---|
| | 912 | var s =' var ' + names.join(',')+', _' + names.join('_') + '=' + expr +';' |
|---|
| | 913 | for(var i=0;i<names.length;i++){ |
|---|
| | 914 | s+=names[i] + '= _' + names.join('_') + '['+i+'];'; |
|---|
| | 915 | } |
|---|
| | 916 | return s; |
|---|
| | 917 | }) |
|---|
| | 918 | ]; |
|---|
| | 919 | |
|---|
| | 920 | src =src.replace(allStatments, function(a){ |
|---|
| | 921 | var reslt=null; |
|---|
| | 922 | for(var i=0;i<replacers.length;i++){ |
|---|
| | 923 | rslt=replacers[i].run(a); |
|---|
| | 924 | if(rslt!=null){ |
|---|
| | 925 | return rslt; |
|---|
| | 926 | } |
|---|
| | 927 | } |
|---|
| | 928 | return a; |
|---|
| 939 | | |
|---|
| 940 | | var compile=function(src){ |
|---|
| 941 | | var replacers=[ |
|---|
| 942 | | new Replacer(moduleFunctionStatement, '$1var $3 = mod.$3=function$4' ), |
|---|
| 943 | | new Replacer(classMethodStatement, '$1publ.$4=function$5' ) , |
|---|
| 944 | | new Replacer(classStatement, '$1var $3 = mod.$3=Class("$3", $4, function(publ,priv,supr){' ), |
|---|
| 945 | | new Replacer(simpleClassStatement, '$1var $3 = mod.$3=Class("$3", function(publ,priv,supr){' ), |
|---|
| 946 | | new Replacer(classMember, '$1publ.$3' ), |
|---|
| 947 | | new Replacer(modLevelAssignment, '$1var $2 = mod.$2 =' ), |
|---|
| 948 | | new Replacer(modGlobaling, '$1 = mod.$1 =' ) |
|---|
| 949 | | ]; |
|---|
| 950 | | |
|---|
| 951 | | var importRE=re(importStatement); |
|---|
| 952 | | var iterRE =re(iterStatement); |
|---|
| 953 | | var tupleRE =re(tupleAssingnment); |
|---|
| 954 | | |
|---|
| 955 | | var imports=[]; |
|---|
| 956 | | |
|---|
| 957 | | src =src.replace(allStatments, function(a){ |
|---|
| 958 | | var reslt=null; |
|---|
| 959 | | |
|---|
| 960 | | |
|---|
| 961 | | for(var i=0;i<replacers.length;i++){ |
|---|
| 962 | | rslt=replacers[i].run(a); |
|---|
| 963 | | if(rslt!=null){ |
|---|
| 964 | | return rslt; |
|---|
| 965 | | }else{ |
|---|
| 966 | | if(a.match(importRE)){ |
|---|
| 967 | | imports.push(RegExp.$3); |
|---|
| 968 | | return '/*' + a + '*/'; |
|---|
| 969 | | }else if(a.match(iterRE)){ |
|---|
| 970 | | imports.push('itertools:iter'); |
|---|
| 971 | | |
|---|
| 972 | | return a.replace(iterRE, "$1for(var $3, _$3_iterator_= iter($4); ($3=_$3_iterator_.next())!== undefined;){"); |
|---|
| 973 | | }else if(a.match(tupleRE)){ |
|---|
| 974 | | var names= RegExp.$1; |
|---|
| 975 | | var expr= RegExp.$2; |
|---|
| 976 | | |
|---|
| 977 | | names = names.replace(/\s/g,'').split(','); |
|---|
| 978 | | var s =' var ' + names.join(',')+', _' + names.join('_') + '=' + expr +';' |
|---|
| 979 | | for(var i=0;i<names.length;i++){ |
|---|
| 980 | | s+=names[i] + '= _' + names.join('_') + '['+i+'];'; |
|---|
| 981 | | } |
|---|
| 982 | | return s; |
|---|
| 983 | | } |
|---|
| 984 | | } |
|---|
| 985 | | } |
|---|
| 986 | | return a; |
|---|
| 987 | | }); |
|---|
| 988 | | |
|---|
| 989 | | return {imports: imports, src:src}; |
|---|
| 990 | | }; |
|---|
| 991 | | var src = compile(src); |
|---|
| 992 | | //print(src.src) |
|---|
| 993 | | return src; |
|---|
| 994 | | }; |
|---|
| 995 | | |
|---|
| | 931 | //print(src) |
|---|
| | 932 | return {imports: imports, src:src}; |
|---|
| | 933 | }; |
|---|
| | 934 | //end compiler |
|---|