2017-04-08 49 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