expression-calculator
Version:
Calculate expressions without using `eval()`, using LL(1) syntax analyzer.
111 lines (110 loc) • 2.45 kB
JavaScript
/*
Priority of all the operands reference the following page:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
*/
const OPERAND_ALL={
'+': {
binocular: true,
priority: 14,
exchangeable: true,
processor(a,b){
return a+b;
}
},
'-': {
binocular: true,
priority: 14,
exchangeable: false,
processor(a,b){
return a-b;
}
},
'*': {
binocular: true,
priority: 15,
exchangeable: true,
processor(a,b){
return a*b;
}
},
'/': {
binocular: true,
priority: 15,
exchangeable: false,
processor(a,b){
return a/b;
}
},
'%':{
binocular: true,
priority: 15,
exchangeable: false,
processor(a,b){
return a%b;
}
},
'**': {
binocular: true,
priority: 16,
exchangeable: false,
rightToLeft:true,
processor(a,b){
return a**b;
}
},
'&':{
binocular: true,
priority: 10,
exchangeable: true,
bitwise:true,
processor(a,b){
return a&b;
}
},
'|':{
binocular: true,
priority: 8,
exchangeable: true,
bitwise:true,
processor(a,b){
return a|b;
}
},
'^':{
binocular: true,
priority: 9,
exchangeable: true,
bitwise:true,
processor(a,b){
return a^b;
}
},
'~':{
binocular: false,
priority: 17,
bitwise:true,
processor(a){
return ~a;
}
},
'NEG': {
match:false,
binocular: false,
priority: 17,
processor(a){
return -a;
}
},
};
let operandAll=['(',')'];
for(let oper in OPERAND_ALL){
let operDetail=OPERAND_ALL[oper];
if(false===operDetail.match){
continue;
}
operandAll.push(oper);
}
operandAll.sort((a,b)=>(b.length-a.length));
let operandRegexp=operandAll.map((item)=>item.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
export const OPERAND_MATCHER=new RegExp('^('+operandRegexp.join('|')+')');
export default OPERAND_ALL;