示例#1
0
        // Try to fold a negated constant int32.  We have to do this so that parsing int32.MinValue will work
        public override Node ExitNegateExpression(Production node)
        {
            IList childValues = this.GetChildValues(node);

            // Get last child
            ExpressionElement childElement = (ExpressionElement)childValues[childValues.Count - 1];

            // Is it an signed integer constant?
            if (object.ReferenceEquals(childElement.GetType(), typeof(Int32LiteralElement)) & childValues.Count == 2)
            {
                ((Int32LiteralElement)childElement).Negate();
                // Add it directly instead of the negate element since it will already be negated
                node.AddValue(childElement);
            }
            else if (object.ReferenceEquals(childElement.GetType(), typeof(Int64LiteralElement)) & childValues.Count == 2)
            {
                ((Int64LiteralElement)childElement).Negate();
                // Add it directly instead of the negate element since it will already be negated
                node.AddValue(childElement);
            }
            else
            {
                // No so just add a regular negate
                this.AddUnaryOp(node, typeof(NegateElement));
            }

            return(node);
        }
示例#2
0
        private static ExpressionContainer CalculateContainer(ExpressionContainer container, System.Type operationType)
        {
            List <ExpressionElement> expression = container.GetExpression();

            bool isComplited = false;

            while (isComplited == false)
            {
                // Идея просчёт в том, что мы последовательно обходим всё выражение.
                // Если нам попадаются простые операции(+, -), мы их пропускаем,
                // если попались приоритетные операции, то мы их считаем и сразу удаляем
                // из выражения записывая на их место результат.
                isComplited = true;

                for (int i = 0; i < expression.Count; i++)
                {
                    ExpressionElement element = expression[i];

                    if (element is ExpressionNumber || element.GetType().IsSubclassOf(operationType) == false)
                    {
                        continue;
                    }

                    ExpressionOperation operation = (ExpressionOperation)element;
                    ExpressionNumber    number1   = (ExpressionNumber)expression[i - 1];
                    ExpressionNumber    number2   = (ExpressionNumber)expression[i + 1];

                    expression[i - 1] = new ExpressionNumber(operation.Calculate(number1, number2).ToString());
                    expression.Remove(expression[i + 1]);
                    expression.Remove(expression[i]);

                    isComplited = false;
                    break;
                }
            }

            return(new ExpressionContainer(expression));
        }