Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>This is my "reference implementation" in C# (somewhat unwieldy).</p> <pre><code> static int RevIndexOf(string S, char Ch, int StartPos) { for (int P = StartPos; P &gt;= 0; P--) if (S[P] == Ch) return P; return -1; } static bool IsDigit(char Ch) { return (((Ch &gt;= '0') &amp;&amp; (Ch &lt;= '9')) || (Ch == '.')); } static int GetNextOperator(List&lt;string&gt; Tokens) { int R = Tokens.IndexOf("^"); if (R != -1) return R; int P1 = Tokens.IndexOf("*"); int P2 = Tokens.IndexOf("/"); if ((P1 == -1) &amp;&amp; (P2 != -1)) return P2; if ((P1 != -1) &amp;&amp; (P2 == -1)) return P1; if ((P1 != -1) &amp;&amp; (P2 != -1)) return Math.Min(P1, P2); P1 = Tokens.IndexOf("+"); P2 = Tokens.IndexOf("-"); if ((P1 == -1) &amp;&amp; (P2 != -1)) return P2; if ((P1 != -1) &amp;&amp; (P2 == -1)) return P1; if ((P1 != -1) &amp;&amp; (P2 != -1)) return Math.Min(P1, P2); return -1; } static string ParseSubExpression(string SubExpression) { string[] AA = new string[] { "--", "++", "+-", "-+" }; string[] BB = new string[] { "+", "+", "-", "-" }; for (int I = 0; I &lt; 4; I++) while (SubExpression.IndexOf(AA[I]) != -1) SubExpression = SubExpression.Replace(AA[I], BB[I]); const string Operators = "^*/+-"; List&lt;string&gt; Tokens = new List&lt;string&gt;(); string Token = ""; foreach (char Ch in SubExpression) if (IsDigit(Ch) || (("+-".IndexOf(Ch) != -1) &amp;&amp; (Token == ""))) Token += Ch; else if (Operators.IndexOf(Ch) != -1) { Tokens.Add(Token); Tokens.Add(Ch + ""); Token = ""; } else throw new Exception("Unhandled error: invalid expression."); Tokens.Add(Token); int P1 = GetNextOperator(Tokens); while (P1 != -1) { double A = double.Parse(Tokens[P1 - 1]); double B = double.Parse(Tokens[P1 + 1]); double R = 0; switch (Tokens[P1][0]) { case '^': R = Math.Pow(A, B); break; case '*': R = A * B; break; case '/': R = A / B; break; case '+': R = A + B; break; case '-': R = A - B; break; } Tokens[P1] = R.ToString(); Tokens.RemoveAt(P1 + 1); Tokens.RemoveAt(P1 - 1); P1 = GetNextOperator(Tokens); } if (Tokens.Count == 1) return Tokens[0]; else throw new Exception("Unhandled error."); } static bool FindSubExpression(string Expression, out string Left, out string Middle, out string Right) { int P2 = Expression.IndexOf(')'); if (P2 == -1) { Left = ""; Middle = ""; Right = ""; return false; } else { int P1 = RevIndexOf(Expression, '(', P2); if (P1 == -1) throw new Exception("Unhandled error: unbalanced parentheses."); Left = Expression.Substring(0, P1); Middle = Expression.Substring(P1 + 1, P2 - P1 - 1); Right = Expression.Remove(0, P2 + 1); return true; } } static string ParseExpression(string Expression) { Expression = Expression.Replace(" ", ""); string Left, Middle, Right; while (FindSubExpression(Expression, out Left, out Middle, out Right)) Expression = Left + ParseSubExpression(Middle) + Right; return ParseSubExpression(Expression); } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload