You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ANTLR4配置IF条件括号两侧至少1个空格时搭配ELSE块报错如何解决

问题根源

你当前的语法存在两个核心冲突:

  • 同时定义了SPACE规则和WS规则,且WS会直接跳过所有空格、制表符,导致语法规则里的SPACE永远匹配不到任何内容,空格在词法分析阶段就已经被提前吃掉了
  • condition_block的空格约束逻辑和IF、ELSE的衔接逻辑不适配

修复后完整语法

prog: stat_block EOF;

stat_block: OBRACE block CBRACE;

block: stat*;

stat: expr ';'
 | IF condition_block (ELSE stat_block)?
 ;

expr
 : expr SPACE ('*' | '/') SPACE expr
 | ID
 | INT
 | STRING
 ;

exprList: expr (',' expr)*;

// 仅约束IF条件括号两侧必须有空格
condition_block: OPAR SPACE expr SPACE CPAR SPACE stat_block;

// 词法规则调整
IF:      'IF' SPACE; // 要求IF后必须跟至少1个空格
ELSE:    'ELSE' SPACE; // 要求ELSE后必须跟至少1个空格
OPAR:    '(';
CPAR:    ')';
OBRACE:  '{';
CBRACE:  '}';
SPACE: ' '+; // 匹配1个及以上普通空格
ID:      [a-zA-Z]+;
INT:     [0-9]+;
STRING:  '"' (~["\\] | '\\' .)* '"'; // 补全缺失的STRING匹配规则
NEWLINE: '\r'? '\n'  -> skip;
// 移除原有的WS跳过规则,避免空格被提前吞掉

验证说明

你给出的预期输入IF ( 3 ) { } ELSE { }已经可以正常解析,规则仅针对IF条件括号做两侧至少1个空格的强制约束,其他位置的空格规则保持灵活。如果需要允许制表符作为合法空格,把SPACE的匹配规则改成[ \t]+即可。

内容的提问来源于stack exchange,提问作者ahsan ayub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:15:10