forked from sent/waves
141 lines
2.8 KiB
JavaScript
141 lines
2.8 KiB
JavaScript
var pgli = pgli || {};
|
|
pgli.lang = pgli.lang || {};
|
|
|
|
pgli.lang.Parser = gamecore.Base.extend('Parser',
|
|
{
|
|
|
|
xStruct: {
|
|
"scale": 0,
|
|
"x": 1,
|
|
"y": 2,
|
|
"width": 3,
|
|
"height": 4
|
|
},
|
|
|
|
|
|
patternVar:/\@(\w+)/g,
|
|
patternMethod: /\#(\w+)(\(([^\)]+)\))/g,
|
|
|
|
debug: 1,
|
|
|
|
|
|
parseExpression: function(string, scope, xform)
|
|
{
|
|
static = pgli.lang.Parser;
|
|
|
|
var self = this;
|
|
var orig = string;
|
|
var s = (scope !== null && typeof(scope) !== "undefined")
|
|
var x = (xform !== null && typeof(xform) !== "undefined" && xform.length > 0)
|
|
|
|
if(typeof(string) != "string")
|
|
return string;
|
|
|
|
if(scope != undefined)
|
|
{
|
|
string = string.replace(this.patternVar,function(match,varName)
|
|
{
|
|
if(x && varName in static.xStruct)
|
|
return xform[static.xStruct[varName]];
|
|
else if(s && varName in scope)
|
|
return scope[varName]
|
|
else
|
|
return 0
|
|
});
|
|
}
|
|
|
|
string = string.replace(this.patternMethod,function(match,methodName,a,params)
|
|
{
|
|
if(self.debug < 2) console.log(arguments);
|
|
return self.execFunction(methodName, params);
|
|
});
|
|
|
|
if(self.debug < 2) console.log("#Parsed expr: '"+string+"' from '"+orig+"'");
|
|
|
|
try {
|
|
return eval(string);
|
|
} catch (e) {
|
|
return string;
|
|
}
|
|
|
|
|
|
},
|
|
|
|
parseRepeat: function(string, scope)
|
|
{
|
|
var items = string.split(" ");
|
|
|
|
if(items.length != 4)
|
|
throw "Syntax error in repeat expression";
|
|
|
|
if(self.debug < 2) console.warn(items[0].substr(1))
|
|
if(self.debug < 2) console.warn(Number(this.parseExpression(items[1], scope)))
|
|
if(self.debug < 2) console.warn(items[2])
|
|
if(self.debug < 2) console.warn(Number(this.parseExpression(items[3], scope)))
|
|
|
|
return new pgli.lang.Iterator(
|
|
items[0].substr(1),
|
|
Number(this.parseExpression(items[1], scope)),
|
|
items[2],
|
|
Number(this.parseExpression(items[3], scope))
|
|
);
|
|
},
|
|
|
|
parseModule: function(string)
|
|
{
|
|
try
|
|
{
|
|
return JSON.parse(string);
|
|
}
|
|
catch(e)
|
|
{
|
|
trace("(!) Syntax error in module.");
|
|
return {error:"unable to parse module"};
|
|
}
|
|
},
|
|
|
|
execFunction: function(methodName, params)
|
|
{
|
|
var hasP = params != undefined;
|
|
var p = hasP ? params.replace(" ", "").split(',') : [];
|
|
|
|
if(methodName == "random")
|
|
{
|
|
var r = Math.random();
|
|
if(hasP && p.length == 2) try
|
|
{
|
|
var min = eval(p[0]);
|
|
var max = eval(p[1]);
|
|
r = Math.round(r * (max-min) + min);
|
|
} catch(e) {
|
|
console.warn('Bad method format: '+methodName+' / '+params);
|
|
return 0;
|
|
}
|
|
return r;
|
|
}
|
|
else if(methodName == "mod")
|
|
{
|
|
if(hasP && p.length == 2) try
|
|
{
|
|
var base = eval(p[0]);
|
|
var div = eval(p[1]);
|
|
if(div == 0) throw "Divide by 0";
|
|
return Math.floor(base/div);
|
|
} catch(e) {
|
|
console.warn('Bad method format: '+methodName+' / '+params);
|
|
}
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
console.warn("Unsupported method : "+methodName);
|
|
return 0;
|
|
}
|
|
}
|
|
},
|
|
{
|
|
|
|
});
|
|
|
|
|