ANTLR:匹配具有空格的标记

时间:2013-04-19 07:13:09

标签: token antlr3 lexer

我希望将带有空格的表达式作为单个标记进行匹配。以下是我的词法规则:

HOUR : (INTEGER) ('hour'|'hours') ;
MINUTE : (INTEGER) ('min'|'minute'|'minutes') ;
INTEGER : '0' 'x' (HEXDIGIT)+ | (DIGIT)+ ;
fragment DIGIT    : '0'..'9';
fragment HEXDIGIT : 'a'..'f' | 'A'..'F' | DIGIT;
WS : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ {skip()};

如果我使用' 12小时',我会获得 HOUR 令牌。但我使用' 12小时',获得INTEGER和'小时'。我该怎么做才能让词法分析器作为单个HOUR令牌返回整个“12小时”?

1 个答案:

答案 0 :(得分:2)

  

如果我使用' 12小时',我会获得HOUR令牌。但我使用了12小时',得到INTEGER和'小时'。

是的,这是预期的行为。这是因为WS仅从解析器规则中跳过。

  

我可以做些什么来让lexer全程返回12小时'作为单个HOUR令牌?

HOUR规则中包含空格:

// Don't use `WS` in this token, or `skip()` will be  
// invoked and this token will also be skipped!
HOUR : (INTEGER) SPACE* ('hour'|'hours') ;

WS : SPACE+ {skip();};

fragment SPACE : '\t' | ' ' | '\r' | '\n'| '\u000C';

或者,IMO首选方式,为这样的事情创建一个解析规则:

hour : INTEGER HOUR;

HOUR : 'hour' | 'hours' ;
INTEGER : '0' 'x' (HEXDIGIT)+ | (DIGIT)+;