递归下降 四则计算

let tokens=[2 ,'+' ,3 , '+' ,4, '*', 5 ,'+',6,'*',10]
let pos=0;
function t(){
  return tokens[pos]
}
function isOperator(char) {
  return ['+', '-', '*', '/'].indexOf(char) != -1;
}
function isParen(char) {
  return ['(', ')'].indexOf(char) != -1;
}
function isNumber1(char) {
  return /^\d+$/.test(char);
}
function isNumber(obj) {  
  return obj === +obj  
}  
function isString(obj) {  
  return obj === obj+''  
} 
function factor(){
  if(isNumber(t())){
    let a=t()
    pos++
    return a
  }
  return expr()
}
function term(){
  let a=factor()
  if(t()=='*'){
    pos++
    a={type:"mul",
       left:a,
       right:term()}
  }
  return a;
}
function expr(){
  let a=term()
  if(t()=='+'){
    pos++
    a={type:"add",
       left:a,
       right:expr()}
  }
  return a
}
function eval(node){
 if(!isNumber(node)){
  switch(node.type){
    case 'add': return eval(node.left)+eval(node.right)
    case "mul": return eval(node.left) * eval(node.right)
  }
 }
return node
}
console.log(tokens)
console.log(JSON.stringify(expr(),null,2))
pos=0;
console.log(eval(expr()))


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容