Antlr解析十六进制数

时间:2013-04-18 21:03:40

标签: antlr3 lexer

我有解释时间表达式的语法,例如'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'。?

0 个答案:

没有答案