Skip to content

Instantly share code, notes, and snippets.

@kermit-klein
Created August 24, 2021 20:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kermit-klein/ee4d5ced1d389b714e055ac6c39b5ac8 to your computer and use it in GitHub Desktop.
Save kermit-klein/ee4d5ced1d389b714e055ac6c39b5ac8 to your computer and use it in GitHub Desktop.
function parse(fullString) {
let strArray = fullString.split(" ");
let pos = 0;
function checkPos() {
return strArray[pos];
}
function isNumber(e) {
return e !== undefined && e.match(/^-?([1-9][0-9]*|([0]))$/) !== null;
}
function jumpNext() {
pos++;
}
function parseNumber() {
let k = checkPos();
if (isNumber(k)) {
jumpNext();
return { type: "number", value: k };
} else {
throw SyntaxError("Invalid Format");
}
}
function parseExp() {
let expr = parseNumber();
let k = checkPos();
while (k === "^") {
jumpNext();
let lhs = parseExp();
expr = { type: k, left: lhs, right: expr };
k = checkPos();
}
return expr;
}
function parseMulDiv() {
let expr = parseExp();
let k = checkPos();
while (k === "*" || k === "/") {
jumpNext();
let rhs = parseExp();
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