Even Function

 //eval function

    public static double eval(final String str) {

        return new Object() {

            int pos = -1, ch;


            void nextChar() {

                ch = (++pos < str.length()) ? str.charAt(pos) : -1;

            }


            boolean eat(int charToEat) {

                while (ch == ' ') nextChar();

                if (ch == charToEat) {

                    nextChar();

                    return true;

                }

                return false;

            }


            double parse() {

                nextChar();

                double x = parseExpression();

                if (pos < str.length()) throw new RuntimeException("Unexpected: " + (char)ch);

                return x;

            }


            // Grammar:

            // expression = term | expression `+` term | expression `-` term

            // term = factor | term `*` factor | term `/` factor

            // factor = `+` factor | `-` factor | `(` expression `)`

            //        | number | functionName factor | factor `^` factor


            double parseExpression() {

                double x = parseTerm();

                for (;;) {

                    if      (eat('+')) x += parseTerm(); // addition

                    else if (eat('-')) x -= parseTerm(); // subtraction

                    else return x;

                }

            }


            double parseTerm() {

                double x = parseFactor();

                for (;;) {

                    if      (eat('*')) x *= parseFactor(); // multiplication

                    else if (eat('/')) x /= parseFactor(); // division

                    else return x;

                }

            }


            double parseFactor() {

                if (eat('+')) return parseFactor(); // unary plus

                if (eat('-')) return -parseFactor(); // unary minus


                double x;

                int startPos = this.pos;

                if (eat('(')) { // parentheses

                    x = parseExpression();

                    eat(')');

                } else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers

                    while ((ch >= '0' && ch <= '9') || ch == '.') nextChar();

                    x = Double.parseDouble(str.substring(startPos, this.pos));

                } else if (ch >= 'a' && ch <= 'z') { // functions

                    while (ch >= 'a' && ch <= 'z') nextChar();

                    String func = str.substring(startPos, this.pos);

                    x = parseFactor();

                    if (func.equals("sqrt")) x = Math.sqrt(x);

                    else if (func.equals("sin")) x = Math.sin(Math.toRadians(x));

                    else if (func.equals("cos")) x = Math.cos(Math.toRadians(x));

                    else if (func.equals("tan")) x = Math.tan(Math.toRadians(x));

                    else if (func.equals("log")) x = Math.log10(x);

                    else if (func.equals("ln")) x = Math.log(x);

                    else throw new RuntimeException("Unknown function: " + func);

                } else {

                    throw new RuntimeException("Unexpected: " + (char)ch);

                }


                if (eat('^')) x = Math.pow(x, parseFactor()); // exponentiation


                return x;

            }

        }.parse();

    }


Comments

  1. HI dear,
    I am Mohibul Islam from India , I am also a engneeing student . you are video is too good and helpful ,be continue your work .
    are you working anywhere ?
    can we be friends ?
    contact: mohibultpc394@gmail.com

    ReplyDelete

Post a Comment

Popular posts from this blog