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

时间:2013-04-16 19:13:19

标签: java antlr

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

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

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

但它不起作用。我试着在AntlrWorks1.5中解释“\”,它在生成的语法树中为STRING_LITERAL提供了MismatchedTokenException。我的语法的哪一部分是错的?

2 个答案:

答案 0 :(得分:3)

语法没有错。您可能会收到此错误,因为您正在使用解释器,这是错误的。请改用ANTLRWorks的调试器。调试器将显示输入"\"a"被解析得很好(按 CTRL + D 开始调试)。

此外,您的字符串规则可能更好看起来像这样:

STRING_LITERAL : '"' (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))* '"';

换句话说,字符串的内容为零或更多:

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

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

答案 1 :(得分:1)

尝试以下表达式:

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