如何为字符串编写antlr4规则

how to write antlr4 rule for string

我对字符串和注释有以下规则:

Double_quoted_string : '"' ( ~[\n\r] )* '"'  ;
SL_Comment : '//' .*? '\r'? '\n' -> channel(HIDDEN) ;

但我看到以下输入:

printf("Hello \"something "); //printf("Bye ");

生成的字符串标记是:

"Hello \"something "); //printf("Bye "

即贪婪地取最长的匹配,而不应用评论规则。

我希望字符串只是 "Hello \"something "。应该如何为此修改规则?

像这样

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

内部简述( ... )*:

  • ~[\"\n\r] 匹配除 \"\n\r
  • 之外的任何字符
  • '\' [\"] 匹配 \\" *

* 如果你想转义更多,只需将它们添加到字符 class 中: '\' [\"'tbnrf] 将匹配 \\"\'\t\b\n\r\f