public static void Run() { Tokeniser tokeniser = new Tokeniser(Console.ReadLine()); List <Token> tokens = tokeniser.Tokenise().ToList(); TreeNode bin1 = TreeBuilder.BuildAST(tokens); // e.g "5 * 2 + 1" -> "5 2 * 1 +" // Using TreeNode type, not BinOp (Binary Operator) as we cannot guarantee the root node of the abstract syntax tree will be an operator. Console.WriteLine("To postfix:"); foreach (TreeNode node in Traversal.postOrder(bin1)) { Console.Write(node.value + " "); } Console.WriteLine("\nTo infix:"); foreach (TreeNode node in Traversal.inOrder(bin1)) { Console.Write(node.value + " "); } Console.WriteLine("\nTo prefix:"); foreach (TreeNode node in Traversal.preOrder(bin1)) { Console.Write(node.value + " "); } Console.WriteLine(); // Now using reverse polish notation, calculate what the result is. This takes in a postfix-ordered list of TreeNodes. Console.WriteLine("Answer: " + RPN.Evaluate(Traversal.postOrder(bin1))); }
public Token ResolveExpression(List <Token> expr) // TODO { Token toReturn = new Token("", ""); // First, replace variable name references with their values. expr = VariablesToValues(expr); // Now check tokens are all the same type in the expression (except grammar tokens) string exprResultType = CheckTypes(expr); // This func will throw error if they aren't // exprResultType now stores the final expected type for when expression is resolved to one token // e.g 1 + 1 => resolves to 'number' // e.g "1" + "1" => resolves to 'string' if (exprResultType.Equals("string")) // Indicates that we are dealing with a string expression { // The only operation that can be done to strings in an expression is '+' for concat if (expr.Count == 1) { toReturn = new Token("string", expr[0].Value()); } // If there is only one token in the whole expression, it must just be a string // Therefore we can just return the string as it's 1 token else { // We must be dealing with concatenation if (!expr[0].Type().Equals("string")) { throw new SyntaxError(); } // Concatenation expressions MUST start with a string // e.g string x = + "Hello World"; will cause ERROR as expr starts with '+' string finalResult = expr[0].Value(); // First string in expression int index = 1; while (index < expr.Count) { if (expr[index].Type().Equals("operator")) { if (expr[index].Value().Equals("+") && index < expr.Count - 1) { finalResult += expr[index + 1].Value(); // Add NEXT string to final result } else { throw new TypeMatchError(); // Cannot do any other operation than '+' on strings } } index++; } toReturn = new Token("string", finalResult); } } else if (exprResultType.Equals("number")) // Indicates we are dealing with a mathematical expression { TreeNode root = TreeBuilder.BuildAST(expr); // Create abstract syntax tree of mathematical expression int result = RPN.Evaluate(Traversal.postOrder(root)); // Calculate result of RPN algorithm calculation toReturn = new Token("number", result.ToString()); } else { throw new SyntaxError(); // invalid expression type has somehow made it through, we cannot evaluate it so throw error. } return(toReturn); }