String ANTLRv4:读取双引号,并用\和“转义”;

String ANTLRv4:读取双引号,并用\和“转义”;,string,antlr4,String,Antlr4,我正在尝试为一种语言实现一个解析器,该语言使用ANTLRv4,该语言接受“”和\,作为对分隔字符串中的“字符”进行转义的方法 答案显示了如何对“”进行转义。但是,当我尝试扩展它以涵盖\”情况时,它几乎可以工作,但当两个字符串位于同一行时,它变得太贪婪了 这是我的语法: grammar strings; strings : STRING (',' STRING )* ; STRING : '"' (~[\r\n"] | '""' | '\"' )* '"' ; 以下是我输入的三个字

我正在尝试为一种语言实现一个解析器,该语言使用ANTLRv4,该语言接受“”和\,作为对分隔字符串中的“字符”进行转义的方法

答案显示了如何对“”进行转义。但是,当我尝试扩展它以涵盖\”情况时,它几乎可以工作,但当两个字符串位于同一行时,它变得太贪婪了

这是我的语法:

grammar strings;
strings : STRING (',' STRING )* ;

STRING
 : '"' (~[\r\n"] | '""' | '\"' )* '"' 
 ;   
以下是我输入的三个字符串:

"This is ""my string\"",
"cat","fish"
这正确地识别了“这是”“我的字符串\”,但认为“猫”、“鱼”都是一个字符串。 如果我把“鱼”移到下一行,它就会正常工作


如果“猫”和“鱼”在同一条线上,有人能想出如何使它工作吗?

让你的
字符串不贪婪地在它遇到的第一个引号字符时停止,而不是试图获取尽可能多的字符:

STRING
 : '"' (~[\r\n"] | '""' | '\"' )*? '"' 
 ;

我已经找到了我需要做什么才能让它按我所希望的那样工作,尽管说实话,我仍然不能完全确定Antlr为什么要这么做

只需在
“\”
子句中添加另一个反斜杠字符,它就可以工作了

因此,我的最后一个字符串定义是:
“”(~[\r\n”]|“”“”|“\\”)*“

回到第一原理,我手绘了问题的状态转换图,然后意识到两个逃逸机制序列是不一样的,不能被类似地处理。然后尝试在AntlrWorks中实现这两种模式,很明显,我需要添加第二个反斜杠,在这一点上,它就开始工作了

单个反斜杠后跟任意字符是否表示该字符

这使得“猫”、“鱼”部分工作正常,但完全破坏了逃逸部分。