mlpfim-programming-language
Version:
A programming for the Brony programmers
247 lines (177 loc) • 7.19 kB
JavaScript
var fs = require("fs"),
path = require("path"),
stdin = process.openStdin(),
terminal = require("child_process").exec
;
module.exports = {
running: false,
main: function (l) {
try{
var config = fs.readFileSync(process.cwd() + "/mlpfimconfig.json").toString();
config = JSON.parse(config);
if(config.dev === true){
// listen for process end and report the run timmer
var timmer = 0;
setInterval(function () {
timmer += 100;
},100);
process.on("exit",function () {
console.log("");
console.log("=== Process End === ");
console.log(`The time you run this program: ${timmer}ms(${timmer / 1000}s)`);
process.exit();
});
}
if(typeof l == "undefined"){
// Default
for(var i = 0; i < code.length - 1; i++){
require("./interperter").runCode(code[i].trim(),i);
}
}else{
// Run line
for(var i = l + 1; i < code.length - 1; i++){
require("./interperter").runCode(code[i].trim(),i);
}
}
}catch (e){
if(e.message.includes("no such file")){
fs.writeFileSync(process.cwd() + "/mlpfimconfig.json","{\n \"dev\": false\n}");
require("./interperter").main();
}
}
},
runCode: function (code,line) {
var keyword = code.split(" ")[0];
if(typeof quiteWhenError == "undefined"){
quiteWhenError = true;
}else{
quiteWhenError = quiteWhenError;
}
if(!require("./interperter").running){
// create variable (module)
if(keyword.includes("let") && !keyword.includes("//")){
require("./interperter").running = true;
require("./buildfun/let").let(code,keyword);
require("./interperter").running = false;
}
// basic output (module)
else if(keyword.includes("dearPC") && !keyword.includes("//")){
require("./interperter").running = true;
require("./buildfun/dearPC").dearPC(code,keyword);
require("./interperter").running = false;
}
// basic input (module)
else if(keyword.includes("spike") && !keyword.includes("//")){
require("./buildfun/spike").spike(code,line);
require("./interperter").running = true;
}
// exit the program itself
else if(keyword.includes("exit") && !keyword.includes("//")){
process.exit();
}
// commenting
else if(keyword.includes("//")){
return true;
require("./interperter").running = false;
process.exit();
require("./interperter").main(line++);
}
// if else (module)
else if(keyword.includes("if") && !keyword.includes("//")){
require("./buildfun/if").if(code,keyword,line);
}
// for loop(module)
else if(keyword.includes("for") && !keyword.includes("//")){
require("./buildfun/for").for(code,keyword);
}
// include other MLP source file (module)
else if(keyword.includes("include") && !keyword.includes("//")){
require("./buildfun/include").include(code,keyword,line);
}
// while loop (module)
else if(keyword.includes("while") && !keyword.includes("//")){
require("./buildfun/while").while(code,keyword);
}
// the file object(module)
else if(keyword.includes("filesystem") && !keyword.includes("//")){
require("./buildfun/filesystem").filesystem(code,keyword,line);
}
// skip code
else if(keyword == "skip" && !keyword.includes("//")){
require("./interperter").main( (line + 1) );
}
// the network object
else if(keyword.includes("network") && !keyword.includes("//")){
require("./buildfun/network").network(code,keyword,line);
}
// terminal command support
else if(keyword.includes("system") && !keyword.includes("//")){
require("./buildfun/system").system(code,keyword,line);
}
// convert string to JSON
else if(keyword == "JSON" && !keyword.includes("//")){
require("./buildfun/JSON").JSON(code,keyword,line);
}
// plugin
else if(keyword.includes("plugin") && !keyword.includes("//")){
if(plugin === false){
console.log("Plugin is disabled");
process.exit();
}else{
require("./buildfun/plugin").plugin(code,keyword,line);
}
}
// handling error
else{
require("./interperter").echoError("I just don't know what when wrong?",line)
}
}
},
echoError: function (message,line) {
line = (line + 1);
console.log("== ERROR ==");
console.log(message);
if(!line <= 0){
console.log("Error line:" + line);
}
console.log("====");
process.exit();
}
};
process.stdin.resume();
process.stdin.setEncoding('utf8');
// looping up for source files
var sourcefile = process.argv[2];
// MLP Shell
if(typeof process.argv[2] == "undefined"){
console.log("== MLP Shell ==");
console.log("== .exit to quite ==");
process.stdin.on("data",function(chunk) {
var code = chunk.toString().trim();
if(code == ".exit"){
process.exit();
}
require("./interperter").runCode(code, -1, false);
});
return false;
}
if( process.argv[2].includes(".mlp") || process.argv[2].includes(".mlpfim")){
// MLP source file
try{
var code = fs.readFileSync(process.cwd() + "/" + sourcefile).toString() + "\nexit;";
// Remove all the comment
code = code
.split(/`.*`/g).join("//SYSTEM_COMMENT;")
;
code = code.split(";");
require("./interperter").main();
}catch (e){
if(e.message.includes("no such file")){
require("./interperter").echoError("Can't not find the correct source file", line);
}
}
}else{
console.log("The interpreter won't run a source file without .mlp or .mlpfim extension");
process.exit();
}