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);