我尝试使用ANTLRv4为一种接受""的语言实现解析器。和\"作为一种逃避的方式" "中的字符分隔字符串。
this question的答案显示了如何为""逃跑。但是,当我尝试扩展它以覆盖\"例如,当两个字符串在同一条线上时,它几乎可以工作但变得过于贪婪。
这是我的语法:
grammar strings;
strings : STRING (',' STRING )* ;
STRING
: '"' (~[\r\n"] | '""' | '\"' )* '"'
;
以下是我输入的三个字符串:
"This is ""my string\"",
"cat","fish"
这正确识别"这是""我的字符串\"",但认为" cat"," fish&# 34;是一个字符串。 如果我移动" fish"下到下一行它正常工作。
如果" cat"有人能弄清楚如何让它发挥作用吗?和"鱼"在同一条线上?
答案 0 :(得分:0)
让你的STRING
规则非贪婪地停在它遇到的第一个引号上,而不是试图尽可能多地获取:
STRING
: '"' (~[\r\n"] | '""' | '\"' )*? '"'
;
答案 1 :(得分:0)
我已经找到了我需要做的事情来让我按照自己的意愿去工作,但老实说我还不完全确定为什么Antlr会做它所做的事情。
只需在'\"'
子句中添加另一个反斜杠字符就可以了!
所以我的最终STRINGS定义是:'"' (~[\r\n"] | '""' | '\\"' )* '"'
回到第一原则,我手绘了问题的状态转换图,然后意识到两个转义机制序列不相同,不能被类似地处理。然后尝试在AntlrWorks中实现这两个模式,很明显我需要添加第二个反斜杠,此时它才开始工作。
单个反斜杠后跟一些任意字符只是意味着该字符吗?