Antlr4语法缩进匹配失败:输入空格为何未被识别?
问题分析与解决
问题描述
定义了如下Antlr4语法片段:
bullet: indent star string date? tag? EOL;
其中相关词法/语法规则:
SPACES: [ \t]+; indent: SPACES?;
用该语法处理输入行:
* [X] Monitoring and analyzing signals and waveforms (2024-02-22) #21ebdd44
出现报错:
extraneous input ' ' expecting {<EOF>, '# ', SPACES, STAR}
核心原因
1. SPACES规则被定义为fragment(最可能)
在完整语法中,若SPACES被标记为fragment(如fragment SPACES: [ \t]+;),则它只能被其他词法规则引用,无法作为独立token被语法规则直接调用。此时indent: SPACES?;无法识别输入的空格,导致连续空格被视为非法输入。
2. 词法规则匹配逻辑冲突
若SPACES是普通词法规则,但定义顺序过晚,或存在其他能匹配空格的规则(如单个空格的WS规则),会导致词法分析器无法将连续空格识别为SPACES token,进而触发语法分析错误。
解决方案
方案1:修正SPACES规则类型
若SPACES是fragment,去掉fragment修饰,将其改为普通词法规则:
SPACES: [ \t]+;
此时语法规则indent: SPACES?;可正确匹配连续空格/制表符,词法分析器会将输入的四个空格识别为SPACES token,供bullet规则的indent部分匹配。
方案2:跳过空格(若无需保留缩进信息)
若缩进仅用于格式分隔,无需在语法中保留,可将SPACES设置为跳过:
SPACES: [ \t]+ -> skip;
同时简化bullet规则(空格会被词法分析器自动跳过):
bullet: star string date? tag? EOL;
验证
修改后执行以下命令重新测试:
antlr4-parse grammar/task2report.g4 top tests/test.md
即可正常解析目标输入行。
内容的提问来源于stack exchange,提问作者vijayvithal
相关产品推荐
相关产品推荐

