Exemple #1
0
    public void PushOperator(OperatorBase op)
    {
        if (op.NeedLeftUnit())
        {
            if (op is SeparatorEndOperator)
            {
                if (m_RightResultCache == null)
                {
                    throw new System.Exception("Need Right unit");
                }
                op.SetLeftUnit(m_RightResultCache);
                //op.DebugText(Owner);
                OperatorBase preOp = m_CacheOperatorList.Pop();
                if (preOp is SeparatorStartOperator)
                {
                    PushUnit(op.GetOperatorResult());
                }
                else
                {
                    throw new System.Exception("Need Separator Start Operator");
                }
            }
            else
            {
                IExpressionUnit left = m_LeftResultCaches.Pop();
                op.SetLeftUnit(left);
            }
        }

        if (op.NeedRightUnit())
        {
            m_CacheOperatorList.Push(op);
        }
    }
        private bool IsGhostedMultiplicationSign(IExpressionUnit currentExpressionUnit)
        {
            if (previousExpressionUnit == null)
            {
                return(false);
            }

            return(previousExpressionUnit.IsCloseBracket() && currentExpressionUnit.IsNumber() ||
                   previousExpressionUnit.IsCloseBracket() && currentExpressionUnit.IsOpenBracket() ||
                   previousExpressionUnit.IsNumber() && currentExpressionUnit.IsOpenBracket());
        }
Exemple #3
0
    public void PushUnit(IExpressionUnit unit)
    {
        if (m_CacheOperatorList.Count == 0)
        {
            if (!_IsInitialized)
            {
                m_Result       = unit;
                _IsInitialized = true;
            }

            m_LeftResultCaches.Push(unit);
        }
        else
        {
            m_RightResultCache = unit;
            int count = m_CacheOperatorList.Count;
            for (int i = 0; i < count; i++)
            {
                OperatorBase op = m_CacheOperatorList.Pop();
                if (op is SeparatorStartOperator)
                {
                    m_CacheOperatorList.Push(op);
                    m_LeftResultCaches.Push(m_RightResultCache);
                    break;
                }
                else
                {
                    op.SetRightUnit(m_RightResultCache);
                    m_RightResultCache = op.GetOperatorResult();
                    //op.DebugText(Owner);
                }

                if (i == count - 1)
                {
                    if (!_IsInitialized)
                    {
                        _IsInitialized = true;
                    }
                    m_Result = m_RightResultCache;

                    m_LeftResultCaches.Push(m_RightResultCache);
                }
            }
        }
    }
        public List <IExpressionUnit> GetPolNotation()
        {
            var result = new List <IExpressionUnit>();

            foreach (var expressionUnit in expressionReader.Parse())
            {
                if (IsGhostedMultiplicationSign(expressionUnit))
                {
                    AddOperation(new OperationExpressionUnit('*'), result);
                }

                switch (expressionUnit)
                {
                case NumberExpressionUnit n:
                    result.Add(n);
                    break;

                case OperationExpressionUnit o:
                    if (stack.Count == 0 || o.IsOpenBracket())
                    {
                        stack.Push(o);
                    }
                    else if (o.IsCloseBracket())
                    {
                        ReadUnderBrackets(result);
                    }
                    else
                    {
                        AddOperation(o, result);
                    }
                    break;
                }
                previousExpressionUnit = expressionUnit;
            }

            if (stack.Any(e => e.IsOpenBracket() || e.IsCloseBracket()))
            {
                throw new NotCorrectBracketsCountException();
            }

            result.AddRange(stack);

            return(result);
        }
 public override void SetRightUnit(IExpressionUnit unit)
 {
     Right = unit;
 }
 public override void SetLeftUnit(IExpressionUnit unit)
 {
     Left = unit;
 }
 public override void SetRightUnit(IExpressionUnit unit)
 {
     throw new System.NotImplementedException();
 }
Exemple #8
0
 public static bool IsOpenBracket(this IExpressionUnit unit)
 {
     return(unit is OperationExpressionUnit o && o.Operation == '(');
 }
Exemple #9
0
 public static bool IsNumber(this IExpressionUnit unit)
 {
     return(unit is NumberExpressionUnit);
 }
 public abstract void SetRightUnit(IExpressionUnit unit);
 public abstract void SetLeftUnit(IExpressionUnit unit);