用于Bash脚本的正则表达式来过滤MIPS指令



我一直在尝试设计一个表达式来检查MIPS指令,例如:

lw $t1 70000($s0)

我对lw$t1部分有表达式,但我被困在70000($s0)部分。

($s0)之前的数字不能超过−3276832767$只能存在一次,s部分必须是st并且只出现一次,之后的数字只能从0-7s0-9t

对此的任何帮助将不胜感激。

这是我对脚本另一部分中$s0部分的表达式:

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

我在 if 语句中使用它来检查输入的文本是否有效,它主要是我卡在上面的前缀数字部分。

谢谢

EDIT1:我设法使用offset=${w3%(*}将字符串截断到第一个(之前,将值与($s0)分开。我的脚本不会处理任何内容,例如值之前的(

我现在需要检查此值是小于−32768还是大于32767.关于如何存档的任何想法?

编辑2:我已经设法解决了我的问题,并发布了解决方案作为答案,感谢所有回复。

(-?[0-9]{1,5})($(s[0-7]|t[0-9]))我同意让正则表达式检测数字范围是浪费精力。上面捕获了您描述的偏移和寄存器,并进行了一些更正和简化。

好的,我已经设法解决了这个问题,方法如下:

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

指令的其余部分只是使用正则表达式来检查它。

最新更新