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

时间:2018-06-25 12:23:07

标签: antlr grammar antlr4

我正在尝试使用以下规则匹配持续时间字符串,例如for 30 minutesfor 2 hours

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”匹配的词法规则是什么?我印象中,“最长的”词法分析器规则将获胜,将是 MINUTE_DURATION规则。

是先匹配NONZERO_NUMBER吗?如果是这样,为什么?

1 个答案:

答案 0 :(得分:3)

它与NONZERO_NUMBER匹配,因为其他任何模式都不适用。如果您输入了30minutes,它将与MINUTE_DURATION相匹配,但是作为令牌模式,MINUTE_DURATION将不与空格字符匹配。

通过将-> skip应用于令牌WS,可以忽略空格。只有在WS被识别为令牌之后,才会发生这种情况;即在标记化之后。在标记化过程中,空格字符只是字符。

如果您制定MINUTE_DURATIONHOUR_DURATION语法规则而不是词法规则,那么它应该可以正常工作。