gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:27:49 28 4
gpt4 key购买 nike

我正在尝试使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com