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

ANTLR解析整数与带引号字符串时出现错误的问题求助

解决ANTLR自定义语言中整数解析的错误问题

我看到你在使用ANTLR构建自定义语言时遇到了整数解析的问题,错误提示类似line 1:18 extraneous input '123' expecting {' ', INT, QSTRING},这个问题的核心原因是你在语法中处理空白符的方式不正确,同时操作数的规则定义也有问题,咱们一步步来修复:

问题根源分析

你的语法里存在两个关键问题:

  1. 没有处理普通空白符(空格、制表符):你只定义了NEWLINE和COMMENT规则,但没有处理空格和制表符,ANTLR不会自动跳过这些字符,导致解析器无法正确识别操作数之间的分隔。
  2. 操作数规则硬编码空格前缀: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:12:29