// 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); }
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)); }