2017-05-06 24 views
1

私は単純な端末計算機を作っていますが、何らかの理由で関数がwhileループ内で実行されていませんが、ループの外側で実行されます。この入力を考えると関数はループ内で実行されません

((1 + 2) + (3 + 4))

それはすべき出力:10

しかし、それは彼らの結果に最も内側の式を置き換えることはありませんので、無限ループで立ち往生。実行されません

機能は、ここでs.replace(basicOp, answer);

ある問題の抜粋です:([number] [operator] [number])

public static function processInput(s:String):String 
{ 
    var result:Null<Float> = parseNumber(s); 

    if (result != null) 
    { 
     return Std.string(result); 
    } 

    var closeParPos:Int = 0; 
    var openParPos:Int = 0; 
    var basicOp:String; 
    var answer:String = ""; 

// ERROR HERE 
    while (Std.string(answer) != s) 
    { 
     closeParPos = s.indexOf(")"); 
     openParPos = s.lastIndexOf("(", closeParPos); 

     basicOp = s.substring(openParPos, closeParPos + 1); 

     answer = processBasicOp(basicOp); 
// This isn't executed 
     s.replace(basicOp, answer); 

     trace("Input: " + s + " basicOp: " + basicOp + " Answer: " + answer); 
    } 

    return (result == null)? "": Std.string(result); 
} 

すべてのコードがちょうどmake test

入力構文は実行hereですまたは([operator] [number])
番号とオペレータの間にスペースが1つ必要です。

サポートされる操作番号と括弧の間に空白があってはならない。

+-/*
%(余り)、
div(商)、
sqr(四角)、
sqroot(平方根)、
sincostan(盗聴度、中)
fact(階乗)それはまだ完了していない

、そこに他の問題であってもよいが、この問題が進行するから私を防ぐことがあります。

誰かが解決策を見つけるのを手助けできますか?

ありがとうございます。

+0

s.replace(basicOp, answer);を変更してみてください。たぶんあなたはそれを見ることができます。 より高度なhaxeパーサが必要な場合は、多くの種類のHaxeコードを実行できるhscript(https://github.com/HaxeFoundation/hscript)をご覧ください。 –

+0

@MarkKnol可能であれば、あなたの図書館をチェックします。 –

答えて

3

私は実際にこれを実行することはできませんが、StringTools.replace()はインプレースの文字列を変更しません。 、/と* -

は、私は、このためのhaXeのライブラリ(https://github.com/markknol/hx-mathparser)を作成しただけのグループをサポートし、+、ということs = s.replace(basicOp, answer);

+0

私は 'make test 'を意味したので実行しないかもしれませんが、' make run'と書いてありました。それで解決しました、私はちょうど結果を割り当てる必要がありました、ありがとう。 –

関連する問題