Кароче написал клас, кому надо забирайте, вроде работает только нет приоритета операций. Работает и с целыми и дробными числами, и с отрицательными тоже

Код:
class inc.func.Calc extends Object{
private function isDigit(Ch:String):Boolean{
return not isNaN(parseInt(Ch));
}
private function isSign(Ch:String):Boolean{
var ret:Boolean=(Ch=='+') or (Ch=='-');
return ret;
}
private function isSeparator(Ch:String):Boolean{
var ret:Boolean=(Ch=='.');
return ret;
}
private function isOperator(Ch:String):Boolean{
switch(Ch){
case '+': return true; break;
case '-': return true; break;
case '/': return true; break;
case '*': return true; break;
default: return false; break;
}
}
private function Numbers(S:String, P:Number):Array{
var InitPos:Number;
InitPos=P;
if((P<S.length) && (this.isSign(S.charAt(P)))){
P++;
}
if((P>=S.length) || !this.isDigit(S.charAt(P))){
trace("Something fuck");
}
P++;
while(!(P>=S.length) && this.isDigit(S.charAt(P))){
P++;
}
if((P<S.length) && (this.isSeparator(S.charAt(P)))){
P++;
if((P>=S.length) || !this.isDigit(S.charAt(P))){
trace("Something fuck");
}
P++;
while(!(P>=S.length) && this.isDigit(S.charAt(P))){
P++;
}
}
var _ret:Array=Array();
_ret['result']=parseFloat(S.substr(InitPos,P-InitPos));
_ret['P']=P;
return _ret;
}
public function expr(S:String):Number{
var P:Number;
var opSymb:String;
var res:Object;
var Result:Number;
P=0;
res=this.Numbers(S,P);
P=res.P;
Result=res.result;
while(P<S.length && this.isOperator(S.charAt(P))){
opSymb=S.charAt(P);
P++;
res=this.Numbers(S,P);
P=res.P;
var Result_2:Number=res.result;
switch(opSymb){
case '+': Result=Result+Result_2; break;
case '-': Result=Result-Result_2; break;
case '/': Result=Result/Result_2; break;
case '*': Result=Result*Result_2; break;
}
}
if(P<S.length){
trace("Something fuck");
}
return Result;
}
}
//Пример работы
import inc.func.Calc;
var cl:Calc=new Calc();
trace("Result:"+cl.expr("7-8+10")); // Выводит -11.
Если есть идеи как улучшить код, подскажите!