ANTLR规则不匹配

时间:2012-12-10 12:57:55

标签: antlr

这应该是一个简单的问题。鉴于此解析器规则:

ifStatement
 : expr3b=IF logical (~(THEN)) expression* (ELSE expression *)? ENDIF // missing THEN
 ;

为什么这不符合这个字符串?

"IF CODE=\"10\" DUE_DATE < YESTERDAY ENDIF"

IFTHENELSEENDIF定义的令牌完全符合您的假设。logical和{{1是其他规则)。

1 个答案:

答案 0 :(得分:1)

我假设以下行是你的语法中的verbatum。

ifStatement : expr3b=IF logical (~(THEN)) expression* (ELSE expression *)? ENDIF;

如果是这种情况,那么您需要将其更改为:

ifStatement : expr3b=IF logical expression* (ELSE expression *)? ENDIF;

实际上,(~(THEN))表示“匹配任何一个令牌,只要它不是THEN”。 logical完成后的第一个令牌是ID(或类似)DUE_DATEifStatement消费它以履行(~(THEN))。这使< YESTERDAY完成expression,但失败了。

您的问题中的ifStatement会接受以下输入,因为ENDIF符合(~(THEN))

IF CODE=\"10\" ENDIF DUE_DATE < YESTERDAY ENDIF

这会按预期工作,因为第一个ENDIF仅消耗 以匹配(~(THEN))