private ICalculationExpression ReadNonTerminal(List <string> tokenList) { string token = tokenList.First(); tokenList.RemoveAt(0); ICalculationExpression right = ReadNextToken(tokenList); ICalculationExpression left = ReadNextToken(tokenList); if (token == "+") { return(new AddExpression(left, right)); } else if (token == "-") { return(new SubtractExpression(left, right)); } else if (token == "*") { return(new MultiplyExpression(left, right)); } else if (token == "/") { return(new DivideExpression(left, right)); } else if (token == "pow2") { return(new PowerOfTwoExpression(right)); } else if (token == "√") { return(new SquareRootExpression(right)); } else if (token == "1/x") { return(new MultiplicativeInverseExpression(right)); } else if (token == "(" || token == ")") { return(right); } return(null); }
public MultiplyExpression(ICalculationExpression left, ICalculationExpression right) { this.leftEx = left; this.rightEx = right; }
public DivideExpression(ICalculationExpression left, ICalculationExpression right) { this.leftEx = left; this.rightEx = right; }
public SubtractExpression(ICalculationExpression left, ICalculationExpression right) { this.leftEx = left; this.rightEx = right; }
public MultiplicativeInverseExpression(ICalculationExpression expr) { this.rightEx = expr; }
public SquareRootExpression(ICalculationExpression expr) { this.rightEx = expr; }
public PowerOfTwoExpression(ICalculationExpression expr) { this.rightEx = expr; }
private double CalculateAnswer() { //if (m_PolishStack.Count <= 1) return; TokenReader PolishTokenReader = new TokenReader(); string m_CombinedInfixString = m_InfixString; if (m_NumberString != "") { m_CombinedInfixString += m_NumberString + ' '; } List <string> polishTokenList = m_PolishStack.ToList(); List <string> infixStringArray = m_CombinedInfixString.Split(' ').ToList(); infixStringArray.RemoveAll(IsEmptySpace); infixStringArray.RemoveAt(infixStringArray.Count - 1); string rpnString = ConvertInfixToRPN(infixStringArray.ToArray()); List <string> rpnDisplayString = rpnString.Split(' ').ToList(); rpnDisplayString.Reverse(); //rpnDisplayString.RemoveAt(rpnDisplayString.Count - 1); rpnDisplayString.RemoveAt(0); debugBox.Text = rpnString; string stackRpnString = ""; foreach (string token in polishTokenList) { stackRpnString += token + " "; } //debugBox.Text = stackRpnString + Environment.NewLine + m_sInfixString; ICalculationExpression resultExpression = null; try { resultExpression = PolishTokenReader.ReadToken(rpnDisplayString); } catch (Exception ex) { Console.WriteLine("Error: " + ex.Message); } ResetInputString(); BuildCalculationString(); double result = 0.0; if (resultExpression != null) { string resultString = "Infinity?"; try { result = resultExpression.Interpret(); resultString = result.ToString(); } catch (NullReferenceException exception) { Console.WriteLine(exception.Message); } calcResultLabel.Text = resultString; } else { calcResultLabel.Text = "Error"; //ClearCalculations(); Console.WriteLine("Error: resultExpression is a 'null' object"); } return(result); }