我有解释时间表达式的语法,例如'1天2小时'。
time : timeLiteral
| FLOAT
| INTEGER
;
timeLiteral : dayExpr hourExpr? minuteExpr? ;
dayExpr : timeVal ('days' | 'day') ;
hourExpr : timeVal ('hour'|'hours') ;
minuteExpr : timeVal ('minutes' | 'minute') ;
timeVal : INTEGER | FLOAT ;
INTEGER : '0' 'x' (HEXDIGIT)+
| (DIGIT)+
;
FLOAT : '.' (DIGIT)+ (EXPONENT)?
| ((DIGIT)+ '.') => (DIGIT)+ '.' (DIGIT)* (EXPONENT)?
| (DIGIT)+ ('.' (DIGIT)*)? EXPONENT
;
fragment DIGIT : '0'..'9';
fragment HEXDIGIT : 'a'..'f' | 'A'..'F' | DIGIT;
fragment EXPONENT : ('e' | 'E') ('+' | '-')? (DIGIT)+;
这适用于像“1day 2hour”这样的表达式,但是在没有空格的情况下使用十六进制值时会失败。喜欢'0x23day 0x56hour'。在这种情况下,词法分析器会创建一个值为“0x23da”的INTEGER标记。因此,'day'解析器不是获取INTEGER,而是获得INTEGER,'y'。 我能做些什么让词法分析器给我0x23作为INTGER和'day'。?