Antlr4 ANTLR-如何在解析时接受双引号字符串中的双引号

Antlr4 ANTLR-如何在解析时接受双引号字符串中的双引号,antlr4,Antlr4,我开发了一种语法来解析一个特定的文件。如果字符串包含双引号(“某些文本”),我需要语法来解析字符串,我就是这么做的。我要寻找的部分是,我需要处理字符串本身包含一些带转义字符的双引号的所有情况 此外,当涉及反斜杠时,它必须接受双反斜杠并将其转换为单反斜杠 请参考以下案例 “某些文本”->有效->预期为->某些文本 “某些\“文本\->有效->预期为->某些“文本” “一些文本和反斜杠\\”->有效->预期为->一些文本和反斜杠\ “某些”文本“”->无效输入->因为双引号内没有转义字符 “一些文本

我开发了一种语法来解析一个特定的文件。如果字符串包含双引号(“某些文本”),我需要语法来解析字符串,我就是这么做的。我要寻找的部分是,我需要处理字符串本身包含一些带转义字符的双引号的所有情况

此外,当涉及反斜杠时,它必须接受双反斜杠并将其转换为单反斜杠 请参考以下案例

“某些文本”->有效->预期为->某些文本

“某些\“文本\->有效->预期为->某些“文本”

“一些文本和反斜杠\\”->有效->预期为->一些文本和反斜杠\

“某些”文本“”->无效输入->因为双引号内没有转义字符


“一些文本和反斜杠\”->无效输入->因为没有转义字符

因为很多语言以前都处理过这类事情,所以ANTLR语法页面是一个很好的资源

我只是调出了JSON语法,删除了Unicode的东西,这就是他们的解决方案。它应该满足你的要求。如果需要Unicode,可以按JSON语法的原样将其拉入

STRING
   : '"' (ESC | SAFECODEPOINT)* '"'
   ;

fragment ESC
   : '\\' (["\\/bfnrt])
   ;

fragment SAFECODEPOINT
   : ~ ["\\\u0000-\u001F]
   ;


ESC
片段将识别“you\”序列并使其成为字符串的一部分(它还允许esacping/\b、\f、\n、\r、\t和\。您可能不需要所有这些,但您可能至少需要\这将允许用户在其字符串中放置文字。
SAFECODEPOINT
片段排除您不希望在字符串中使用的ASCII范围字符(包括终止字符)“,以及开始转义序列的\号。

谢谢您的响应,Mike。这是我之前使用的。但此规则未按预期分析以下输入。“一些文本\”文本\->这被分析为->一些文本\“text \它跳过了最后一个双引号。请检查您的逻辑以将字符串从标记中拉出。标记文本将包括开头和结尾”s(它们是lexer规则的一部分),因此看起来您正试图将它们去掉。如果我通过标记器运行此操作,我会得到:[@0,0:19=''Some text\'text\'',1:0]。(这是将grun与-tokens选项一起使用。ANTLR正在拉入尾部“