public IFunction fpa(ref string s)  //parse the proposition
        {
            IFunction f;

            while (s != null)
            {
                switch (s[0])
                {
                case '0':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(0);
                    function += "0";
                    return(f);

                case '1':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(1);
                    function += "1";
                    return(f);

                case '2':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(2);
                    function += "2";
                    return(f);

                case '3':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(3);
                    function += "3";
                    return(f);

                case '4':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(4);
                    function += "4";
                    return(f);

                case '5':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(5);
                    function += "5";
                    return(f);

                case '6':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(6);
                    function += "6";
                    return(f);

                case '7':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(7);
                    function += "7";
                    return(f);

                case '8':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(8);
                    function += "8";
                    return(f);

                case '9':
                    s         = s.Remove(0, 1);
                    f         = new Numbers(9);
                    function += "9";
                    return(f);

                case 'x':
                    s         = s.Remove(0, 1);
                    f         = new XValue("x");
                    function += "x";
                    return(f);

                case 'p':
                    s         = s.Remove(0, 1);
                    f         = new PValue("p");
                    function += "Pi";
                    return(f);

                case '!':
                    s = s.Remove(0, 1);
                    string[] myNumber = s.Split(new char[] { '(', ')', ',' });
                    int      cnt      = myNumber.Count();
                    RemoveWhiteSpaces(ref s);
                    RemoveWhiteSpaces(ref s);
                    int number1 = Convert.ToInt32(myNumber[1]);
                    s = s.Remove(0, 1);                             //remove (
                    foreach (char var in myNumber[1])
                    {
                        s = s.Remove(0, 1);                        //remove int number
                    }
                    s         = s.Remove(0, 1);                    //remove )
                    f         = new Factorial(number1);
                    function += number1.ToString();
                    function += "!";
                    Console.WriteLine(function);
                    return(f);

                case 'l':
                    s         = s.Remove(0, 1);
                    s         = s.Remove(0, 1);
                    function += "ln(";
                    IFunction val = fpa(ref s);
                    function += ")";
                    s         = s.Remove(0, 1);
                    f         = new Ln(val);
                    //f = f.Simplify();
                    return(f);

                case '+':
                    s         = s.Remove(0, 1);
                    s         = s.Remove(0, 1);
                    function += "(";
                    IFunction left = fpa(ref s);
                    function += "+";
                    s         = s.Remove(0, 1);
                    IFunction right = fpa(ref s);
                    function += ")";
                    s         = s.Remove(0, 1);
                    f         = new AddFunction(left, right);
                    // f = f.Simplify();
                    return(f);

                case '-':
                    s         = s.Remove(0, 1);
                    s         = s.Remove(0, 1);
                    function += "(";
                    IFunction leftMinus = fpa(ref s);
                    function += "-";
                    s         = s.Remove(0, 1);
                    IFunction rightMinus = fpa(ref s);
                    function += ")";
                    s         = s.Remove(0, 1);
                    f         = new MinusFunction(leftMinus, rightMinus);
                    //f = f.Simplify();
                    return(f);

                case 's':
                    s         = s.Remove(0, 1);
                    s         = s.Remove(0, 1);
                    function += "s(";
                    IFunction inputForSinValue = fpa(ref s);
                    f         = new Sin(inputForSinValue);
                    function += ")";
                    s         = s.Remove(0, 1);
                    return(f);

                case '^':
                    s         = s.Remove(0, 1);
                    s         = s.Remove(0, 1);
                    function += "(";
                    IFunction left1 = fpa(ref s);
                    function += "^";
                    s         = s.Remove(0, 1);
                    IFunction right2 = fpa(ref s);
                    function += ")";
                    s         = s.Remove(0, 1);
                    f         = new Power(left1, right2);
                    //f = f.Simplify();
                    return(f);

                case 'n':
                    s = s.Remove(0, 1);
                    string[] myNumbers = s.Split(new char[] { '(', ')', ',' });
                    int      count     = myNumbers.Count();
                    RemoveWhiteSpaces(ref s);
                    RemoveWhiteSpaces(ref s);
                    int num = Convert.ToInt32(myNumbers[1]);
                    s = s.Remove(0, 1);                             //remove (
                    foreach (char var in myNumbers[1])
                    {
                        s = s.Remove(0, 1);                        //remove int number
                    }
                    s         = s.Remove(0, 1);                    //remove )
                    f         = new Numbers(num);
                    function += "n(" + num.ToString() + ")";
                    return(f);

                case 'r':
                    s = s.Remove(0, 1);
                    string[] myRealNumbers = s.Split(new char[] { '(', ')', ',' });
                    int      countRealNr   = myRealNumbers.Count();
                    RemoveWhiteSpaces(ref s);
                    RemoveWhiteSpaces(ref s);
                    decimal realNumber = Convert.ToDecimal(myRealNumbers[1]);
                    s = s.Remove(0, 1);                             //remove (
                    foreach (char var in myRealNumbers[1])
                    {
                        s = s.Remove(0, 1);                        //remove int number
                    }
                    s         = s.Remove(0, 1);                    //remove )
                    f         = new RealNumber(realNumber);
                    function += "r(" + realNumber.ToString() + ")";
                    return(f);

                case '*':
                    s         = s.Remove(0, 1);
                    s         = s.Remove(0, 1);
                    function += "(";
                    IFunction leftMuiltiplication = fpa(ref s);
                    function += "*";
                    s         = s.Remove(0, 1);
                    IFunction rightMuiltiplication = fpa(ref s);
                    s         = s.Remove(0, 1);
                    function += ")";
                    f         = new Multiplication(leftMuiltiplication, rightMuiltiplication);
                    //f = f.Simplify();
                    return(f);

                case '/':
                    s         = s.Remove(0, 1);
                    s         = s.Remove(0, 1);
                    function += "(";
                    IFunction leftDevision = fpa(ref s);
                    function += "/";
                    s         = s.Remove(0, 1);
                    IFunction rightDevision = fpa(ref s);
                    function += ")";
                    s         = s.Remove(0, 1);
                    f         = new DevisionFunction(leftDevision, rightDevision);
                    // f = f.Simplify();
                    return(f);

                case 'c':
                    s         = s.Remove(0, 1);
                    s         = s.Remove(0, 1);
                    function += "cos(";
                    IFunction inputForCosValue = fpa(ref s);
                    f         = new Cos(inputForCosValue);
                    function += ")";
                    s         = s.Remove(0, 1);
                    return(f);

                case 'e':
                    s         = s.Remove(0, 1);
                    function += "exp(";
                    string[] myExponential = s.Split(new char[] { '(', ')', ',' });
                    if (myExponential[1] == "")     // l(e)
                    {
                        f         = new RealNumber((decimal)2.718281);
                        function += ")";
                    }
                    else
                    {
                        s = s.Remove(0, 1);
                        IFunction innerEqExp = fpa(ref s);
                        function += ")";
                        f         = new Expotential(innerEqExp);
                        // f = f.Simplify();
                        s = s.Remove(0, 1);
                    }
                    return(f);

                default:
                    MessageBox.Show("unhandled value for the input textbox: " + s[0]);
                    throw new ArgumentOutOfRangeException("unknown value");
                }
            }
            return(null);
        }