ANTLR4 - 匹配值超过9?

时间:2014-10-23 13:14:42

标签: regex antlr4

所以,我已经在我的汇编器上再次工作,这次我和浮点寄存器挂了。基本上,有32个fp寄存器。所以,如果我写F0,F1,F2,...,F31,我想匹配它们。我在我的词法分析员中写了以下内容:

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。那么,任何想法我怎么能处理这个?

先谢谢。

1 个答案:

答案 0 :(得分:1)

课程[0-31]01231(再次)相匹配。要强调:正则表达式类不匹配数值,而是(文本)字符。

要匹配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]