/// <summary> /// Implements the operators. /// </summary> private void ImplementOperators() { while (true) { int bestPriority = int.MinValue; int bestIndex = -1; StatementOperator best = null; for (int i = 0; i < this.Statements.Count; i++) { var s = this.Statements[i]; if (!(s is StatementOperator)) { continue; } var ops = (StatementOperator)s; int p = ops.Priority; if (p > bestPriority) { bestPriority = p; bestIndex = i; best = ops; } } if (best == null) { break; } if (bestIndex == 0 || bestIndex == this.Statements.Count - 1) { throw new FormatException("Found operator without an operand!"); } Statement operand1 = this.Statements[bestIndex - 1]; Statement operand2 = this.Statements[bestIndex + 1]; this.Statements.RemoveRange(bestIndex - 1, 3); var impl = new StatementOperatorImpl() { Operand1 = operand1, Operand2 = operand2, Operator = best }; this.Statements.Insert(bestIndex - 1, impl); } }
/// <summary> /// Parses the input for specified parent. /// </summary> /// <param name="parent">The parent.</param> /// <param name="input">The input.</param> /// <returns></returns> /// <exception cref="System.FormatException"> /// Unexpected ']'! /// or /// Unexpected ')'! /// or /// Unexpected input: + input + ! /// </exception> private bool Parse(ref StatementBlock parent, ref string input) { if (string.IsNullOrEmpty(input)) { return(false); } if (input[0] == '[') { var sb = new StatementRead(); sb.Parent = parent; parent.Statements.Add(sb); parent = sb; input = input.Substring(1); return(true); } if (input[0] == ']') { if (parent == this.Root || !(parent is StatementRead)) { throw new FormatException("Unexpected ']'!"); } var sb = parent; parent = parent.Parent; sb.Finish(); input = input.Substring(1); return(true); } if (input[0] == '(') { var sb = new StatementGroup(); sb.Parent = parent; parent.Statements.Add(sb); parent = sb; input = input.Substring(1); return(true); } if (input[0] == ')') { if (parent == this.Root || !(parent is StatementGroup)) { throw new FormatException("Unexpected ')'!"); } var sb = parent; parent = parent.Parent; sb.Finish(); input = input.Substring(1); return(true); } int len = 0; Statement created = StatementOperator.Create(input, ref len); if (created != null) { input = input.Substring(len); parent.Statements.Add(created); return(true); } created = StatementRegister.Create(input, ref len); if (created != null) { input = input.Substring(len); parent.Statements.Add(created); return(true); } created = StatementModule.Create(this.Modules, input, ref len); if (created != null) { input = input.Substring(len); parent.Statements.Add(created); return(true); } created = StatementConstant.Create(input, ref len); if (created != null) { input = input.Substring(len); parent.Statements.Add(created); return(true); } throw new FormatException("Unexpected input: " + input + "!"); }