java - ANTLR 努力解析整数与引用字符串

标签 java antlr

我正在尝试使用 ANTLR 创建一种语言,其中每一行都包含一条指令,其中一条指令是一个操作码和任意数量的操作数,如下所示:

aaa "str1" "str2" 123
bbb 123 "str" 456
ccc
ddd

我的字符串看起来工作正常,但整数似乎解析不正确。

这是我的完整语法文件:

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;

NEWLINE : [\r\n]+;
IDENTIFIER: [a-zA-Z0-9_\-]+;
INT: '-'?[0-9]+;
QSTRING: '"' (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))* '"';
COMMENT: ';' ~[\r\n]* -> channel(HIDDEN);

我尝试了多种不同的 INT 定义,例如 INT: '-'?('0'..'9')+;INT: '2'; 在输入 2 中生成所有 INT,总是导致类似于 line 1:18 extraneous input '123' expecting {' ', INT, QSTRING} 的错误,将行号、列和 123 整数替换为正在解析的内容。

这是 ANTLR getting-started.md 文档中使用的由 ANTLR 工具生成的解析树。 parse tree

我是 ANTLR 的新手,不熟悉很多术语,所以请对我保持简单。

最佳答案

问题是 123 被识别为 IDENTIFIER,因为它是一个有效的标识符(所有 INT 都是)。两者必须是可区分的。 IDENTIFIER 应该是这样的 IDENTIFIER: [a-zA-Z][a-zA-Z0-9_\-]*;

关于java - ANTLR 努力解析整数与引用字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67319173/

相关文章:

java - 是否可以保留包含另一个集合的 map

java - ANTLR 可以隐藏自动生成的文件中的第一行消息吗?

java - AntLR4 : Build A function

Java - 正则表达式解析字符串

java - 是否有新版本的 ehcache-core 是最新版本的 Ehcache 的一部分?

java - 在 android 中创建计时器的最简单方法?

java - Java 8 中新引入的 Arrays.parallelPrefix(...) 是如何工作的?

java - ANTLR3 C 目标错误生成 TreeParser : ( ASTTreeParser. stg 321:25:匿名模板有 0 个参数但映射到 1 个值)

parsing - Antlr 空格标记错误

c - 在 Antlr4 中保留空格和换行符