public void SumTest() { var visitor = new DumpVisitor(); var parser = new Parser(); string data = "1+2"; var expr = parser.Parse(data); expr.Accept(visitor); Assert.AreEqual("BinaryExpr(Literal(1)+Literal(2))", visitor.ToString()); }
public void JustVarTest() { var visitor = new DumpVisitor(); var parser = new Parser(); string data = "a"; var expr = parser.Parse(data); expr.Accept(visitor); Assert.AreEqual("Variable(a)", visitor.ToString()); }
public void MoreParenTest() { var visitor = new DumpVisitor(); var parser = new Parser(); string data = "(a-(3))"; var expr = parser.Parse(data); expr.Accept(visitor); Assert.AreEqual("ParenExpr(BinaryExpr(Variable(a)-ParenExpr(Literal(3))))", visitor.ToString()); }
public void OpsTest() { var visitor = new DumpVisitor(); var parser = new Parser(); string data = "1+a*3-b/5"; var expr = parser.Parse(data); expr.Accept(visitor); Assert.AreEqual("BinaryExpr(BinaryExpr(Literal(1)+BinaryExpr(Variable(a)*Literal(3)))-BinaryExpr(Variable(b)/Literal(5)))", visitor.ToString()); }
public static IExpression Parse(string text) { var dumpVisitor = new DumpVisitor(); Stack <IExpression> variableAndLetter = new Stack <IExpression>(); Stack <char> operators = new Stack <char>(); for (var i = 0; i < text.Length; i++) { var ch = text[i]; if (ch == '+' || ch == '-' || ch == '*' || ch == '/') { if (operators.Count == 0) { operators.Push(ch); } else if (isCurrentOpLessPriority(ch, operators.Peek())) { var highPriorOper = operators.Pop(); operators.Push(ch); var secondEl = variableAndLetter.Pop(); var firstEl = variableAndLetter.Pop(); variableAndLetter.Push(new BinaryExpression(firstEl, secondEl, highPriorOper.ToString())); } else { operators.Push(ch); } } else if (ch == '(') { operators.Push(ch); } else if (ch == ')') { while (operators.Peek() != '(') { if (operators.Count == 0) { throw new FormatException("Incorrect expression"); } char op = operators.Pop(); var secondEl = variableAndLetter.Pop(); var firstEl = variableAndLetter.Pop(); variableAndLetter.Push(new BinaryExpression(firstEl, secondEl, op.ToString())); } operators.Pop(); } else if (char.IsDigit(ch)) { variableAndLetter.Push(new Literal(ch.ToString())); } else if (char.IsLetter(ch)) { variableAndLetter.Push(new Variable(ch.ToString())); } else { throw new FormatException("Incorrect element in expression"); } } while (variableAndLetter.Count > 1) { char oper = operators.Pop(); var second = variableAndLetter.Pop(); var first = variableAndLetter.Pop(); variableAndLetter.Push(new BinaryExpression(first, second, oper.ToString())); } return(variableAndLetter.Pop()); }