所以,我又在组装程序上工作了,这次我挂起了浮点寄存器。基本上,有32个fp寄存器。所以,我想匹配它们,如果我写F0,F1,F2。。。,F31.我在我的lexer中写了以下内容:
REG
: ('R0'|'r0')
| ('AT'|'at')
| ('v'[0-1]|'V'[0-1])
| ('a'[0-3]|'A'[0-3])
| ('t'[0-9]|'T'[0-9])
| ('s'[0-9]|'S'[0-8])
| ('k'[0-1]|'K'[0-1])
| ('GP'|'gp')
| ('SP'|'sp')
| ('FP'|'fp')
| ('ra'|'RA')
| ('f'[0-31]|'F'[0-31])+
;
基本上,这里的每个寄存器都能正常工作。但F0-F31似乎不起作用。我测试了一下,发现它只匹配F0-F3,但没有更高的匹配度。这在那一刻非常明显,我不知道如何匹配超过10的值。我还尝试了一些变通方法,比如在其他方法后面添加更多的[0-9],但这没有帮助,因为它会匹配F36或F39等稍后的值。你知道我该怎么处理吗?
提前感谢。
类[0-31]
与0
、1
、2
、3
或1
匹配(再次)。需要强调的是:正则表达式类不匹配数值,而是(文本)字符。
为了匹配F0、F1、F2。。。,F31(和f0,f1,f2,…,F31),做这样的事情:
FREG
: [fF] ( [0-9] // matches f0..f9 (and F0..F9)
| [1-2] [0-9] // matches f10..f29 (and F10..F29)
| '3' [01] // matches f30 or f31 (and F30 or F31)
)
;
完整的REG
规则可以写如下:
REG
: [rR] '0'
| 'AT' | 'at'
| [vV] [01]
| [aA] [0-3]
| [tT] [0-9]
| [sS] [0-9]
| [kK] [01]
| 'GP' | 'gp'
| 'SP' | 'sp'
| 'FP' | 'fp'
| 'RA' | 'ra'
| [fF] ( [0-9] | [1-2] [0-9] | '3' [01] )
;
请注意,[01]
和[0-1]
匹配相同:'0'
或'1'
。还要注意,'ra' | 'RA'
与'Ra'
不匹配。如果您希望'Ra'
和'rA'
也匹配,请这样写:[rR] [aA]
。