1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-06-12 18:42:14 +00:00
8bitworkshop/src/common/basic/run.ts

85 lines
2.2 KiB
TypeScript
Raw Normal View History

2020-08-05 04:48:29 +00:00
import { BASICParser, DIALECTS } from "./compiler";
2020-08-05 04:48:29 +00:00
import { BASICRuntime } from "./runtime";
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false,
crlfDelay: Infinity,
2020-08-05 04:48:29 +00:00
});
var inputlines = [];
rl.on('line', (line) => {
//console.log(`Line from file: ${line}`);
inputlines.push(line);
});
var fs = require('fs');
2020-08-05 04:48:29 +00:00
var parser = new BASICParser();
var runtime = new BASICRuntime();
// parse args
var filename = '/dev/stdin';
var args = process.argv.slice(2);
for (var i=0; i<args.length; i++) {
if (args[i] == '-v')
runtime.trace = true;
else if (args[i] == '-d')
parser.opts = DIALECTS[args[++i]] || Error('no such dialect');
else
filename = args[i];
}
// parse file
2020-08-05 04:48:29 +00:00
var data = fs.readFileSync(filename, 'utf-8');
try {
var pgm = parser.parseFile(data, filename);
} catch (e) {
if (parser.errors.length == 0)
console.log("@@@ " + e.msg);
else
console.log(e);
2020-08-05 04:48:29 +00:00
}
parser.errors.forEach((err) => console.log("@@@ " + err.msg));
if (parser.errors.length) process.exit(2);
2020-08-05 04:48:29 +00:00
// run program
2020-08-05 04:48:29 +00:00
runtime.load(pgm);
runtime.reset();
runtime.print = (s:string) => {
fs.writeSync(1, s+"");
}
runtime.input = async (prompt:string) => {
return new Promise( (resolve, reject) => {
function answered(answer) {
2020-08-05 04:48:29 +00:00
var vals = answer.toUpperCase().split(',');
console.log(">>>",vals);
2020-08-05 04:48:29 +00:00
resolve(vals);
}
fs.writeSync(1, prompt+"?");
if (inputlines.length) {
answered(inputlines.shift());
} else rl.question(prompt, (answer) => {
answered(answer);
2020-08-05 04:48:29 +00:00
});
});
}
runtime.resume = function() {
process.nextTick(() => {
try {
if (runtime.step()) {
if (runtime.running) runtime.resume();
} else if (runtime.exited) {
console.log("*** PROGRAM EXITED ***");
process.exit(0);
2020-08-05 04:48:29 +00:00
}
} catch (e) {
console.log(`### ${e.message} (line ${runtime.getCurrentSourceLocation().label})`);
process.exit(1);
2020-08-05 04:48:29 +00:00
}
});
}
runtime.resume();