2013-04-16 107 views
2

我想要一些语法来表示一个字符串,通过“和”内部串符号可以被引用如\”援引以下是我的语法:ANTLR的如何逃生报价符号引用字符串

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

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

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

回答

3

没有什么错的语法。你可能会遇到这个错误,因为你使用的是解释器,这是错误的。改用ANTLRWorks的调试器。调试器会显示输入"\"a"被解析得很好(按CTRL + D开始调试)。

而且,你的字符串规则很可能是看起来像这样更好:

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

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

  • 比任何一个其他字符引号,反斜线或换行符:~('"' | '\\' | '\r' | '\n')

  • 转义引号和反斜线'\\' ('"' | '\\')
1

试试下面的表达式:

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

感谢奥宾。我在文法中加入了“(options {greedy = false;}”),但它的工作原理是什么,但是antlr的贪婪匹配是如何导致我原始表达式失败的? – Ryan

+0

我不知道,我的答案是他的复制粘贴你的谷歌搜索问题... – Aubin

+0

你可以删除'选项{greedy = false;}:'部分。 –