ANTLRv4:使用\和"读取双引号。

时间:2017-06-21 23:39:56

标签: string antlr4

我尝试使用ANTLRv4为一种接受""的语言实现解析器。和\"作为一种逃避的方式" "中的字符分隔字符串。

this question的答案显示了如何为""逃跑。但是,当我尝试扩展它以覆盖\"例如,当两个字符串在同一条线上时,它几乎可以工作但变得过于贪婪。

这是我的语法:

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

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

以下是我输入的三个字符串:

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

这正确识别"这是""我的字符串\"",但认为" cat"," fish&# 34;是一个字符串。 如果我移动" fish"下到下一行它正常工作。

如果" cat"有人能弄清楚如何让它发挥作用吗?和"鱼"在同一条线上?

2 个答案:

答案 0 :(得分:0)

让你的STRING规则非贪婪地停在它遇到的第一个引号上,而不是试图尽可能多地获取:

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

答案 1 :(得分:0)

我已经找到了我需要做的事情来让我按照自己的意愿去工作,但老实说我还不完全确定为什么Antlr会做它所做的事情。

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

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

回到第一原则,我手绘了问题的状态转换图,然后意识到两个转义机制序列不相同,不能被类似地处理。然后尝试在AntlrWorks中实现这两个模式,很明显我需要添加第二个反斜杠,此时它才开始工作。

单个反斜杠后跟一些任意字符只是意味着该字符吗?