2017-06-21 99 views
0

我试图实现一个解析器使用ANTLRv4语言,接受”“和\”作为逃避“分隔字符串中的字符”。ANTLRv4:读双引号与和“

this question的答案显示如何做“”转义。然而,当我试图把它扩大到也包括了\”的情况下,它几乎作品,但是当两个字符串在同一行变得过于贪婪

这里是我的语法:

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

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

这里是我的三个字符串输入:

"This is ""my string\"", 
"cat","fish" 

这正确识别“这是‘’我的字符串\””,但认为‘猫’,‘鱼’是所有一个字符串。 如果我将“鱼”向下移动到下一行,它会正常工作。

任何人都可以弄清楚如何使它工作,如果“猫”和“鱼”在同一行?

回答

0

让您STRING规则不贪婪停在第一个引号字符遇到,而不是试图让尽可能多的:

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

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

0

我发现我需要做的就是这按照我的意愿工作,但说实话,我仍然不完全确定Antlr为什么要这样做。

只需在'\"'子句中添加另一个反斜杠字符即可!

所以我最终STRINGS的定义是:'"' (~[\r\n"] | '""' | '\\"')* '"'

再回到第一的原则,我的手画了一个问题的状态转换图,然后意识到,这两个逃逸机制序列是不一样的,不能同样对待。然后试图在AntlrWorks中实现这两种模式,显然我需要添加第二个反斜杠,在这一点上它开始工作。

一个反斜杠后面跟着一些任意的字符是否仅仅表示字符?