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
相关产品推荐
相关产品推荐

