当前位置: 首页 > 知识库问答 >
问题:

ANTLR在分析整数与带引号的字符串时遇到困难

周昊乾
2023-03-14

我试图使用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都出现错误,总是导致类似于第1行:18无关输入“123”需要{“”,INT,QSTRING}的错误,而行号、列和123整数被替换为正在解析的任何整数。

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

共有1个答案

逑衡
2023-03-14

问题是123被识别为identifier,因为它是有效的标识符(所有int都是)。两者必须是可区分的。identifier可能应该类似于以下identifier:[a-zA-Z][a-za-z0-9_\-]*;

 类似资料:
  • 我将字符串作为解析器规则而不是词法分析器,因为字符串可能包含带有表达式的转义,例如。 这不起作用,因为

  • 我在解析antlr4中的格式行列表时遇到了一个问题 但这是失败的第一个字符识别'*'本身,这使我困惑。 第1行:0不匹配的输入'*这是一个字符串',应为'*'

  • 问题内容: 我想用定界符空格分割字符串。但它应该智能地处理带引号的字符串。例如,像这样的字符串 它应该返回三个字符串John Smith,Ted和Barry。 问题答案: 弄乱它之后,您可以使用Regex来实现。在以下位置运行“全部匹配”的等效项: 一个Java示例: 输出: 上面使用示例的正则表达式分解可以在这里查看: http://regex101.com/r/wM6yT9 综上所述,正则表达

  • 问题内容: 我有这个: JSONLint表示这是完全有效的json。但是执行时出现错误。 但是,如果我将代码更改为: (请注意双反斜杠) 它可以工作,但是现在JSONLint表示。 有人可以帮助您了解这种行为吗? 问题答案: 有线格式和您必须在代码中编写的格式之间是有区别的。当您在代码中声明此代码时,您需要在文字中使用双-\,以便字符串获得一个反斜杠(否则,它将\\解释为一个转义序列,仅声明一个“

  • 问题内容: 我有以下字符串: 我“肯定”想“上学”。 现在,我想在省略号处分割此字符串,即我想获得以下输出: 我会 一定 喜欢 上学 。 问题答案: 如果您是用引号()代替省略号,最简单的解决方案是使用 :

  • 问题内容: 我有一个字符串,我正在尝试将其解析为一个数字。我尝试使用,结果为2。我猜逗号是问题所在,但我将如何以正确的方式解决此问题?只需删除逗号? 问题答案: 是的,删除逗号: