这应该是一个简单的问题。鉴于此解析器规则:
ifStatement
: expr3b=IF logical (~(THEN)) expression* (ELSE expression *)? ENDIF // missing THEN
;
为什么这不符合这个字符串?
"IF CODE=\"10\" DUE_DATE < YESTERDAY ENDIF"
(IF
,THEN
,ELSE
和ENDIF
定义的令牌完全符合您的假设。logical
和{{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_DATE
。 ifStatement
消费它以履行(~(THEN))
。这使< YESTERDAY
完成expression
,但失败了。
您的问题中的ifStatement
会接受以下输入,因为ENDIF
符合(~(THEN))
:
IF CODE=\"10\" ENDIF DUE_DATE < YESTERDAY ENDIF
这会按预期工作,因为第一个ENDIF
仅消耗 以匹配(~(THEN))
。