public void buildTree() { //now the tree is ready to be built: int a = 1; while (a < TokenList.Count - 1) { Console.WriteLine($"test {a} result {this.ToString()}"); OperatorToken newToken; switch (TokenList[a].Print()) { case "*": //create new token newToken = new MultiplicationToken(); //take left and right values (could be constants or ready built tokens: // a // before: ... | 5 | [ + ] | 2 | [ * ] | 3 | newToken.build(TokenList[a - 1], TokenList[a + 1]); // before: ... | 5 | [ + ] | 2 | [ * ] | 3 | a = a - 1; // a // before: ... | 5 | [ + ] | 2 | [ * ] | 3 | TokenList[a] = newToken; // after: ... | 5 | [ + ] | [2*3] | [ * ] | 3 | TokenList.RemoveRange(a + 1, 2); // ... | 5 | [ + ] | [2*3] | break; case "/": //create new token newToken = new DivisionToken(); newToken.build(TokenList[a - 1], TokenList[a + 1]); a = a - 1; TokenList[a] = newToken; TokenList.RemoveRange(a + 1, 2); break; case "%": newToken = new ModuloToken(); newToken.build(TokenList[a - 1], TokenList[a + 1]); a = a - 1; TokenList[a] = newToken; TokenList.RemoveRange(a + 1, 2); break; case "+": break; case "-": break; } a++; } a = 1; while (a < TokenList.Count - 1) { Console.WriteLine($"test {a} result {this.ToString()}"); OperatorToken newToken; switch (TokenList[a].Print()) { case "+": //create new token newToken = new AdditionToken(); //take left and right values (could be constants or ready built tokens: // a // before: ... | 5 | [ + ] | 2 | [ * ] | 3 | newToken.build(TokenList[a - 1], TokenList[a + 1]); // before: ... | 5 | [ + ] | 2 | [ * ] | 3 | a = a - 1; // a // before: ... | 5 | [ + ] | 2 | [ * ] | 3 | TokenList[a] = newToken; // after: ... | 5 | [ + ] | [2*3] | [ * ] | 3 | TokenList.RemoveRange(a + 1, 2); // ... | 5 | [ + ] | [2*3] | break; case "-": //create new token newToken = new SubtractionToken(); newToken.build(TokenList[a - 1], TokenList[a + 1]); a = a - 1; TokenList[a] = newToken; TokenList.RemoveRange(a + 1, 2); break; } a++; } }