3

我想将带有空格的表达式匹配为单个标记。以下是我的词法分析器规则:

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()};

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

4

1 回答 1

2

如果我使用“12 小时”,我会得到 HOUR 令牌。但我使用“12 小时”,得到 INTEGER 和“小时”。

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

我该怎么做才能让词法分析器将整个“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)+;
于 2013-04-19T07:23:19.077 回答