我试图使用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是全新的,不熟悉很多术语,所以请让我保持简单。
问题是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。我猜逗号是问题所在,但我将如何以正确的方式解决此问题?只需删除逗号? 问题答案: 是的,删除逗号: