Intellij Grammar Kit缩进式语言解析报错:':'预期却得到':'
解决Grammar-Kit缩进解析时冒号被错误消耗的问题
调整BNF结构,隔离缩进宏与关键符号
把包含冒号的语法部分和缩进块逻辑拆分,避免缩进宏直接跟在需要保留的符号后:
ImportStmt ::= "import" ':' ImportBlock ImportBlock ::= <<indented ImportDefinition+>>
这种拆分让冒号被ImportStmt明确匹配后,再调用缩进宏处理后续的ImportDefinition块,从结构上避免宏误吞符号。
修复SPPParserUtil的indented方法实现
检查你的indented方法,确保它只做缩进级别判断,不消耗非空白token:
- 移除方法中任何主动调用
consumeToken()或advance()的逻辑,除非是处理缩进相关的空白/换行 - 参考Nim插件的实现,确保方法仅基于当前token的缩进位置返回布尔值,不修改token流的指针位置
即使你设置方法始终返回true,若内部存在隐性的token消耗逻辑,依然会吞掉冒号,这是核心排查点。
用%pin指令固定关键token
在BNF中给冒号添加%pin指令,强制Grammar-Kit优先匹配该token,防止被缩进宏的逻辑干扰:
ImportStmt ::= "import" %pin ':' <<indented ImportDefinition+>>
%pin会锁定这个token的匹配优先级,确保它在缩进宏执行前被正确识别并保留。
内容的提问来源于stack exchange,提问作者SamG101
相关产品推荐
相关产品推荐

