1
0
mirror of https://github.com/Baidicoot/rpncalc-v4 synced 2024-06-15 01:29:58 +00:00
rpncalc-v4/new/main.js

52 lines
1.5 KiB
JavaScript
Raw Normal View History

2020-06-01 08:59:16 +00:00
import {execRPN} from './shiny.mjs';
2020-05-30 19:05:05 +00:00
import {parseExprs} from './parse.mjs';
import {tokenize} from './token.mjs';
import {scope, customHandler} from './builtin.mjs';
2020-05-30 19:05:05 +00:00
const inbox = document.getElementById("inbox")
const outbox = document.getElementById("outbox")
const submit = document.getElementById("submit")
const show = (elem) => {
if (elem.type === "pair") {
2020-05-30 19:05:05 +00:00
return "{" + show(elem.val.fst) + ", " + show(elem.val.snd) + "}"
} else if (elem.type === "closure") {
2020-06-01 08:59:16 +00:00
return "(needs: " + elem.val.args.join(", ") + ")"
2020-05-30 21:39:45 +00:00
} else if (elem.type === "array") {
return "[" + prettyprint(elem.val) + "]"
2020-06-01 08:59:16 +00:00
} else {
return "(" + elem.val + ": " + elem.type + ")"
2020-05-30 19:05:05 +00:00
}
}
const prettyprint = (out) => {
let str = "";
for (let i = 0; i < out.length; i++) {
str += show(out[i]);
if (i < out.length - 1) {
str += " ";
}
}
return str;
}
submit.onclick = (event) => {
const input = inbox.value;
let toks = tokenize(input);
if (!toks) {
outbox.innerHTML = "could not parse input: " + input;
return;
}
let ast = parseExprs(toks);
if (ast.stream.length !== 0) {
outbox.innerHTML = "unexpected token: " + ((e)=>{if(e.type==="ident"){return e.name}else{return e.val}})(ast.stream[0]);
2020-05-30 19:05:05 +00:00
return;
}
let out = execRPN(scope, ast.parsed, customHandler);
2020-06-01 08:59:16 +00:00
if (!out) {
outbox.innerHTML = "failed to execute";
return;
2020-05-30 19:05:05 +00:00
}
2020-06-01 10:58:56 +00:00
console.log(out);
2020-06-01 08:59:16 +00:00
outbox.innerHTML = prettyprint(out.stacks[0]);
2020-05-30 19:05:05 +00:00
}