我有以下语法来解析时间表达式,如“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' 这样的表达式很有效,但是当十六进制值与没有空格的 day 一起使用时会失败。像'0x23day 0x56hour'。在这种情况下,词法分析器创建一个值为 '0x23da' 的 INTEGER 标记。因此,'day' 解析器没有得到 INTEGER,而是得到 INTEGER,'y'。我该怎么做才能让词法分析器给我 0x23 作为 INTGER 和“day”。?