2017-04-08 9 views
1

をフィルタリングするためのbashスクリプトのために、私が上でこのようなMIPS命令に対するチェック式を考案しようとしている:私はlwの式と$t1部分を持っていますが、私は正規表現は、MIPS命令

lw $t1 70000($s0) 

70000($s0)部分に貼り付けてください。

($s0)−32768又は32767を超えることができない前に、$一度だけ存在する必要があり、s部分はs又はtことが一度だけ発生することがあり、その後数だけsため0-7の範囲とすることができますtの場合は0-9です。

これに関するお手伝いがあれば幸いです。私は、入力されたテキストが有効であるかどうかを確認するif文でこれを使用しています

^(\$((s?[0-7])|(t?([0-9]))))$ 

、それは主に付けられ:ここでは

は、私が持っている表現は私のスクリプトの他のセクションから$s0部分があります私は立ち往生しています。

おかげ

EDIT1:は、私が最初に(の前に文字列を切り捨てるoffset=${w3%(*}を使用して($s0)から値を分離するために管理しています。私のスクリプトは値の前に(のようなものを扱わないでください。

この値が−32768より小さいか、32767より大きいかどうかを確認する必要があります。どのようにアーカイブすることができますか?

EDIT2:私は自分の問題を解決して解決策を回答として投稿しました。

+1

範囲チェックが正規表現内にある必要がある理由はありますか?単純な一般式を数値に使用する方が簡単ですし、後でキャプチャグループを参照して特定の値を確認してください。 –

+0

私はそれが簡単だろうと思うが、私はbashとregexが私の強みの一つではないので、私は別に番号の部分をどうやってチェックするのか分からない。一例を挙げてください。 – HarmanU

答えて

0

私はここに、この問題を解決するために管理しているオーケーはどのようにある:

offset1=${w3%(*}             # retrive the offset of the instruction 

     if [[ ${offset1:0:1} == "-" ]]; then           # if the first char is a - then, 
      offset1NoSign=${w3%(*}            # get the offset number 
      offset1NoSign=${offset1NoSign##*-}          # get rid of the - 
      echo " This should not have a - sign: $offset1NoSign" 
     fi 

     if [[ (${offset1:0:1} == "-" && $offset1NoSign -gt "32768") || ($offset1 -gt "32767") ]]; then 
      echo "Out of bounds immediate. Immediates range between −32768 and 32767." 

     else 

---- rest of code ---- 

は、その非常にきれいではありませんが、それは動作します。最初にoffset1=${w3%(*}を使用して文字列を切り捨てて、(の前の数値を取得します(たとえば、-500($s0)は、-55に切り捨てられます)。

最初の文字はので、それを削除した場合-されている場合、それはチェック:

if [[ ${offset1:0:1} == "-" ]]; then           # if the first char is a - then, 
      offset1NoSign=${w3%(*}            # get the offset number 
      offset1NoSign=${offset1NoSign##*-}          # get rid of the - 
      #echo " This should not have a - sign: $offset1NoSign" 
     fi 

次に、それは二つの数字

if [[ (${offset1:0:1} == "-" && $offset1NoSign -gt "32768") || ($offset1 -gt "32767") ]]; then 
      echo "Out of bounds immediate. Immediate range between −32768 and 32767." 

     else 

を超えた場合、最初の文字がAであればそれはチェックチェック-であり、それが32768より大きい場合、またはその数がちょうど32767より大きい場合。

残りの命令は、正規表現を使用してチェックするだけです。

1

(-?[0-9]{1,5})\(\$(s[0-7]|t[0-9])\) 正規表現で数値範囲を検出するのは無駄なことに同意します。上の説明では、オフセットとキャプチャを説明したように、少し訂正と簡略化して示しています。

+1

答えにいくつかのコメントや説明を付けることができますか? – kvorobiev