Files
LAFF/PictureFLAME/parse_code.js
Julien Lengrand-Lambert d4dce71599 Create repo
2018-05-02 09:13:08 +02:00

188 lines
4.9 KiB
JavaScript
Executable File

function parse_fn(stmt){
var paramExpr = /\(.*\)/gi;
var fnNameExpr = /laff\.[^\(]+/gi;
var fnName = fnNameExpr.exec(stmt);
var oprds = new Array();
if (fnName){
//there exist a laff function
//get name
fnName = fnName[0];
//get parameters
var params = paramExpr.exec(stmt)[0];
var paramList = params.split(',');
//remove ( and ) from the first and last param
paramList[0] = paramList[0].substr(1);
paramList[paramList.length-1] = paramList[paramList.length-1].substr(0,paramList[paramList.length-1].length-1);
//parse arguments
for (var i = 0; i != paramList.length; ++i)
oprds.push(parse_oprd(paramList[i]));
}
return {fn:fnName, args:oprds}
}
function parse_stmt(stmt){
//remove ending ; and empty spaces
stmt = stmt.replace(';','').replace(/\s+/g, '');
var operators = /[=]/gim;
var exprs = stmt.split(operators);
// var fns = new Array();
var rtn;
switch (exprs.length){
case 1: //blas like function call
rtn = parse_fn(stmt);
break;
case 2:
//A = f() or A=B
new_stmt = exprs[1].replace("_", ".");
if (exprs[1].substr(0, 4) == 'laff'){
//A = f()
rtn = parse_fn(new_stmt);
//check if we need to add the additional operand from the lhs
output = parse_oprd(exprs[0]);
if (rtn.args[rtn.args.length-1].op != output.op){
rtn.args.push(output);
}
}
else{
alert("Please use the laff functions\n");
}
break;
default:
alert("Unable to parse code\n")
break;
}
return rtn;
}
function parse_oprd(oprd){
//remove transpose
oprd = oprd.replace(/t$/gi,'');
var comdExpr = /\'.*\'/gi;
if (Number(oprd).toString() == oprd ||
Number(oprd).toString()+".0" == oprd){
return {op:'',subregion:oprd}
}
else if (comdExpr.exec(oprd)){
return {op:'', subregion:oprd}
}
else{
var name = oprd.match(/[A-z]+/gi)[0];
var anyIndex = oprd.match(/[012]+/gi);
var index = null;
if (anyIndex)
index = anyIndex[0];
return {op:name, subregion:index};
}
}
function parse_fn_header(fnHeader){
var fnNameExpr = /([A-z_]+[_A-z0-9]*\s*)\(/g;
var fnName = fnNameExpr.exec(fnHeader)[0].replace(/\s/g,'');
var fnParamsExpr = /\((.|\s)*\)/gm;
var params = fnParamsExpr.exec(fnHeader)[0].replace(/\s/g,'');
params = params.substring(1,params.length-1);
var blked_alg = params.search(/nb_alg/gi);
if (blked_alg != -1)
params.replace(",nb_alg", '');
return {name: fnName.substring(0,fnName.length-1),
blocked: (blked_alg==-1),
operands: params.split(',')};
}
function parse(code){
//parse input file
//remove comments
var newCode = code.replace(/\%.*\n/g, '');
if (DEFAULT_MODE == 2){
newCode = code.replace(/\#.*\n/g,'');
newCode = newCode.replace('import flame','');
}
//remove empty lines
newCode = newCode.replace(/\s*\n+/g,'\n');
//function header
var fnHeaderExpr = /^\s*function(.*)/m;
if (DEFAULT_MODE == 2)
fnHeaderExpr = /^\s*def(.*)/m;
var fnHeader = fnHeaderExpr.exec(newCode)[0];
newCode = newCode.replace(fnHeaderExpr, '');
//identify loop
var loopExpr = /\s*while(\s|\S)*end/m;
if (DEFAULT_MODE == 2)
loopExpr = /\s*while((\s|\S)(?!flame\.merge))*/gm;
var loop = loopExpr.exec(newCode)[0];
var headerExpr = /\s*while(.*)/;
if (DEFAULT_MODE == 2)
headerExpr = /\s*while.*:/;
var header = headerExpr.exec(loop);
loop = loop.replace(header[0],'');
var footerExpr = /\s*end/gmi;
var footer = footerExpr.exec(loop);
if (DEFAULT_MODE == 2)
footer = [""];
if (DEFAULT_MODE == 1)
loop = loop.replace(/end$/gim,'');
var codeParts = newCode.split(loopExpr);
//identify statements
var stmtExpr= /[^;]+;/gm;
if (DEFAULT_MODE == 2)
stmtExpr = /[^)]*\)/gm;
//initialization
var codeStmts = codeParts[0].match(stmtExpr);
var loopHeadPos = codeStmts.length;
// loop header
codeStmts.push(header[0]);
//looped statment
codeStmts = codeStmts.concat(loop.match(stmtExpr));
var loopFootPos = codeStmts.length;
// loop end
codeStmts.push(footer[0]);
//clean up
// codeStmts = codeStmts.concat(codeParts[1].match(stmtExpr));
return {fn:fnHeader, code:codeStmts,
head:loopHeadPos, foot:loopFootPos};
}