2017-04-08 53 views
1

我一直在試圖制定,檢查針對MIPS指令的表情像這樣的:正則表達式bash腳本過濾MIPS指令

lw $t1 70000($s0) 

我對lw$t1部分則表達式,但我卡在70000($s0)部分。

($s0)前的數量不能超過−3276832767,所述$具有在那裏只有一次,s部分必須是一個st和只出現一次,之後數只能從0-7s範圍和0-9t

任何幫助,將不勝感激。

這裏是我對$s0部分從我的腳本的另一部分的表達:

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

if語句我在使用這種檢查,如果輸入的文本是有效的,它主要是爲前綴數字部分我堅持。

感謝

EDIT1:我已成功地使用offset=${w3%(*}第一(之前將字符串截斷到($s0)值分開。我的腳本不會處理任何值,例如(之前的值。

我現在需要檢查這個值是小於−32768還是大於32767。任何想法如何我可以將其歸檔?

EDIT2:我已經設法解決了我的問題,並將解決方案作爲答案發布,這要歸功於所有回覆。

+1

範圍檢查是否有任何理由需要在正則表達式內?對數字使用簡單的通用表達式會更容易,然後通過引用捕獲組來檢查特定值。 –

+0

我想這會更容易,但我是新來的bash和正則表達式不是我的強項之一,所以我不知道如何單獨檢查數字部分。你能舉個例子嗎? – 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 

它檢查第一個字符是-,如果它大於32768或者數字剛好大於32767

指令的其餘部分只是使用正則表達式來檢查它。

1

(-?[0-9]{1,5})\(\$(s[0-7]|t[0-9])\) 我同意用正則表達式檢測數值範圍是浪費時間。上面描述了抵消和註冊,正如你所描述的那樣,稍作修正和簡化。

+1

你能否提供一些評論或解釋給你的答案? – kvorobiev