Esempio n. 1
0
 private void SetOperator(FunctionTreeBuilder ec, IOperator op)
 {
     if (!ec.SetOperator(op))
     {
         throw new EmptyExpressionException(mInput, mPos);
     }
 }
Esempio n. 2
0
 private void SetExpression(FunctionTreeBuilder ec, Node expr)
 {
     if (!ec.SetExpression(expr))
     {
         throw new OperatorException(mInput, mPos);
     }
 }
Esempio n. 3
0
        private void HandleNumber(FunctionTreeBuilder ec)
        {
            bool point = mInput[mPos] == '.';
            int  begin = mPos++;

            while (mPos < mInput.Length)
            {
                if (mInput[mPos] == '.')
                {
                    if (point)
                    {
                        throw new SyntaxException(mInput, mPos);
                    }

                    point = true;
                }
                else if (!char.IsDigit(mInput[mPos]))
                {
                    break;
                }

                mPos++;
            }

            mPos--;

            if (mInput[mPos] == '.')
            {
                throw new SyntaxException(mInput, mPos);
            }

            double d = double.Parse(mInput.Substring(begin, mPos - begin + 1));

            SetExpression(ec, Node.Number(d));
        }
Esempio n. 4
0
        private Node GetResultExpression(FunctionTreeBuilder ec)
        {
            Node result = ec.GetResult();

            if (result == null)
            {
                throw new EmptyExpressionException(mInput, mPos);
            }

            return(result);
        }
Esempio n. 5
0
 private void HandleMinus(FunctionTreeBuilder ec)
 {
     if (ec.LeftIsEmpty())
     {
         SetOperator(ec, new OperatorNegate());
     }
     else
     {
         SetOperator(ec, new OperatorSubtract());
     }
 }
Esempio n. 6
0
        private Node Parse(bool bParentheses)
        {
            FunctionTreeBuilder ec = new FunctionTreeBuilder();

            while (mPos < mInput.Length)
            {
                switch (mInput[mPos])
                {
                case ' ':
                    break;

                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case '.':
                    HandleNumber(ec);
                    break;

                case 'x':
                case 'X':
                    SetExpression(ec, mParams.X);
                    break;

                case 'y':
                case 'Y':
                    SetExpression(ec, mParams.Y);
                    break;

                case 'z':
                case 'Z':
                    SetExpression(ec, mParams.Z);
                    break;

                case 't':
                case 'T':
                    SetExpression(ec, mParams.T);
                    break;

                case '+':
                    SetOperator(ec, new OperatorAdd());
                    break;

                case '-':
                    HandleMinus(ec);
                    break;

                case '/':
                    SetOperator(ec, new OperatorDivide());
                    break;

                case '*':
                    SetOperator(ec, new OperatorMultiply());
                    break;

                case '^':
                    SetOperator(ec, new OperatorPower());
                    break;

                case '(':
                    mPos++;
                    SetExpression(ec, Parse(true));
                    break;

                case ')':
                    if (!bParentheses)
                    {
                        throw new ParenthesisException(mInput, mPos, Resources.Opening);
                    }
                    return(GetResultExpression(ec));

                case 'c':
                case 'C':
                    if (ConsumeWord("cos"))
                    {
                        ConsumeOpeningParenthesis();
                        SetExpression(ec, Node.Cos(Parse(true)));
                    }
                    else
                    {
                        throw new UnknownWordException(mInput, mPos);
                    }
                    break;

                case 'e':
                case 'E':
                    if (ConsumeWord("exp"))
                    {
                        ConsumeOpeningParenthesis();
                        SetExpression(ec, Node.Exp(Parse(true)));
                    }
                    else
                    {
                        SetExpression(ec, Node.E());
                    }
                    break;

                case 'l':
                case 'L':
                    if (ConsumeWord("ln"))
                    {
                        ConsumeOpeningParenthesis();
                        SetExpression(ec, Node.Ln(Parse(true)));
                    }
                    else
                    {
                        throw new UnknownWordException(mInput, mPos);
                    }
                    break;

                case 'p':
                case 'P':
                    if (ConsumeWord("pi"))
                    {
                        SetExpression(ec, Node.PI());
                    }
                    else
                    {
                        throw new UnknownWordException(mInput, mPos);
                    }
                    break;

                case 's':
                case 'S':
                    if (ConsumeWord("sin"))
                    {
                        ConsumeOpeningParenthesis();
                        SetExpression(ec, Node.Sin(Parse(true)));
                    }
                    else if (ConsumeWord("sqrt"))
                    {
                        ConsumeOpeningParenthesis();
                        SetExpression(ec, Node.Sqrt(Parse(true)));
                    }
                    else
                    {
                        throw new UnknownWordException(mInput, mPos);
                    }
                    break;

                default:
                    throw new UnknownTokenException(mInput, mPos);
                }

                mPos++;
            }

            if (bParentheses)
            {
                throw new ParenthesisException(mInput, mPos, Resources.Closing);
            }

            return(GetResultExpression(ec));
        }