Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var fSegmentNoBrackets = sExpression => {
- var aValues = [];
- var sRemainder = String(sExpression).replace(/\s+/g,'').replace(/([\+\-\*\/])([^\+\-\*\/]+)/g,(match,sign,val) => {
- aValues.push({
- sign: sign,
- val: val,
- exp: val,
- });
- return '';
- });
- if (sRemainder) {
- throw new Error(`Unexpected ${sRemainder}`);
- }
- return aValues
- };
- var fSegmentExpression = sExpression => {
- var aValues = [];
- var aSegments = String(sExpression).replace(/\s+/g,'').split('(');
- var sPre = aSegments.shift();
- aSegments.forEach(sSegment => {
- sSegment = sPre + '(' + sSegment;
- var nOpenBrackets = (sSegment.match(/\(/g) || []).length;
- var nCloseBrackets = (sSegment.match(/\)/g) || []).length;
- if (nOpenBrackets > nCloseBrackets) {
- sPre = sSegment;
- } else if (nOpenBrackets < nCloseBrackets) {
- throw new Error(`More Close Brackets Than Open Brackets. ${sSegment}`);
- } else {
- var match = sSegment.match(/^([^\(]*)([\+\-\*\/])\((.+)\)/);
- if (match) {
- aValues.push(...fSegmentNoBrackets(match[1]),{
- sign: match[2],
- val: fSegmentNoBrackets(match[3]),
- exp: `(${match[3]})`,
- });
- } else {
- throw new Error(`Expected Sign Before Expression. Got ${sSegment}`);
- }
- sPre = (sSegment.match(/[^)]+$/) || [''])[0];
- }
- });
- if (sPre.match(/\(/)) {
- throw new Error(`More Open Brackets Than Open Brackets. ${sPre}`);
- }
- aValues.push(...fSegmentNoBrackets(sPre));
- return aValues;
- };
- var fGenerateOperation = (oExpression1,oExpression2) => {
- var oOperation = {
- sign: oExpression1.sign,
- operation: oExpression2.sign,
- val1: oExpression1.val && oExpression1.val.constructor === Array ? fFormatExpression(oExpression1.val) : oExpression1,
- val2: oExpression2.val && oExpression2.val.constructor === Array ? fFormatExpression(oExpression2.val) : oExpression2,
- };
- oOperation.exp = `(${oOperation.val1.exp}${oOperation.operation}${oOperation.val2.exp})`;
- if (oExpression2.sign !== '-') oExpression2.sign = '+';
- return oOperation;
- };
- var fFormatExpression = aExpressions => {
- if (aExpressions.constructor === Array) {
- [['^'],['*','/'],['+','-']].forEach(aSigns => {
- aExpressions.forEach((oExpression,i) => {
- while (aExpressions[i+1] && aSigns.indexOf(aExpressions[i+1].sign) > -1) {
- aExpressions[i] = fGenerateOperation(aExpressions[i],aExpressions[i+1]);
- aExpressions.splice(i+1,1);
- }
- });
- });
- }
- return aExpressions[0];
- };
- var main = sExpression => fFormatExpression(fSegmentExpression(sExpression));
- /* ---------- EXAMPLE ---------- */
- console.log(main('+1*(+2+1)'));
Advertisement
Add Comment
Please, Sign In to add comment