-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
51 lines (42 loc) · 1.91 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env node
import tokenize from "./src/lex.js";
import Parser from "./src/parser.js";
import Preprocessor from "./src/preprocess.js";
import { readFileSync, writeFileSync } from "fs";
import { run_command } from "./src/utils.js";
import { ArgumentParser } from "argparse";
import { fileURLToPath } from 'url';
import path from "path";
import process from "process";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const parser = new ArgumentParser({
description: "The Official Gerbile Compiler OwO"
});
parser.add_argument("-v", "--version", { action: "version", version: "1.0.0" });
parser.add_argument("-t", "--show-tokens", { action: "store_true", dest: "tokens", help: "Output tokens generated by lexer"});
parser.add_argument("-a", "--show-asm", { action: "store_true", dest: "asm", help: "Output assembly generated by parser"});
parser.add_argument("-r", "--run", { action: "store_true", dest: "run", help: "Run executable after compilation"});
parser.add_argument("SRC_FILE", {help: "Path to source file"});
parser.add_argument("OUT_FILE", {help: "Path to output final executable"});
let args = parser.parse_args();
let text = readFileSync(args.SRC_FILE, {encoding:"utf8", flag:"r"}, (err, data) => {
if (err) console.error(err);
})
let toks = tokenize(path.normalize(args.SRC_FILE), text);
if (args.tokens) console.log(toks);
let preproc = new Preprocessor(__dirname);
toks = preproc.process(toks, args.SRC_FILE);
let asm_gen = new Parser(__dirname);
let asm = asm_gen.generate(toks, args.SRC_FILE);
if (args.asm) console.log(asm);
writeFileSync(`${args.SRC_FILE}.asm`, asm, (err) => {
if (err) console.error(err);
});
let exit_code = run_command("fasm", [`${args.SRC_FILE}.asm`, args.OUT_FILE]);
if (exit_code === 0) {
exit_code = run_command("chmod", ["+x", args.OUT_FILE]);
}
if (args.run && exit_code === 0) {
run_command(`./${args.OUT_FILE}`, [], {code: true});
}