Antlr语法与预期的词法规则不匹配

Antlr语法与预期的词法规则不匹配,antlr,grammar,antlr4,Antlr,Grammar,Antlr4,我正在尝试使用以下规则匹配持续时间字符串,例如30分钟或2小时: durationPhrase: FOR_STR (MINUTE_DURATION | HOUR_DURATION); MINUTE_DURATION: NONZERO_NUMBER MINUTE_STR; HOUR_DURATION: NONZERO_NUMBER HOUR_STR; MINUTE_STR: 'minute'('s')?; HOUR_STR: 'hour'('s')?; FOR_STR: 'for';

我正在尝试使用以下规则匹配持续时间字符串,例如30分钟或2小时:

durationPhrase: FOR_STR (MINUTE_DURATION | HOUR_DURATION);

MINUTE_DURATION: NONZERO_NUMBER MINUTE_STR;

HOUR_DURATION: NONZERO_NUMBER HOUR_STR;

MINUTE_STR: 'minute'('s')?;

HOUR_STR: 'hour'('s')?;

FOR_STR: 'for';

NONZERO_NUMBER: [0-9]+;

WS: (' '|[\n\t\r]) -> skip;
通过以下输入:

for 30 minutes
尝试调试/匹配durationPhrase规则时,出现以下错误:

line 1:4 mismatched input '30' expecting {MINUTE_DURATION, HOUR_DURATION}
但我似乎不知道'30'匹配的是什么lexer规则?我的印象是最长的lexer规则将获胜,这将是分钟持续时间规则

它是否首先匹配非零_数?如果是,原因是什么?

它匹配的是非零值,因为其他两种模式都不适用。如果您输入了30分钟,它将匹配分钟持续时间,但作为令牌模式,分钟持续时间将不匹配空格字符

通过将->跳过应用到标记WS,可以忽略空白。这只能在WS被识别为令牌之后发生;i、 e.标记化后。在标记化过程中,空白字符只是字符

如果您使用分钟持续时间和小时持续时间语法规则而不是词汇规则,那么它应该可以正常工作。

它与非零值匹配,因为其他模式都不适用。如果您输入了30分钟,它将匹配分钟持续时间,但作为令牌模式,分钟持续时间将不匹配空格字符

通过将->跳过应用到标记WS,可以忽略空白。这只能在WS被识别为令牌之后发生;i、 e.标记化后。在标记化过程中,空白字符只是字符

如果您制定分钟持续时间和小时持续时间语法规则,而不是词汇规则,那么它应该可以正常工作