Ejemplo n.º 1
0
            /// <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);
                }
            }
Ejemplo n.º 2
0
        /// <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 + "!");
        }