ANTLR规则不匹配

ANTLR规则不匹配,antlr,Antlr,这应该是一个简单的问题。给定此解析器规则: ifStatement : expr3b=IF logical (~(THEN)) expression* (ELSE expression *)? ENDIF // missing THEN ; 为什么这个和这个字符串不匹配 "IF CODE=\"10\" DUE_DATE < YESTERDAY ENDIF" “如果代码=\“10\”到期日

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

ifStatement
 : expr3b=IF logical (~(THEN)) expression* (ELSE expression *)? ENDIF // missing THEN
 ;
为什么这个和这个字符串不匹配

"IF CODE=\"10\" DUE_DATE < YESTERDAY ENDIF"
“如果代码=\“10\”到期日<昨天结束如果”

IF
THEN
ELSE
ENDIF
是根据您的语法定义的标记。
logical
expression
是其他规则)。

我假设下面这行是您语法中的逐字

ifStatement : expr3b=IF logical (~(THEN)) expression* (ELSE expression *)? ENDIF;
如果是这种情况,则需要将其更改为:

ifStatement : expr3b=IF logical expression* (ELSE expression *)? ENDIF;
实际上,
(~(THEN))
说“匹配任何一个令牌,只要它不是
那么
逻辑
完成后的第一个令牌是
到期日的
ID
(或类似)
ifStatement
使用它来实现
(~(THEN))
。这使得
<昨天
完成了
表达式
,但失败了

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

IF code=\'10\'ENDIF到期日<昨天ENDIF

这将按预期工作,因为第一个
ENDIF
仅用于匹配
(~(THEN))

,而没有看到逻辑和表达式的结果,我猜想
code=“10”
是一个格式错误的表达式,可能是在
“10”
的词法处理中。但你提供的信息太少,不知道。是的,就是这样。(再次)谢谢你的帮助。
IF CODE=\"10\" ENDIF DUE_DATE < YESTERDAY ENDIF