KaoSDlanor

Parse Expression

Nov 3rd, 2017
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var fSegmentNoBrackets = sExpression => {
  2.   var aValues = [];
  3.   var sRemainder = String(sExpression).replace(/\s+/g,'').replace(/([\+\-\*\/])([^\+\-\*\/]+)/g,(match,sign,val) => {
  4.     aValues.push({
  5.       sign: sign,
  6.       val: val,
  7.       exp: val,
  8.     });
  9.     return '';
  10.   });
  11.  
  12.   if (sRemainder) {
  13.     throw new Error(`Unexpected ${sRemainder}`);
  14.   }
  15.   return aValues
  16. };
  17.  
  18. var fSegmentExpression = sExpression => {
  19.   var aValues = [];
  20.   var aSegments = String(sExpression).replace(/\s+/g,'').split('(');
  21.   var sPre = aSegments.shift();
  22.   aSegments.forEach(sSegment => {
  23.     sSegment = sPre + '(' + sSegment;
  24.     var nOpenBrackets = (sSegment.match(/\(/g) || []).length;
  25.     var nCloseBrackets = (sSegment.match(/\)/g) || []).length;
  26.     if (nOpenBrackets > nCloseBrackets) {
  27.       sPre = sSegment;
  28.     } else if (nOpenBrackets < nCloseBrackets) {
  29.       throw new Error(`More Close Brackets Than Open Brackets. ${sSegment}`);
  30.     } else {
  31.       var match = sSegment.match(/^([^\(]*)([\+\-\*\/])\((.+)\)/);
  32.       if (match) {
  33.         aValues.push(...fSegmentNoBrackets(match[1]),{
  34.           sign: match[2],
  35.           val: fSegmentNoBrackets(match[3]),
  36.           exp: `(${match[3]})`,
  37.         });
  38.       } else {
  39.         throw new Error(`Expected Sign Before Expression. Got ${sSegment}`);
  40.       }
  41.      
  42.       sPre = (sSegment.match(/[^)]+$/) || [''])[0];
  43.     }
  44.   });
  45.  
  46.   if (sPre.match(/\(/)) {
  47.     throw new Error(`More Open Brackets Than Open Brackets. ${sPre}`);
  48.   }
  49.  
  50.   aValues.push(...fSegmentNoBrackets(sPre));
  51.  
  52.   return aValues;
  53. };
  54.  
  55. var fGenerateOperation = (oExpression1,oExpression2) => {
  56.   var oOperation = {
  57.     sign: oExpression1.sign,
  58.     operation: oExpression2.sign,
  59.     val1: oExpression1.val && oExpression1.val.constructor === Array ? fFormatExpression(oExpression1.val) : oExpression1,
  60.     val2: oExpression2.val && oExpression2.val.constructor === Array ? fFormatExpression(oExpression2.val) : oExpression2,
  61.   };
  62.   oOperation.exp = `(${oOperation.val1.exp}${oOperation.operation}${oOperation.val2.exp})`;
  63.  
  64.   if (oExpression2.sign !== '-') oExpression2.sign = '+';
  65.  
  66.   return oOperation;
  67. };
  68.  
  69. var fFormatExpression = aExpressions => {
  70.   if (aExpressions.constructor === Array) {
  71.     [['^'],['*','/'],['+','-']].forEach(aSigns => {
  72.  
  73.       aExpressions.forEach((oExpression,i) => {
  74.         while (aExpressions[i+1] && aSigns.indexOf(aExpressions[i+1].sign) > -1) {
  75.           aExpressions[i] = fGenerateOperation(aExpressions[i],aExpressions[i+1]);
  76.           aExpressions.splice(i+1,1);
  77.         }
  78.       });
  79.      
  80.     });
  81.   }
  82.   return aExpressions[0];
  83. };
  84.  
  85. var main = sExpression => fFormatExpression(fSegmentExpression(sExpression));
  86.  
  87. /* ---------- EXAMPLE ---------- */
  88. console.log(main('+1*(+2+1)'));
Advertisement
Add Comment
Please, Sign In to add comment