6

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

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

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

但它不起作用。我尝试在 AntlrWorks1.5 中解释 "\"a",它在为 STRING_LITERAL 生成的语法树中给出了 MismatchedTokenException。我的语法的哪一部分是错误的?

4

2 回答 2

13

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

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

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

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

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

或者

  • 转义的引号或反斜杠'\\' ('"' | '\\')
于 2013-04-16T20:12:18.400 回答
1

试试下面的表达式:

STRING : '"' (options{greedy=false;}:( ~('\\'|'"') | ('\\' '"')))* '"';
于 2013-04-16T19:16:14.430 回答