Skip to content

Instantly share code, notes, and snippets.

@kermit-klein
Created August 24, 2021 09:50
Show Gist options
  • Save kermit-klein/2fee079c75121949fccfbed8906c0d06 to your computer and use it in GitHub Desktop.
Save kermit-klein/2fee079c75121949fccfbed8906c0d06 to your computer and use it in GitHub Desktop.
function splitString(str) {
let seperatedString = str.split(" ");
if (
!seperatedString.every(
(e) => /^-?([1-9][0-9]*|([0]))$|^[\+\*\/\-]$/.test(e)
)
) {
throw SyntaxError("Invalid Format");
}
return seperatedString;
}
function parse(fullString) {
let strArray = splitString(fullString);
let pos = 0;
function checkPos() {
return strArray[pos];
}
function jumpNext() {
pos++;
}
function parseNumber() {
let k = checkPos();
jumpNext();
return { type: "number", value: k };
}
function parseMulDiv() {
let expr = parseNumber();
let k = checkPos();
while (k === "*" || k === "/") {
jumpNext();
let rhs = parseNumber();
expr = { type: k, left: expr, right: rhs };
k = checkPos();
}
return expr;
}
function parseAddSub() {
let expr = parseMulDiv();
let k = checkPos();
while (k === "-" || k === "+") {
jumpNext();
let rhs = parseMulDiv();
expr = { type: k, left: expr, right: rhs };
k = checkPos();
}
return expr;
}
let output = parseAddSub();
return output;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment