Thinking Like a Compiler
We can't use the built-in eval
method, but that's not going to stop us.

Let's put on our compiler hats and dissect this problem. Essentially, our job is to translate the language of mathematics into something the machine understands. Our plan involves two critical steps:
Step 1: Parsing the Expression
In this step, we're essentially acting as translators. We must walk through each character in the expression string and categorize it. Think of it as scanning a sentence and tagging each word as a noun, verb, or adjective. In our case, we have four types of "words" or symbols:
- Integers: These are the numbers in our expression. We'll detect them and store their values for computation.
- Signs/Operations: We're only concerned with addition and subtraction, represented by
+
and-
. - Parentheses: These
(
and)
symbols affect the order of operations. - Spaces: They can be ignored for our purpose but need to be identified nonetheless.
Step 2: Evaluating the Expression
Once we know what each symbol stands for, we can proceed to do the actual math. This is the part where we apply the rules of arithmetic to get our final answer.
Crafting a Strategy
Our roadmap seems pretty straightforward; however, there are some "watch out!" signs along the way. The devil is in the details—or in this case, the order and combination of these symbols.
A Simple Example: '1+1'
Let's use the simple expression 1+1
to illustrate our approach. Imagine a variable result
that stores the outcome. Now, our logic could look like this:
- Initialize
result
to 0. - Loop through each character in the string '1+1'.
- Identify the character type:
- If it's a number, add it to
result
. If it's a
+
, continue adding toresult
.
Our logic flows naturally, but as we'll discover, more complex expressions will require a more nuanced approach.
1const expression = "1+1";
2let result = 0;
3
4for (const char of expression) {
5 if (!isNaN(char)) {
6 result += Number(char);
7 }
8 // If it's a '+', we simply continue the loop
9}
10console.log("Result:", result);