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