Exemplo n.º 1
0
 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);
     }
 }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
        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);
        }