我希望将带有空格的表达式作为单个标记进行匹配。以下是我的词法规则:
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小时”?
答案 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)+;