Привет всем! Я тут недавно поднимал на форуме тему "как из строки типа

Код AS1/AS2:
'5*6^3/(x+1))*(-5)'
"
получить значение?
Так вот я немного попарился и написал свою функцию
Я еще новичек и не кидайтесь пожалуста ругательствами и ботинками.
У моей функции много недостатков. Если есть какие-то предложения говорите.
Вот код

Код AS1/AS2:
var MathObj:Object = new Object();
MathObj.T=[];
MathObj.T['A3']=3;
function Mathematic(s:String):Number {{
kl = 2;
while (kl>1) {
trace(s);
r = findMaxS(s);
startIndex = r[0];
kl = r[1];
k = '';
i = startIndex;
letter = s.charAt(i);
while (letter != ')' && i<s.length) {
k += letter;
letter = s.charAt(++i);
}
startIndex;
endIndex = i-1;
s1 = s.substr(0, startIndex-1);
s2 = s.substr(startIndex, (endIndex-startIndex+1));
s3 = s.substr(endIndex+2, (s.length-endIndex));
//trace(s1+'('+s2+')'+s3);
trace('Send '+s2);
s = s1+breakToOperation(s2)+s3;
}
}
runD(s)
return runD(s)
};
function findMaxS(s:String):Array {
g = 0;
k = 0;
startIndex = 0;
endIndex = 0;
gmax = 0;
litter = s.charAt(0);
for (i=0; i<s.length; i++) {
letter = s.charAt(i);
if (letter == '(') {
g++;
k++;
if (g>gmax) {
gmax = g;
startIndex = i;
}
}
if (letter == ')') {
g--;
}
}
a = [];
a[0] = gmax;
a[1] = k;
return a;
}
function breakToOperation(s:String):String {
{
operations = 0;
for (i=0; i<s.length; i++) {
litter = s.charAt(i);
if (litter == '[' || litter == '{') {
while (litter != ']' && litter != '}') {
litter = s.charAt(++i);
}
}
if (litter == '/' || litter == '^' || litter == '*' || litter == '+' || litter == '-') {
operations++;
}
}
for (n=0; n<operations; n++) {
litter = '';
str1 = '';
str2 = '';
str3 = '';
startIndex = 0;
endIndex = 0;
oprIndex = 0;
firstP = false;
for (i=0; i<s.length; i++) {
litter = s.charAt(i);
//|| litter == '+' || litter == '-'
if (litter == '[' || litter == '{') {
//trace ('I ' +i)
while (litter != ']' && litter != '}') {
litter = s.charAt(++i);
}
//trace ('I ' +i)
}
if (litter == '/' || litter == '^' || litter == '*') {
firstP = true;
break;
}
}
if (firstP == false) {
for (i=0; i<s.length; i++) {
litter = s.charAt(i);
if (litter == '[' || litter == '{') {
//trace ('I ' +i)
while (litter != ']' && litter != '}') {
litter = s.charAt(++i);
}
//trace ('I ' +i)
}
//|| litter == '+' || litter == '-'
if (litter == '+' || litter == '-') {
break;
}
}
}
oprIndex = i;
//trace('oprIndex: '+i);
litter = s.charAt(--i);
while (litter != '{' && litter != '[') {
litter = s.charAt(--i);
}
startIndex = i;
i = oprIndex;
litter = s.charAt(++i);
while (litter != '}' && litter != ']') {
litter = s.charAt(++i);
}
endIndex = i;
//trace(startIndex+' | '+endIndex);
//k='';
str1 = s.substr(0, startIndex);
//trace ('! '+str1)
str2 = s.substr(startIndex, (endIndex-startIndex+1));
//trace ('! '+str2)
str3 = s.substr(endIndex+1, (s.length-endIndex));
//trace ('! '+str3)
//s='';
s = str1+'['+runD(str2)+']'+str3;
}
trace('S :'+s);
return s;
}
};
function runD(s:String):Number {
{
k = '';
var n1:Number;
var n2:Number;
var op:String = '';
arrayName = '';
arrayAtr = '';
for (i=0; i<s.length; i++) {
litter = s.charAt(i);
if (litter == '{') {
i++;
litter = s.charAt(i);
while (litter != '|') {
arrayName += litter;
litter = s.charAt(++i);
}
litter = s.charAt(++i);
while (litter != '}') {
arrayAtr += litter;
litter = s.charAt(++i);
}
if (n1 == undefined) {
n1 = getValue(arrayName, arrayAtr);
} else {
n2 = getValue(arrayName, arrayAtr);
}
arrayName = '';
arrayAtr = '';
}
if (litter == '[') {
i++;
litter = s.charAt(i);
while (litter != ']') {
k += litter;
litter = s.charAt(++i);
}
if (n1 == undefined) {
n1 = Number(k);
} else {
n2 = Number(k);
}
k = '';
}
if (litter == '/' || litter == '^' || litter == '*' || litter == '+' || litter == '-') {
op = litter;
}
}
//trace(n1+' | '+n2);
return count(n1, n2, op);
}
};
function getValue(ArrayName:String, AttributeName:String):Number {
return _root.MathObj[ArrayName][AttributeName];
}
function count(n1:Number, n2:Number, op:String):Number {
if (op == '/') {
return n1/n2;
}
if (op == '*') {
return n1*n2;
}
if (op == '-') {
return n1-n2;
}
if (op == '+') {
return n1+n2;
}
if (op == '^') {
return Math.pow(n1, n2);
}
}
Пример:

Код AS1/AS2:
k = '(([1]/{T|A3}-{T|A3})*{T|A3}+[1]-[5])*[1]'; // выводит -12 при {T|A3}=3
И сразу же вопрос как вызвать функцию которая описанна в функции???
Добавлено через 26 минут
И сразу же вопрос как вызвать функцию которая описанна в функции???
Всмысле у меня не получилось слить их в 1 функцию.
Вообще у меня цели такие стоят
1) в одну функцию
2) Обьект передается в функцию а не лежит в root