Привет, народ. Есть функция, которая парсит строку на предмет функций и заменяет их соответствующими значениями.
http://jsfiddle.net/johnthecreeper/ERSA2/116/
Здесь полный код. Вот сама функция:
function specFuncs(expression){
var funcList = /(sin\(\d+\.?\d*\))|(cos\(\d+\.?\d*\))|(\d+\.?\d*\^\d+\.?\d*)|(\d+\.?\d*\!)/gi;
expression = expression.replace(funcList, function(match,p1,p2,p3,p4,offset,string){
switch(match) {
case p1:
return Math.sin(parseFloat(match.replace(/[^\d+?\.\d*?]/gi,""))*(Math.PI/180)).toFixed(10).toString();
case p2:
return Math.cos(parseFloat(match.replace(/[^\d+?\.\d*?]/gi,""))*(Math.PI/180)).toFixed(10).toString();
case p3:
return Math.pow(match.split("^")[0],match.split("^")[1]).toFixed(10).toString();
case p4:
var temp = 1;
match = parseInt(match);
while(match) temp *= match--; return temp.toFixed(10).toString();
}
});
return expression;
}
На данный момент все работает, но я пытаюсь обработать такую строку:
2^2^2, после чего получаю результат 4. Добавляю в функцию алерты для выяснения сколько раз и для чего вызывается замена, и получается, что в первый раз функция замены ловит 2^2, а затем отдает на выход функции недорешенную строку 4.00000000^2. Сама по себе такая строка тоже парсится и решается, отдельно. При этом строка, например, вида
2^2 + 2! -3^1 парсится правильно, то есть сначала ловится 2^2, затем все остальное по очереди. И обе части с возведением в степень ловятся, а вот в первом случае, по идее, чем оно отличается? Сначала ловится одно возведение в степень, затем должно парсить строку с промежуточным результатом, найти там еще одну возможность замены и сматчить. Но не делает этого. Почему?