Написать парсер. Разработка с нуля. Пожелания и особенности: Объектные выражения на JavaScript Разработайте классы Const, Variable, Add, Subtract, Multiply, Divide, Negate для представления выражений с тремя переменными: x, y и z. Пример описания выражения 2x-3: let expr = new Subtract( new Multiply( new Const(2), new Variable(“x“) ), new Const(3) ); println(expr.evaluate(5, 0, 0)); При вычислении такого выражения вместо каждой переменной подставляется её значение, переданное в качестве аргумента метода evaluate. Таким образом, результатом вычисления приведенного примера должно стать число 7. Метод toString() должен выдавать запись выражения в обратной польской записи. Например, expr.toString() должен выдавать «2 x * 3 -». Функция parse должна осуществлять разбор выражений, записанных в обратной польской записи. Например, результатом parse(“x x 2 - * x * 1 +“)(5) должно быть число 76, а результатом parse(“x x 2 - * x * 1 +“).toString() — строка «x x 2 - * x * 1 +». Сложный вариант. Метод diff(“x“) должен возвращать выражение, представляющее производную исходного выражения по переменной x. Например, expr.diff(“x“) должен возвращать выражение, эквивалентное new Const(2). Выражения new Subtract(new Const(2), new Const(0)) и new Subtract( new Add( new Multiply(new Const(0), new Variable(“x“)), new Multiply(new Const(2), new Const(1)) ) new Const(0) ) так же будут считаться правильным ответом. Бонусный вариант. Требуется написать метод simplify(), производящий вычисления константных выражений. Например, parse(“x x 2 - * 1 +“).diff(“x“).simplify().toString() должно возвращать «x x 2 - +» или аналогичное по сложности эквивалентное выражение. При выполнении задания следует обратить внимание на: Применение инкапсуляции. Выделение общего кода для операций. Минимизацию необходимой памяти.