JSFiddle - React, Tailwind, and code Playground
by somekittens
JavaScript
var expression = "4+(13/6)",
tokenizer = expression.split("");
function parse(tokenizer){
return expr(tokenizer) && tokenizer.length===0;
}
function expr(tokenizer){
console.log("Expression",tokenizer.join(""));
var valid = term(tokenizer);
if(tokenizer[0] !== "+" && tokenizer[0] !== "-"){
console.log("Expr: Valid is",valid,tokenizer[0]);
return valid; // this is the term case and we're done
}
console.log("plus/min");
var count=0;
while(tokenizer[0] ==="+" || tokenizer[0] ==="-"){//still got expression
count++;
tokenizer.shift();//get rid of the + or -
valid =valid && term(tokenizer);//handle the next term
}
return valid && (count>0);//valid and done
}
function term(tokenizer){
console.log("Term",tokenizer.join(""));
var valid = primary(tokenizer);
if(tokenizer[0]!=="/" && tokenizer[0] !=="*"){
console.log("Term: Valid is",valid,tokenizer[0]);
return valid;//primary case
}
console.log("term/mul");
var count=0;
while(tokenizer[0] ==="/" || tokenizer[0] ==="*"){//still got terms
tokenizer.shift();//get rid of * or /
valid = valid && primary(tokenizer);
count++;
}
return valid&&(count>0);
}
function primary(tokenizer){
console.log("Primary",tokenizer.join(""));
if(tokenizer[0] === "("){ //expression
tokenizer.shift();
var exp = expr(tokenizer);
console.log("Removed extra )",tokenizer,exp);
return exp && (tokenizer.shift()===")");//was valid expression and ended with )
}
var count = 0;
while(/^[0-9]$/.test(tokenizer[0])){
count++;
tokenizer.shift();
}
console.log("Valid is",count>0,tokenizer[0]);
return count>0;
}
parse(tokenizer);