-
Notifications
You must be signed in to change notification settings - Fork 3
/
mcs.min.js
1 lines (1 loc) · 16.1 KB
/
mcs.min.js
1
"use strict";(function(){var e=function(){var e=function e(r){if(!r||typeof r!=="string"){var n="Error: Object to parse is not a valid string or does not exist.";console.error(n);return n}function t(e){var r=true,n=true,t="",a=false,u=[],i="",o="",f=[];function s(e){this.vars=Object.create(e?e.vars:null);this.parent=e}s.prototype={extend:function e(){return new s(this)},lookup:function e(r){var n=this;while(n){if(Object.prototype.hasOwnProperty.call(n.vars,r))return n;n=n.parent}},get:function e(r){if(r in this.vars)return this.vars[r];p("Undefined variable "+r)},set:function e(r,n){var t=this.lookup(r);if(!t&&this.parent)p("Undefined variable "+r);return(t||this).vars[r]=n},def:function e(r,n){return this.vars[r]=n}};var c=new s;var v={};L(e,c);return v;function p(e){if(r)console.error(e);throw new Error(e)}function y(e,r,n){function t(e){if(typeof e!="number")p("Expected number but got "+e);return e}function a(e){if(t(e)==0)p("Divide by zero");return e}if(e=="+"&&(typeof r=="string"||typeof n=="string")){return r+n}switch(e){case"+":return t(r)+t(n);case"-":return t(r)-t(n);case"*":return t(r)*t(n);case"/":return t(r)/a(n);case"%":return t(r)%a(n);case"^":return Math.pow(t(r),t(n));case"&&":return r!==false&&n;case"||":return r!==false?r:n;case"<":return t(r)<t(n);case">":return t(r)>t(n);case"<=":return t(r)<=t(n);case">=":return t(r)>=t(n);case"==":return r===n;case"!=":return r!==n}p("Can't apply operator "+e)}function h(e,r){function n(e){if(e.type=="command")_(r,e);else if(e.type=="return"||e.type=="if"){return L(e,r)}else L(e,r)}if(e.type=="prog"){for(var t=0;t<e.prog.length;t++){var a=n(e.prog[t]);if(a)return a}}else{var a=n(e);if(a)return a}}function g(e,r){if(r.name=="range")p("Range is a pre-defined macro, please use another name");function n(){var n=r.vars;var t=e.extend();for(var a=0;a<n.length;++a){t.def(n[a],a<arguments.length?arguments[a]:false)}var u=h(r.body,t);return u}return e.set(r.name,n)}function d(e,t){n=r;try{r=false;if(t.value=="range")return l;var a=e.get(t.value);r=n;return a}catch(e){r=n;return t.value}}function m(e,r){var n=L(r.cond,e);if(n!==false){var t=h(r.then,e.extend());if(t)return t}else if(r.else){var a=h(r.else,e.extend());if(a)return a}return false}function x(e,r){var n=e.extend();L(r.params[0],n);while(L(r.params[1],n)){L(r.then,n);L(r.params[2],n)}}function k(e,r){var n=e.extend();var t=L(r.param,e);n.def(r.variable.value,0);for(var a=0;a<t.length;a++){n.set(r.variable.value,t[a]);L(r.then,n)}}function b(e,r){var n=L(r.selector,e);var t=L(r.pos[0],e);var a=L(r.pos[1],e);var u=L(r.pos[2],e);f.push("execute "+n+" "+t+" "+a+" "+u+" ");L(r.prog,e.extend());f.pop()}function w(e,r){if(Array.isArray(r.value)){var n="";for(var t=0;t<r.value.length;t++){if(r.value[t].type=="prog"){var a=L(r.value[t],e.extend());n+=a}else n+=r.value[t].value}return n}else{return r.value}}function O(e,r){if(r.value&&r.value.length>0){var n="~";for(var t=0;t<r.value.length;t++){n+=L(r.value[t],e)}return n}else{return"~"}}function E(e,r){if(Array.isArray(r.value)){if(r.value&&r.value.length>0){var n=r.prefix+"[";for(var t=0;t<r.value.length;t++){if(r.value[t].type=="ivar"){var a=L(r.value[t],e.extend());n+=a}else n+=r.value[t].value}return n+"]"}else{return r.prefix}}else{return r.value}}function C(e,r){var n={};var t=0;r.value.forEach(function(r){var a=L(r,e);n[t]=a;t++});return n}function N(e,r){var n=e.get(r.value);if(r.index){var t=L(r.index,e);if(typeof t!="number")p("Array index must be a number");return n[t]}else return n}function j(e,r){if(r.left.type=="ivar")return e.set(r.left.value,L(r.right,e));else if(r.left.type=="var"){return e.def(r.left.value,L(r.right,e))}}function A(e,r){var n="{";for(var t=0;t<r.value.length;t++){var a="";if(r.value[t].type=="str"){a='"'+L(r.value[t],e)+'"'}else if(r.value[t].type=="array"){var u=L(r.value[t],e);a=JSON.stringify(Object.keys(u).map(function(e){return u[e]}))}else{a=L(r.value[t],e)}n+=a}n+="}";return n}function S(e,r){M(i,r.value+"\n")}function _(e,r){var n="";var t="";if(e.parent==null)p("Commands cannot be used in root");for(var a=0;a<r.value.length;a++){var u=L(r.value[a],e);if(u!=":"&&t!=""&t!=":")n+=" ";n+=u;t=u}var o=f&&f.length>0?f.join(""):"";M(i,o+n+"\n");return n}function P(e,r){var n="";r.prog.forEach(function(r){if(r.type=="command"){var t=L(r,e);n+=t+"\n"}else if(r.type=="return"){var a=L(r,e);n+=a}else L(r,e)});return n}function F(e,r){if(a)p("Cannot declare a function inside another");a=true;i=r.name;L(r.body,e.extend());i="";a=false}function J(e,r){if(a)p("Groups cannot be inside functions");u.push(r.name);L(r.body,e.extend());u.pop()}function U(e,r){if(e.parent!=null)p("Settings must be declared in the root");if(r.name=="namespace"){if(o&&o!="namespace")p("Cannot declare namespace more than once");if(o&&o=="_namespace")p("Please declare the namespace BEFORE writing any functions");o=r.value}else{p("No setting found with the name "+r.name)}}function M(e,r){if(!o)o="_namespace";if(!v[o])v[o]={_type:"namespace"};var n=v[o];if(u){u.forEach(function(e){if(!n[e])n[e]={_type:"group"};n=n[e]});if(n.hasOwnProperty(e)){n[e].value+=r}else{n[e]={_type:"function",value:r}}}else{if(n.hasOwnProperty(e)){n[e]+=r}else{n[e]={_type:"function",value:r}}}}function z(e){for(var r in e){if(e.hasOwnProperty(r))return false}return JSON.stringify(e)===JSON.stringify({})}function L(e,r){switch(e.type){case"num":case"bool":case"kw":return e.value;case"str":return w(r,e);case"eval":return L(e.value,r.extend());case"colon":return":";case"relative":return O(r,e);case"selector":return E(r,e);case"comma":return",";case"json":return A(r,e);case"reg":return d(r,e);case"comment":return S(r,e);case"command":return _(r,e);case"array":return C(r,e);case"ivar":return N(r,e);case"assign":return j(r,e);case"binary":return y(e.operator,L(e.left,r),L(e.right,r));case"macro":return g(r,e);case"return":return L(e.value,r);case"if":return m(r,e);case"for":return x(r,e);case"foreach":return k(r,e);case"execute":return b(r,e);case"function":return F(r,e);case"group":return J(r,e);case"setting":return U(r,e);case"prog":return P(r,e);case"call":var n=L(e.func,r);return n.apply(null,e.args.map(function(e){return L(e,r)}));default:p("Unable to evaluate "+e.type)}}}var a=["advancement","ban","blockdata","clear","clone","debug","defaultgamemode","deop","difficulty","effect","enchant","entitydata","execute","fill","function","gamemode","gamerule","give","help","kick","kill","list","locate","me","op","pardon","particle","playsound","publish","recipe","reload","replaceitem","save","say","scoreboard","seed","setblock","setidletimeout","setmaxplayers","setworldspawn","spawnpoint","spreadplayers","stats","stop","stopsound","summon","teleport","tell","tellraw","testfor","testforblock","testforblocks","time","title","toggledownfall","tp","transferserver","trigger","weather","whitelist","worldborder","wsserver","xp"];function u(e){var r=0,n=1,t=0,a=null,u=true;return{next:i,peek:l,eof:s,croak:c,last:o,lastWasNewLine:f};function i(){if(l()=="\n")u=true;else if("\r\t ".indexOf(l())==-1)u=false;a=l();var i=e.charAt(r++);if(i=="\n")n++,t=0;else t++;return i}function o(){return a}function f(){return u}function l(){return e.charAt(r)}function s(){return l()==""}function c(e){var r=e+" at ("+n+":"+t+")";console.error(r);throw new Error(r)}}function i(e){var r=null;var n=" function macro group if elseif else return execute true false var for foreach in ";var t=null;return{next:J,peek:P,eof:U,croak:e.croak,last:F};function a(e){return n.indexOf(" "+e+" ")>=0}function o(e){return/[0-9]/i.test(e)}function l(e){return/[a-z0-9_\$]/i.test(e)}function s(e){return l(e)}function c(e){return/\$[a-z0-9-_]/i.test(e)}function v(e){return"+-*/%^=&|<>!".indexOf(e)>=0}function p(e){return",;(){}[]".indexOf(e)>=0}function y(e){return" \t\n\r".indexOf(e)>=0}function h(r){var n="";while(!e.eof()&&r(e.peek())){n+=e.next()}return n}function g(){e.next();if(o(e.peek())){var r=d();r.value*=-1;return r}e.croak("Can't handle character: "+e.peek())}function d(){var e=false;var r=h(function(r){if(r=="."){if(e)return false;e=true;return true}return o(r)});return{type:"num",value:parseFloat(r)}}function m(){var e=h(s);var r;if(a(e))r="kw";else if(c(e))r="ivar";else r="reg";return{type:r,value:e}}function x(r){var n=false,t="";e.next();while(!e.eof()){var a=e.next();if(n){t+=a;n=false}else if(a=="\\"){n=true}else if(a==r){break}else{t+=a}}return t}function k(r){if(r.indexOf("`")>=0){var n=false,t=[],a="";var o=r.split("");for(var l=0;l<o.length;l++){var s=o[l];if(n){if(s=="`"){n=false;var c=f(i(u(a)));if(c.prog.length!=0){for(var v=0;v<c.prog.length;v++){if(c.prog[v].type=="comment"){e.croak("Comments are not allowed in evaluation blocks")}else if(c.prog[v].type=="function"){e.croak("Functions are not allowed in evaluation blocks")}else if(c.prog[v].type=="macro"){e.croak("Creating macros is not allowed in evaluation blocks")}}t.push(c)}a=""}else{a+=s;if(l==o.length-1){if(a)t.push({type:"str",value:a})}}}else{if(s=="`"){n=true;if(a)t.push({type:"str",value:a});a=""}else{a+=s;if(l==o.length-1){if(a)t.push({type:"str",value:a})}}}}return t}else{return r}}function b(){return{type:"str",value:k(x('"'))}}function w(){var r=e.lastWasNewLine();e.next();if(e.peek()=="!"){if(!r)e.croak('Settings with "@!" need to start at the begining of a line');return E()}else{return O()}}function O(){var e=h(function(e){return!y(e)&&e!=";"});return{type:"selector",value:"@"+e}}function E(){var e=h(function(e){return e!="\n"});return{type:"setting",value:e.replace("\r","")}}function C(){var e=h(function(e){return!y(e)&&e!=";"});return{type:"relative",value:e}}function N(){e.next();return{type:"colon"}}function j(){if(!e.lastWasNewLine())e.croak('Comments with "#" need to start at the begining of a line');var r=h(function(e){return e!="\n"});return{type:"comment",value:r.replace("\r","")}}function A(){h(function(e){return e!="\n"});e.next()}function S(){var r=h(function(e){return e=="/"});if(r=="//"){A()}else{e.next()}}function _(){h(y);if(e.eof())return null;var r=e.peek();if(r=="#"){return j()}if(r=="/"){S();return _()}if(r=="@")return w();if(r=='"')return b();if(r=="~")return C();if(r==":")return N();if(o(r))return d();if(l(r))return m();if(p(r))return{type:"punc",value:e.next()};if(v(r))return{type:"op",value:h(v)};e.croak("Can't handle character: "+r)}function P(){return r||(r=_())}function F(){return t}function J(){t=P();var e=r;r=null;return e||_()}function U(){return P()==null}}var o={type:"bool",value:false};function f(e){var r={"=":1,"||":2,"&&":3,"<":7,">":7,"<=":7,">=":7,"==":7,"!=":7,"+":10,"-":10,"*":20,"/":20,"%":20,"^":30};return D();function n(r){var n=e.peek();return n&&n.type=="punc"&&(!r||n.value==r)&&n}function t(r){var n=e.peek();return n&&n.type=="kw"&&(!r||n.value==r)&&n}function f(r){var n=e.peek();return n&&n.type=="op"&&(!r||n.value==r)&&n}function l(){var r=e.peek();return r&&r.type=="comment"}function s(){var r=e.peek();return r&&r.type=="reg"}function c(r){if(n(r))e.next();else e.croak('Expecting punctuation: "'+r+'"')}function v(r){if(l())J();e.next()}function p(r){if(t(r))e.next();else e.croak('Expecting keyword: "'+r+'"')}function y(r){if(f(r))e.next();else e.croak('Expecting operator: "'+r+'"')}function h(){if(n(",")){e.next();return{type:"comma"}}else e.croak('Expecting comma: "'+JSON.stringify(e.peek())+'"')}function g(){e.croak("Unexpected token: "+JSON.stringify(e.peek()))}function d(n,t){var a=f();if(a){var u=r[a.value];if(u>t){e.next();return d({type:a.value=="="?"assign":"binary",operator:a.value,left:n,right:d($(),u)},t)}}return n}function m(r,t,a,u){var i=[],o=true;c(r);while(!e.eof()){if(n(t))break;if(o)o=false;else if(B())c(a);if(n(t))break;i.push(u())}c(t);return i}function x(e){return{type:"call",func:e,args:m("(",")",",",H)}}function k(){var r=e.next();if(r.type!="ivar")e.croak("Expecting variable name");return r.value}function b(){p("if");var r=H();var n=H();var a={type:"if",cond:r,then:n};if(t("else")){e.next();a.else=H()}return a}function w(){p("var");return{type:"var",value:k()}}function O(){p("for");var e=m("(",")",";",H);var r=H();return{type:"for",params:e,then:r}}function E(){p("foreach");c("(");p("var");var e=P();p("in");var r=H();c(")");var n=H();return{type:"foreach",variable:e,param:r,then:n}}function C(){e.next();var r=e.next();if(e.peek().type=="colon"){var t={type:"command",value:[{type:"reg",value:"function"},r]};while(!e.eof()){if(e.peek().type=="kw")t.value.push(e.next());else t.value.push(H());if(n(";"))break;else if(e.eof())c(";")}return t}else{return{type:"function",name:r.value,body:H()}}}function N(){e.next();return{type:"group",name:e.next().value,body:H()}}function j(){e.next();return{type:"macro",name:e.next().value,vars:m("(",")",",",k),body:H()}}function A(){e.next();return{type:"return",value:H()}}function S(){e.next();var r={type:"execute",selector:"",pos:[]};var n=0;while(!e.eof()){if(n==5){break}else{var t=H();if(n==0)r.selector=t;else if(n>0&&n<4)r.pos.push(t);else if(n==4)r.prog=t;n++}}return r}function _(){return{type:"bool",value:e.next().value=="true"}}function P(){var r=e.next();if(n("[")){c("[");while(!e.eof()){if(n("]"))break;if(e.peek().type=="kw")g();r.index=H();if(n("]"))break;else e.croak('Expecting punctuation: "]"')}c("]")}return r}function F(){return{type:"array",value:m("[","]",",",function r(){var n=e.peek();if(n.type=="kw"&&n.value!="false"&&n.value!="true"&&n.value!="macro")g();else return H()})}}function J(){return{type:"comment",value:e.next().value}}function U(){var r=e.next().value.trim();var n=r.indexOf(":");if(n==-1)e.croak('Expecting separator: ":"');return{type:"setting",name:r.substring(r.indexOf("!")+1,n).trim(),value:r.substring(n+1).trim()}}function M(){var r=i(u(e.next().value.substring(1)));var n=[];while(!r.eof()){n.push(r.next())}return{type:"relative",value:n}}function z(){var r=e.next();var n=[];if(r.value.indexOf("[")>-1){var t=r.value.substring(3,r.value.length-1);var a=i(u(t));while(!a.eof()){n.push(a.next())}}return{type:"selector",prefix:r.value.substring(0,2),value:n}}var L;function W(){var r={type:"command",value:[]};if(a.includes(e.peek().value)){r.value.push(e.next());while(!e.eof()){var t=H();r.value.push(t);if(n(";"))break;else if(e.eof())c(";")}return r}else{return e.next()}}function G(){c("{");var r={},t=true;if(e.peek().type=="str"){r={type:"json",value:[]};while(!e.eof()){if(n("}"))break;if(t)t=false;else if(e.peek().type=="colon")t=true;else r.value.push(h());if(n("}"))break;r.value.push(H())}c("}");return r}else{r={type:"prog",prog:[]};while(!e.eof()){if(n("}"))break;if(t)t=false;else if(B())c(";");if(n("}"))break;r.prog.push(H())}c("}");if(r.prog.length==0)return o;if(r.prog.length==1)return r.prog[0];return r}}function R(e){e=e();return n("(")?x(e):e}function $(){return R(function(){if(n("(")){e.next();var r=H();c(")");return r}if(n("{"))return G();if(n("["))return F();if(t("if"))return b();if(t("var"))return w();if(t("true")||t("false"))return _();if(t("for"))return O();if(t("foreach"))return E();if(t("function"))return C();if(t("group"))return N();if(t("execute"))return S();if(t("macro"))return j();if(t("return"))return A();if(l())return J();if(e.peek().type=="reg")return W();if(e.peek().type=="setting")return U();if(e.peek().type=="ivar")return P();if(e.peek().type=="relative")return M();if(e.peek().type=="selector")return z();var a=e.next();if(a.type=="colon"||a.type=="num"||a.type=="str")return a;g()})}function B(){return!e.last()||e.last()&&e.last().type!="comment"&&e.last().type!="setting"}function D(){var r=[];while(!e.eof()){r.push(H());if(l()){r.push(J())}else if(!e.eof()&&B())c(";")}return{type:"prog",prog:r}}function H(){return R(function(){return d($(),0)})}}function l(e,r,n){var t=[];var a;if(arguments.length===1){for(var u=0;u<e;u++){t[u]=u+1}}else{if(arguments.length===2){a=r-e;for(var u=0;u<=a;u++){t.push(u+e)}}else{a=Math.floor((r-e)/n);for(var u=0;u<=a;u++){t.push(u*n+e)}}}return t}var s=f(i(u(r)));var c=t(s);return c};e.help=function e(){console.log([" mcs"," A pre-processor to write Minecraft Functions more efficiently",""," Usage:"," var output = mcs(input) - Converts MCS language into an object of function files",""," Check the GitHub repository for more info: https://github.com/PandawanFr/mcs"])};return e}();if(typeof module!=="undefined"&&typeof module.exports!=="undefined"){module.exports=e}else{if(typeof define==="function"&&define.amd){define([],function(){return e})}else{window.mcs=e}}})();