ANTLR解析整数与带引号字符串时出现错误的问题求助
解决ANTLR自定义语言中整数解析的错误问题
我看到你在使用ANTLR构建自定义语言时遇到了整数解析的问题,错误提示类似line 1:18 extraneous input '123' expecting {' ', INT, QSTRING},这个问题的核心原因是你在语法中处理空白符的方式不正确,同时操作数的规则定义也有问题,咱们一步步来修复:
问题根源分析
你的语法里存在两个关键问题:
- 没有处理普通空白符(空格、制表符):你只定义了
NEWLINE和COMMENT规则,但没有处理空格和制表符,ANTLR不会自动跳过这些字符,导致解析器无法正确识别操作数之间的分隔。 - 操作数规则硬编码空格前缀:
instruction_operand: ' '+ (operand_int | operand_string);这条规则要求每个操作数前面必须有一个或多个空格,但这种写法会让解析器在匹配时混淆空格的归属,而且和未处理的空白符规则冲突,最终导致整数无法被正确匹配。
解决方案
我们需要调整语法规则,让词法分析器自动处理空白符,同时简化操作数的规则定义:
1. 添加空白符处理规则
在词法规则中添加WS规则,将空格和制表符发送到隐藏通道,这样ANTLR会自动跳过这些字符,不需要在语法规则中手动处理:
WS: [ \t]+ -> channel(HIDDEN);
2. 修改操作数规则
去掉instruction_operand规则开头的' '+,因为空白符已经被自动跳过,规则只需要关注操作数本身:
instruction_operand: operand_int | operand_string;
3. 优化整数规则(可选但更清晰)
你的INT定义本身没问题,但可以调整写法让它更易读:
INT: '-'? [0-9]+;
修改后的完整语法
grammar Insn; prog: (line? NEWLINE)+; line: instruction; instruction: instruction_name instruction_operands?; instruction_name: IDENTIFIER; instruction_operands: instruction_operand instruction_operand*; instruction_operand: operand_int | operand_string; // 移除了硬编码的空格前缀 operand_int: INT; operand_string: QSTRING; // 新增空白符处理规则 WS: [ \t]+ -> channel(HIDDEN); NEWLINE : [\r\n]+; IDENTIFIER: [a-zA-Z0-9_\-]+; INT: '-'? [0-9]+; QSTRING: '"' (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))* '"'; COMMENT: ';' ~[\r\n]* -> channel(HIDDEN);
验证效果
现在用你的示例输入aaa "str1" "str2" 123 bbb 123 "str" 456 ccc ddd测试,解析器应该能正确识别每个指令的操作码和操作数,包括整数类型的操作数,不会再出现之前的错误提示。
内容的提问来源于stack exchange,提问作者Kirby Gaming
相关产品推荐
相关产品推荐

