Java Antlr如何在带引号的字符串中转义引号符号

Java Antlr如何在带引号的字符串中转义引号符号,java,antlr,Java,Antlr,我想要一些语法来表示一个字符串,用“”引用,字符串中的“符号可以像\”一样引用。以下是我的语法: fragment NUM_LETTER : ('a'..'z'|'A'..'Z'|'0'..'9'); STRING_LITERAL : '"' (NUM_LETTER|'_'|('\\"'))* '"'; 但它不起作用。我尝试在AntlrWorks1.5中解释“\”a”,它在生成的字符串\ u LITERAL语法树中给出了一个不匹配的TokenException。我的语法哪一部分错了?试试下面

我想要一些语法来表示一个字符串,用“”引用,字符串中的“符号可以像\”一样引用。以下是我的语法:

fragment
NUM_LETTER : ('a'..'z'|'A'..'Z'|'0'..'9');

STRING_LITERAL : '"' (NUM_LETTER|'_'|('\\"'))* '"';

但它不起作用。我尝试在AntlrWorks1.5中解释“\”a”,它在生成的字符串\ u LITERAL语法树中给出了一个不匹配的TokenException。我的语法哪一部分错了?

试试下面的表达:

STRING : '"' (options{greedy=false;}:( ~('\\'|'"') | ('\\' '"')))* '"';

语法没有问题。您可能会遇到此错误,因为您使用的是解释器,这是错误的。改用ANTLRWorks的调试器。调试器将向您显示输入
“\”a“
解析得很好(按CTRL+D开始调试)

此外,您的字符串规则最好如下所示:

STRING_LITERAL : '"' (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))* '"';
换句话说,字符串的内容为零或更多:

  • 除引号、反斜杠或换行符以外的任何字符:
    ~(“'''.'\'.\'.'.'\r'.'\n')

  • 转义引号或反斜杠
    '\\'(''''\'.'\\'))

谢谢Aubin。我在语法中添加了这个“(options{greedy=false;})”部分,它起了作用。但是antlr的贪婪匹配是如何导致我的原始表达式失败的呢?你可以删除
options{greedy=false;}:
部分。@Ryan,没有。解释器有点问题。