0

我有以下语法来解析时间表达式,如“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”。?

4

0 回答 0