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(); }
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); } } } }
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; }
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); } } }
private FormulaTable() { m_mapElements = new Dictionary <int, FormulaElement>(); m_emptyItem = new FormulaElement(); m_vecAllElements = new List <FormulaElement>(); }
private bool IsCloseBracket(FormulaElement element) { return((element is Bracket bracket) && !bracket.IsOpen); }