如何让ANTLR解析器严格遵循语法规则?
解决ANTLR语法仅接受纯'k'字符串的问题
你的问题源于当前语法未处理非'k'字符,ANTLR默认的错误恢复机制可能会跳过无法匹配的字符,导致包含其他字符的输入也能被“接受”。要实现仅允许全由'k'组成的字符串,只需在词法规则中添加匹配所有非'k'字符的规则,并强制触发错误。
修改后的语法如下:
grammar EXAMPLE; document : Name+ EOF; Name : 'k'+; // 匹配任何非'k'字符,直接触发词法错误 ErrorChar : . -> channel(HIDDEN), fail;
关键说明:
ErrorChar规则必须放在所有合法词法规则的最后:ANTLR词法规则按顺序匹配,确保先识别合法的Name,再捕获错误字符。.通配符匹配除换行外的所有非'k'字符,若需包含换行可替换为~'k'。-> channel(HIDDEN), fail会将错误字符转入隐藏通道,同时立即触发词法错误,阻止解析器继续处理后续内容。
测试验证:
- 输入
kkk:解析通过,符合语法要求。 - 输入
kkak或abc:触发ErrorChar规则,直接报错,拒绝解析。
内容的提问来源于stack exchange,提问作者Bachir Bendrissou
相关产品推荐
相关产品推荐

