private void PopOperatorsToOutput(bool precedence, MathToken token) { while (OpStack.Count > 0 && OpStack[0].Operator != Operator.StartParen && !(precedence && token.Operator == Operator.Add && OpStack[0].Operator == Operator.Mul)) { Output.Add(OpStack[0]); OpStack.RemoveAt(0); } }
public List <MathToken> InfixToPostfix(bool precedence, List <MathToken> infix) { Output.Clear(); OpStack.Clear(); foreach (MathToken token in infix) { if (token.Type == TokenType.Operand) { Output.Add(token); } else if (token.Operator == Operator.StartParen) { OpStack.Insert(0, token); } else if (token.Operator == Operator.EndParen) { PopOperatorsToOutput(precedence, token); if (OpStack[0].Operator == Operator.StartParen) { OpStack.RemoveAt(0); } else { throw new Exception("Mismatched parenthesis"); } } else { PopOperatorsToOutput(precedence, token); OpStack.Insert(0, token); } } MathToken end = new MathToken(); end.Type = TokenType.Operator; end.Operator = Operator.EndParen; PopOperatorsToOutput(precedence, end); return(Output); }
private List <MathToken> Tokenize(string input) { List <MathToken> tokens = new List <MathToken>(); Regex TokenRe = new Regex(@"\s*(\d+|\+|\*|\(|\))"); foreach (Match match in TokenRe.Matches(input)) { MathToken token = new MathToken(); switch (match.Groups[1].Value) { case "(": token.Type = TokenType.Operator; token.Operator = Operator.StartParen; break; case ")": token.Type = TokenType.Operator; token.Operator = Operator.EndParen; break; case "+": token.Type = TokenType.Operator; token.Operator = Operator.Add; break; case "*": token.Type = TokenType.Operator; token.Operator = Operator.Mul; break; default: token.Type = TokenType.Operand; token.Operand = int.Parse(match.Groups[1].Value); break; } tokens.Add(token); } return(tokens); }