Skip to content
Advertisement

Convert a string with a math formula to an object tree?

I am looking for a function that converts a math string passed as an argument (with the operations +, -, /, *), that returns an object that contains pieces of the math string, in an ordered/better way, which is easier to traverse.

Characteristics of the input:

  • is a string containing a formula
  • the formula doesn’t have =, so it isn’t an equation
  • there isn’t any floating number, just integers
  • the integers can be positive or negative
  • no variables like x, y, z
  • can include parentheses

Test cases

Example 1: Basic Math (same operation)

N Input (string) Output (object)
1 1 { values: [1], operation: null }
2 1+1 { values: [1,1], operation: "+" }
3 1+2+3 { values: [1,2,3], operation: "+" }
4 3-2-1 { values: [3,2,1], operation: "-" }
5 10*80 { values: [10,80], operation: "*" }
6 100/10 { values: [100,10], operation: "/" }

Example 2: Formula with 2 operations

➡️ + and – samples

N1

input: 1+1-1

output:

JavaScript

N2

input: 3+2-1+5

output:

JavaScript

N3

input: 3+2-1+5+10+7

output:

JavaScript

➡️ + and / samples

N4

input: 1+2/3

output:

JavaScript

N5

input: 2/3+1

output:

JavaScript

N6

input: 1/2+3/4+5/6

output:

JavaScript

N7

input: 1/2/3/4/5+6+7+8/9+10/11

output:

JavaScript

➡️ / and – samples

N8

input: 1-2/3

output:

JavaScript

➡️ / and * samples

N9

input: 10/2*5

output:

JavaScript

Example 3: Formula with 4 operations

N1

input: 10/2*5+1-1*5/3+2*4

output:

JavaScript

Example 4: Formula with () parenthesis

N1

input: 1+2*(3+2)

output:

JavaScript

N2

input: (1+2*3)*2

output:

JavaScript

N3

input: (1/1/10)+1/30+1/50

output:

JavaScript

Other Cases

N1

input: -(1+2)

output:

JavaScript

Advertisement

Answer

Here’s a function that seems to pass all of your test cases.

Somehow I’ve written a lot of expression parsers, and I eventually settled on doing it this way in pretty much all cases. This is a recursive descent parser that is just about as simple as a fully-featured expression parser can be.

The secret is the parseTokens function’s minPrec parameter, which tells it to parse until it encounters an operator with lower precedence. That makes it easy for the function to call itself recursively at each precedence level.

JavaScript
Advertisement