包含“\”的OCaml评论会导致“评论未终止”

时间:2013-12-27 05:31:09

标签: escaping ocaml

这条评论还可以:

(* "\z" foo *)

此评论会导致错误:

(* "\" foo *)

有没有办法在OCaml注释中包含文字引用的单反斜杠?为什么这种明显的方法不起作用?我希望评论中的转义只是被忽略。

对于它的价值,我正在尝试记录处理反斜杠逃避的代码的测试。

感谢阅读。

编辑:情节变浓。以下评论是可以接受的:

(* "\" "\"    notice-> " *)
(* "\" "  "\"    notice-> " *)
(* "\" foo  "\" notice-> " " " *)
(* "\" " "  "\"    notice-> " *)
(* "\" "" "  "\"    notice-> " *)
(* "\" arbitrary "s  "\"    notice-> " *)
(* " \" note the spacing  " \"    notice-> " *)
(* "\" <- notice-> " *)
(* "\"  "  <- notice -> " " *)
(* "" *) (* """" *)

但是在最后加上或拿一个,然后就会中断。以下都失败了(在REPL中要求更多输入):

(* "\"  "\" *)
(* "\" foo  "\" notice->  *)
(* "\" foo  "\" notice-> " " *)
(* "\" foo "\" notice-> " " " " *)
(* "\" foo " "\" notice-> " "  *)
(* "\" foo " " "\" notice-> " "  *)
(* " *) (* """ *) (* """"" *)

我很丢失。似乎它试图平衡报价,但转义的报价将其抛出一个循环。

1 个答案:

答案 0 :(得分:6)

OCaml中的注释必须包含合法的OCaml词汇单元(令牌)。这使您可以轻松地注释掉代码,甚至可以使用注释编写代码。甚至包含字符串常量的代码恰好包含(**)

您可以在评论中添加"\\"。但是你不能拥有"\",因为它不是合法的OCaml令牌。 (这是一个未终止的字符串常量。)

您可以在手册的Lexical Conventions章节中找到OCaml的合法代币。

修改

正如lukstafi指出的那样,仅仅说出现在OCaml评论中的字符串必须与出现在评论之外的字符串具有相同的结构更为正确。这是必要的,以允许代码(可能包含看起来像注释的一部分的字符串常量)可靠地注释掉。

修改2

(* "\" "\"    notice-> " *)

这一点并不令人惊讶(在我看来)。注释由两个字符串常量组成,它们之间带有\字符。在字符串常量之外,\字符不引用任何内容。这只是一个角色。 (在OCaml中,代码\不是一个合法的字符,但在评论中没有问题 - 请注意lukstafi的澄清解释了这一点。)

如果我标记所有字符,也许会更清楚。 (表示开放引号,)表示关闭引号,Q表示字符串中的反斜杠(引用下一个字符),B表示字符串外的反斜杠(它只是一个字符串)普通字符),S表示字符串中的其他字符,C表示字符串外的其他字符。

(* "\" "\"    notice-> " *)
  C(QSS)B(SSSSSSSSSSSSS)C

这是一个错误的案例:

(* " *) (* """ *) (* """"" *)
  C(SSSSSSS)()C     C()()(SSS

它有一个未终止的字符串常量。请注意,第一个字符串中有两个与注释分隔符类似的序列。但它只是一个字符串。