【问题标题】:Antlr grammar not matching expected lexer ruleAntlr 语法与预期的词法分析器规则不匹配
【发布时间】:2018-06-25 12:23:07
【问题描述】:

我正在尝试使用以下规则匹配持续时间字符串,例如 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?如果是这样,为什么?

【问题讨论】:

    标签: antlr grammar antlr4


    【解决方案1】:

    它与NONZERO_NUMBER 匹配,因为其他模式都不适用。如果您输入了30minutes,它会匹配MINUTE_DURATION,但作为一个标记模式,MINUTE_DURATION 不会匹配空格字符。

    您可以通过将-> skip 应用于令牌WS 来忽略空格。这只能在WS 被识别为令牌之后发生;即在标记化之后。在标记化期间,空白字符只是字符。

    如果您制定 MINUTE_DURATIONHOUR_DURATION 语法规则而不是词法规则,它应该可以按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2022-10-13
      相关资源
      最近更新 更多