コード例 #1
0
        private FormulaParser(string formula)
        {
            StringBuilder buffer = new StringBuilder();

            foreach (char c in formula)
            {
                if (char.IsWhiteSpace(c) && buffer.Length == 0)
                {
                    continue;
                }

                bool canBe1 = FormulaElement.CanBeElement(buffer.ToString(), out FormulaElement elem);
                bool canBe2 = FormulaElement.CanBeElement(buffer.ToString() + c);

                if (canBe1 && !canBe2)
                {
                    if (elem is object)
                    {
                        AddNextElement(elem);
                        buffer.Clear();
                        if (!char.IsWhiteSpace(c))
                        {
                            buffer.Append(c);
                        }
                    }
                    else
                    {
                        throw new ParseException();
                    }
                }
                else if (canBe1 && canBe2)
                {
                    buffer.Append(c);
                }
                else
                {
                    throw new ParseException();
                }
            }

            if (buffer.Length > 0)
            {
                FormulaElement.CanBeElement(buffer.ToString(), out FormulaElement elem);
                if (elem is object)
                {
                    AddNextElement(elem);
                }
                else
                {
                    throw new ParseException($"Error parse \"{buffer}\" at the end of formula.");
                }
            }
            EndParse();
        }
コード例 #2
0
        private void AddNext(Bracket bracket)
        {
            if (bracket.IsOpen)
            {
                if (_prevElement is Variable || IsCloseBracket(_prevElement))
                {
                    throw new LogicException("Before open bracket can not be variable or close bracket.");
                }

                _operationsStack.Push(bracket);
            }
            else
            {
                if (!(_prevElement is Variable || IsCloseBracket(_prevElement)))
                {
                    throw new LogicException("Before close bracket can be only variable or close bracket.");
                }

                while (true)
                {
                    if (_operationsStack.Count == 0)
                    {
                        throw new LogicException("For close bracket not found open bracket.");
                    }

                    FormulaElement next = _operationsStack.Pop();
                    if (next is Bracket openBracket)
                    {
                        if (Bracket.IsPair(openBracket, bracket))
                        {
                            break;
                        }
                        else
                        {
                            throw new LogicException("Wrong brackets arrangement.");
                        }
                    }
                    else if (next is Operation)
                    {
                        _resultStack.Push(next);
                    }
                }
            }
        }
コード例 #3
0
        private void AddNextElement(FormulaElement element)
        {
            switch (element)
            {
            case BinOp op:
                AddNext(op);
                break;

            case UnaryOp op:
                AddNext(op);
                break;

            case Variable variable:
                AddNext(variable);
                break;

            case Bracket bracket:
                AddNext(bracket);
                break;
            }
            _prevElement = element;
        }
コード例 #4
0
        private void EndParse()
        {
            if (_prevElement is null)
            {
                throw new ParseException("Empty formula.");
            }
            if (_prevElement is BinOp || _prevElement is UnaryOp || IsOpenBracket(_prevElement))
            {
                throw new LogicException("The last element of formula can not be binary operation, unary operation or open bracket.");
            }

            while (_operationsStack.Count > 0)
            {
                FormulaElement next = _operationsStack.Pop();
                if (next is Bracket)
                {
                    throw new LogicException("Open bracket without close bracket.");
                }
                else if (next is Operation)
                {
                    _resultStack.Push(next);
                }
            }
        }
コード例 #5
0
 private FormulaTable()
 {
     m_mapElements    = new Dictionary <int, FormulaElement>();
     m_emptyItem      = new FormulaElement();
     m_vecAllElements = new List <FormulaElement>();
 }
コード例 #6
0
 private bool IsCloseBracket(FormulaElement element)
 {
     return((element is Bracket bracket) && !bracket.IsOpen);
 }