Skip to content

Commit 82ad37e

Browse files
committed
Merge branch 'master'
1 parent 080c0ac commit 82ad37e

File tree

4 files changed

+168
-151
lines changed

4 files changed

+168
-151
lines changed

examples/scripts/forEach.mcscript

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#file: ./foreach
22
# basic loop
3-
forEach(var i = 0; i < 10; i++){
3+
forEach(var i = -5; i < 5; i++){
44
/say hey
55
}
66

lib/generator.js

Lines changed: 91 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -991,112 +991,115 @@ exports.getAst = function (ast, oldFile) {
991991
});
992992
};
993993
const parseCode = function (ast, oldFile, preOptions = null) {
994-
if (preOptions) {
995-
vars = vars.concat(preOptions.vars.filter((x) => vars.indexOf(x) === -1));
994+
return new Promise(function (resolve, reject) {
995+
if (preOptions) {
996+
vars = vars.concat(preOptions.vars.filter((x) => vars.indexOf(x) === -1));
996997

997-
modals = modals.concat(
998-
preOptions.modals.filter((x) => modals.indexOf(x) === -1)
999-
);
998+
modals = modals.concat(
999+
preOptions.modals.filter((x) => modals.indexOf(x) === -1)
1000+
);
10001001

1001-
tags = tags.concat(preOptions.tags.filter((x) => tags.indexOf(x) === -1));
1002+
tags = tags.concat(preOptions.tags.filter((x) => tags.indexOf(x) === -1));
10021003

1003-
consts = consts.concat(
1004-
preOptions.consts.filter((x) => consts.indexOf(x) === -1)
1005-
);
1006-
}
1007-
if (oldFile.split(".").slice(-2).join(".") === "gl.mcscript")
1008-
oldFile = oldFile.replace("gl.", "");
1009-
oldFile = oldFile.replace(/scripts\//, "functions/");
1010-
// let stream = InputStream(str)
1011-
// let output = TokenStream(stream)
1012-
// let ast = parse(output)
1013-
// console.log(JSON.stringify(ast))
1014-
let prjPath = oldFile.split("/").indexOf("functions");
1015-
let prjName = "noname";
1016-
if (prjPath > -1) {
1017-
prjName = oldFile.split("/")[prjPath - 1];
1018-
prjPath = oldFile
1019-
.split("/")
1020-
.slice(0, prjPath + 1)
1021-
.join("/")
1022-
.replace(".//", "");
1023-
} else {
1024-
prjPath = ".";
1025-
}
1026-
let data = generate(ast, oldFile, prjPath, prjName);
1027-
if (
1028-
oldFile.split("/").splice(-2).join("/") === "functions/load.mcscript" ||
1029-
oldFile.split("/").splice(-2).join("/") === "scripts/load.mcscript"
1030-
) {
1031-
data =
1032-
"#file: ./mcscript/load\n#file: ./load\nfunction " +
1033-
prjName +
1034-
":mcscript/load" +
1035-
"\n" +
1036-
data.replace("#file: ./load", "");
1037-
if (tags.length)
1038-
data +=
1039-
"\nexecute unless entity @e[tag=mcscriptTags] at @p run summon armor_stand ~ ~ ~ {Tags:[mcscriptTags],Invisible:1,Invulnerable:1,NoGravity:1}";
1040-
}
1041-
let savedData = data;
1042-
let extendArr = [];
1043-
data = data.split("#file: ");
1044-
for (let datChunk of data) {
1045-
let extended = datChunk.split("#extend: ");
1046-
if (extended.length > 1) {
1047-
extendArr = extended.slice(1);
1048-
data[data.indexOf(datChunk)] = extended[0];
1049-
}
1050-
}
1051-
checkFilename(data, oldFile, function (file, dat) {
1052-
dat =
1053-
"#######\n# Compiled from " +
1054-
oldFile.split("/").splice(-4).join("/") +
1055-
"\n# to " +
1056-
file.split("\\").splice(-4).join("/") +
1057-
".mcfunction\n#\n# Generated by Minecraft Script for 1.13\n######\n" +
1058-
dat.join("\n");
1059-
1060-
ensureDirectoryExistence(file);
1061-
fs.writeFile(file + ".mcfunction", dat, (err) => {
1062-
if (err) throw err;
1063-
console.log(
1064-
"\x1b[36m",
1065-
"Generated ",
1066-
"\x1b[33m",
1067-
file + ".mcfunction",
1068-
"\x1b[0m"
1004+
consts = consts.concat(
1005+
preOptions.consts.filter((x) => consts.indexOf(x) === -1)
10691006
);
1070-
});
1071-
});
1072-
1073-
// extend file
1074-
extendArr.push("");
1075-
checkFilename(
1076-
extendArr,
1077-
oldFile,
1078-
function (file, dat) {
1007+
}
1008+
if (oldFile.split(".").slice(-2).join(".") === "gl.mcscript")
1009+
oldFile = oldFile.replace("gl.", "");
1010+
oldFile = oldFile.replace(/scripts\//, "functions/");
1011+
// let stream = InputStream(str)
1012+
// let output = TokenStream(stream)
1013+
// let ast = parse(output)
1014+
// console.log(JSON.stringify(ast))
1015+
let prjPath = oldFile.split("/").indexOf("functions");
1016+
let prjName = "noname";
1017+
if (prjPath > -1) {
1018+
prjName = oldFile.split("/")[prjPath - 1];
1019+
prjPath = oldFile
1020+
.split("/")
1021+
.slice(0, prjPath + 1)
1022+
.join("/")
1023+
.replace(".//", "");
1024+
} else {
1025+
prjPath = ".";
1026+
}
1027+
let data = generate(ast, oldFile, prjPath, prjName);
1028+
if (
1029+
oldFile.split("/").splice(-2).join("/") === "functions/load.mcscript" ||
1030+
oldFile.split("/").splice(-2).join("/") === "scripts/load.mcscript"
1031+
) {
1032+
data =
1033+
"#file: ./mcscript/load\n#file: ./load\nfunction " +
1034+
prjName +
1035+
":mcscript/load" +
1036+
"\n" +
1037+
data.replace("#file: ./load", "");
1038+
if (tags.length)
1039+
data +=
1040+
"\nexecute unless entity @e[tag=mcscriptTags] at @p run summon armor_stand ~ ~ ~ {Tags:[mcscriptTags],Invisible:1,Invulnerable:1,NoGravity:1}";
1041+
}
1042+
let savedData = data;
1043+
let extendArr = [];
1044+
data = data.split("#file: ");
1045+
for (let datChunk of data) {
1046+
let extended = datChunk.split("#extend: ");
1047+
if (extended.length > 1) {
1048+
extendArr = extended.slice(1);
1049+
data[data.indexOf(datChunk)] = extended[0];
1050+
}
1051+
}
1052+
checkFilename(data, oldFile, function (file, dat) {
10791053
dat =
1080-
"\n# Extended from " +
1054+
"#######\n# Compiled from " +
10811055
oldFile.split("/").splice(-4).join("/") +
10821056
"\n# to " +
10831057
file.split("\\").splice(-4).join("/") +
1084-
".mcfunction\n" +
1058+
".mcfunction\n#\n# Generated by Minecraft Script for 1.13\n######\n" +
10851059
dat.join("\n");
1060+
10861061
ensureDirectoryExistence(file);
1087-
fs.appendFile(file + ".mcfunction", dat, (err) => {
1062+
fs.writeFile(file + ".mcfunction", dat, (err) => {
10881063
if (err) throw err;
10891064
console.log(
10901065
"\x1b[36m",
1091-
"Extended ",
1066+
"Generated ",
10921067
"\x1b[33m",
10931068
file + ".mcfunction",
10941069
"\x1b[0m"
10951070
);
1071+
resolve();
10961072
});
1097-
},
1098-
true
1099-
);
1073+
});
1074+
1075+
// extend file
1076+
extendArr.push("");
1077+
checkFilename(
1078+
extendArr,
1079+
oldFile,
1080+
function (file, dat) {
1081+
dat =
1082+
"\n# Extended from " +
1083+
oldFile.split("/").splice(-4).join("/") +
1084+
"\n# to " +
1085+
file.split("\\").splice(-4).join("/") +
1086+
".mcfunction\n" +
1087+
dat.join("\n");
1088+
ensureDirectoryExistence(file);
1089+
fs.appendFile(file + ".mcfunction", dat, (err) => {
1090+
if (err) throw err;
1091+
console.log(
1092+
"\x1b[36m",
1093+
"Extended ",
1094+
"\x1b[33m",
1095+
file + ".mcfunction",
1096+
"\x1b[0m"
1097+
);
1098+
});
1099+
},
1100+
true
1101+
);
1102+
});
11001103
};
11011104
exports.parseCode = parseCode;
11021105
// only node.js

lib/index.js

Lines changed: 69 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,51 @@ const consoletheme = require("./consoletheme.js");
77

88
let preOptions;
99
const compile = function (path, fullErr) {
10-
11-
let num = 1;
12-
gen.clearVars();
13-
if (fs.lstatSync(path).isFile()) {
14-
15-
readFile(path);
16-
console.log(consoletheme.FgGreen, "Read " + num + " Files and compiled successfully", consoletheme.Reset);
17-
18-
} else {
19-
20-
if (fs.existsSync(path + "/mcscript")) gen.getFiles(path + "/mcscript", "mcfunction").forEach((item) => {
21-
fs.unlink(item, () => false);
22-
});
23-
24-
preOptions = {
25-
vars: [],
26-
modals: [],
27-
tags: [],
28-
consts: []
29-
};
30-
let files = gen.getFiles(path);
31-
let globals = files.filter(x => {
32-
if (x.split(".").slice(-2).join(".") === 'gl.mcscript') {
33-
files.splice(files.indexOf(x), 1);
34-
return true
10+
return new Promise(function (resolve, reject) {
11+
let num = 1;
12+
gen.clearVars();
13+
if (fs.lstatSync(path).isFile()) {
14+
15+
readFile(path).then(resolve);
16+
console.log(consoletheme.FgGreen, "Read " + num + " Files and compiled successfully", consoletheme.Reset);
17+
18+
} else {
19+
20+
if (fs.existsSync(path + "/mcscript")) gen.getFiles(path + "/mcscript", "mcfunction").forEach((item) => {
21+
fs.unlink(item, () => false);
22+
});
23+
24+
preOptions = {
25+
vars: [],
26+
modals: [],
27+
tags: [],
28+
consts: []
29+
};
30+
let files = gen.getFiles(path);
31+
let globals = files.filter(x => {
32+
if (x.split(".").slice(-2).join(".") === 'gl.mcscript') {
33+
files.splice(files.indexOf(x), 1);
34+
return true
35+
}
36+
return false
37+
});
38+
39+
let promises = [];
40+
41+
for (let file of globals) {
42+
promises.push(readFile(file, {noParse: 'vars', fullErr: fullErr}));
43+
}
44+
for (let file of files) {
45+
num++;
46+
promises.push(readFile(file, {fullErr: fullErr}));
3547
}
36-
return false
37-
});
38-
for (let file of globals) {
39-
readFile(file, {noParse: 'vars', fullErr: fullErr});
40-
}
41-
for (let file of files) {
42-
num++;
43-
readFile(file, {fullErr: fullErr});
44-
}
4548

46-
console.log(consoletheme.FgGreen, "Read " + num + " Files and compiled successfully", consoletheme.Reset);
47-
}
49+
Promise.all(promises).then(()=>{
50+
console.log(consoletheme.FgGreen, "Read " + num + " Files and compiled successfully", consoletheme.Reset);
51+
resolve()
52+
})
53+
}
54+
})
4855
};
4956

5057
function changeOptions(opt) {
@@ -87,36 +94,36 @@ const watch = function (path, fullErr) {
8794
};
8895

8996
function readFile(file, options = {}) {
97+
return new Promise(function (resolve, reject) {
98+
fs.readFile(file, {encoding: "utf8"}, function (err, data) {
9099

91-
fs.readFile(file, {encoding: "utf8"}, function (err, data) {
92-
93-
data = data.split("\n");
94-
for (let item of data) {
100+
data = data.split("\n");
101+
for (let item of data) {
95102

96-
if (item.trim() === "{")
97-
data[data.indexOf(item) - 1] = data[data.indexOf(item) - 1].substr(0, data[data.indexOf(item) - 1].length - 2);
103+
if (item.trim() === "{")
104+
data[data.indexOf(item) - 1] = data[data.indexOf(item) - 1].substr(0, data[data.indexOf(item) - 1].length - 2);
98105

99-
if (",;({[".indexOf(item.trim().slice(-1)) === -1)
100-
data[data.indexOf(item)] += ";"
101-
102-
}
103-
data = data.join("\n");
104-
if (options.noParse === "modal") gen.getModals(parser.parse(lexer.lexer(data)), file);
105-
else if (options.noParse === "json") gen.getAst(parser.parse(lexer.lexer(data)), file);
106-
else if (options.noParse === "vars") changeOptions(gen.getVars(parser.parse(lexer.lexer(data)), file, preOptions));
107-
else
108-
try {
109-
gen.parseCode(parser.parse(lexer.lexer(data, file)), file, preOptions)
110-
} catch (err) {
111-
if (err.message && err.message.substr(0, 7) === "[Debug]") {
112-
console.log(err.message);
113-
let oldMess = err.message.split(" ")[0].substr(7);
114-
err.message = err.message.split(" ").slice(1).join(" ");
115-
console.log(consoletheme.FgRed, "[Debugger]", consoletheme.FgCyan, oldMess, consoletheme.FgWhite, err, consoletheme.Reset,);
116-
} else if (!options.fullErr) console.log(consoletheme.FgRed, "[Error]", err.message, "\n\n " + file + " was not compiled!", consoletheme.Reset);
117-
else console.log(err);
106+
if (",;({[".indexOf(item.trim().slice(-1)) === -1)
107+
data[data.indexOf(item)] += ";"
118108
}
119-
});
109+
data = data.join("\n");
110+
if (options.noParse === "modal") gen.getModals(parser.parse(lexer.lexer(data)), file);
111+
else if (options.noParse === "json") gen.getAst(parser.parse(lexer.lexer(data)), file);
112+
else if (options.noParse === "vars") changeOptions(gen.getVars(parser.parse(lexer.lexer(data)), file, preOptions));
113+
else
114+
try {
115+
gen.parseCode(parser.parse(lexer.lexer(data, file)), file, preOptions).then(resolve)
116+
} catch (err) {
117+
if (err.message && err.message.substr(0, 7) === "[Debug]") {
118+
console.log(err.message);
119+
let oldMess = err.message.split(" ")[0].substr(7);
120+
err.message = err.message.split(" ").slice(1).join(" ");
121+
console.log(consoletheme.FgRed, "[Debugger]", consoletheme.FgCyan, oldMess, consoletheme.FgWhite, err, consoletheme.Reset,);
122+
} else if (!options.fullErr) console.log(consoletheme.FgRed, "[Error]", err.message || err, "\n\n " + file + " was not compiled!", consoletheme.Reset);
123+
else console.log(err);
124+
}
125+
});
126+
})
120127
}
121128

122129
exports.compile = compile;

lib/parser.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,13 @@ exports.parse = function (input) {
775775

776776
return tok;
777777
}
778+
if (tok.type == "op" && tok.value == "-") {
779+
let num = input.next()
780+
if(num.type != "num") {
781+
unexpected()
782+
}
783+
tok = { type: "num", value: -num.value }
784+
}
778785
if (tok.type == "num" || tok.type == "str") return tok;
779786

780787
unexpected();

0 commit comments

Comments
 (0)