2

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

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

为什么这与这个字符串不匹配?

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

IF, THEN, ELSE, 和ENDIF是完全按照您所假设的那样定义的标记。logical并且expression是其他规则)。

4

1 回答 1

1

我假设以下行是您语法中的逐字记录。

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

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

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

事实上,(~(THEN))说“匹配任何一个令牌,只要它不是THEN。” 完成后的第一个标记logicalID(或类似的) for DUE_DATEifStatement消耗它来完成(~(THEN))。这离开< YESTERDAYexpression,但失败了。

您的问题中将接受以下输入,ifStatement因为ENDIF满足(~(THEN))

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

这将按预期工作,因为第一个用于ENDIFmatch 。(~(THEN))

于 2012-12-10T19:44:01.123 回答