сделать уравнение из mathml, которое вычисляется python

Часть моих проектов связана с получением уравнения из mathml, которое можно отправить на python. Python должен легко обрабатывать уравнение. Mathml приведен ниже. Ожидаемое уравнение python также приведено ниже. Какую модификацию следует внести в этот javascript, чтобы получить что..

    var mList = ['pow', 'sin', 'cos', 'tan', 'sqrt', 'π'];

    function getDOM(xmlstring) {
        parser=new DOMParser();
        return parser.parseFromString(xmlstring, "text/xml");
    }
    function remove_tags(node) {
        var result = "";
        var nodes = node.childNodes;
        var tagName = node.tagName;
        if (!nodes.length) {
            /*if(mList.indexOf(node.nodeValue) != -1 ) {
                result += 'math.'
            }*/
            if (node.nodeValue == "π") result += "pi";
            else if (node.nodeValue == " ") result += "";
            else result += node.nodeValue;
        } else if (tagName == "mfrac") {
            result += "("+remove_tags(nodes[0])+")/("+remove_tags(nodes[1])+")";
        } else if (tagName == "msup") {
            result += "power(("+remove_tags(nodes[0])+"),("+remove_tags(nodes[1])+"))";

        } else for (var i = 0; i < nodes.length; ++i) {
            result += remove_tags(nodes[i]);
        }
        if (tagName == "mfenced") result = "("+result+")";
        if (tagName == "msqrt") result = "sqrt("+result+")";

        return result;
    }
    function stringifyMathML(mml) {
       xmlDoc = getDOM(mml);  
       return remove_tags(xmlDoc.documentElement);
    }

уравнение введите здесь описание изображения

mml="sin2x+cos2x+sin4x+3"; u = stringifyMathML (ммл); оповещение (ты)

вывод

 power((sin),(2))(x)+power((cos),(2))(x)+sin(4x+3)

но вывод должен быть

  power(sin(x),2)+power(cos(x),2)+sin(4*x+3)

предоставленная математика ::-

"<math><msup><mi>sin</mi><mn>2</mn></msup><mfenced><mi>x</mi></mfenced><mo>+</mo><msup><mi>cos</mi><mn>2</mn></msup><mfenced><mi>x</mi></mfenced><mo>+</mo><mi>sin</mi><mfenced><mrow><mn>4</mn><mi>x</mi><mo>+</mo><mn>3</mn></mrow></mfenced></math>"

следующую программу можно увидеть в jsfiddle: http://jsfiddle.net/user1989/g0ca42m2/2/ Какие изменения нужно внести в javascript, чтобы получить ожидаемый результат


person user1989    schedule 05.10.2015    source источник


Ответы (1)


Ваша «проблема» исходит из вашего «слепого» разбора.

Ваш первый вывод правильный. msup sin 2 mfenced x дает вам sin²(x) -> power(sin,2)(x).

Чтобы отобразить мощность (sin (x), 2), вы должны получить следующий узел (как «упреждающий просмотр») перед выполнением перевода. Быстрое исправление должно состоять в том, чтобы добавить аргумент nextNode (который может быть нулевым), а также основывать на нем свой синтаксический анализ.

person Benoit B.    schedule 05.10.2015
comment
Можете быть более конкретными? Если вы можете опубликовать в качестве ответа, это будет очень полезно! - person user1989; 08.10.2015
comment
Проблема должна быть в else if (tagName == "mfrac") { result += "("+remove_tags(nodes[0])+")/("+remove_tags(nodes[1])+")"; } - person user1989; 08.10.2015
comment
Может быть довольно сложно правильно проанализировать вашу строку. Вы пытаетесь получить полную поддержку MathML или просто пример, который вы привели? Вы должны искать парсер LR / LL / LALR, чтобы иметь представление о сложности. Возможно, вам следует поискать библиотеку, написанную на javascript или python, которая соответствует вашим потребностям. - person Benoit B.; 10.10.2015
comment
B не могли бы вы предложить приятеля по библиотеке, это будет более полезно. Я много исследовал, но не смог найти ни одного!! - person user1989; 13.10.2015