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

And*_*nor 5 ocaml escaping

这个评论没问题:

(* "\z" foo *)
Run Code Online (Sandbox Code Playgroud)

此评论会导致错误:

(* "\" foo *)
Run Code Online (Sandbox Code Playgroud)

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

对于它的价值,我正在尝试记录为自己的目的处理反斜杠转义的代码的测试.

谢谢阅读.

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

(* "\" "\"    notice-> " *)
(* "\" "  "\"    notice-> " *)
(* "\" foo  "\" notice-> " " " *)
(* "\" " "  "\"    notice-> " *)
(* "\" "" "  "\"    notice-> " *)
(* "\" arbitrary "s  "\"    notice-> " *)
(* " \" note the spacing  " \"    notice-> " *)
(* "\" <- notice-> " *)
(* "\"  "  <- notice -> " " *)
(* "" *) (* """" *)
Run Code Online (Sandbox Code Playgroud)

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

(* "\"  "\" *)
(* "\" foo  "\" notice->  *)
(* "\" foo  "\" notice-> " " *)
(* "\" foo "\" notice-> " " " " *)
(* "\" foo " "\" notice-> " "  *)
(* "\" foo " " "\" notice-> " "  *)
(* " *) (* """ *) (* """"" *)
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*eld 6

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

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

您可以在本手册的词汇约定章节中找到OCaml的合法令牌.

编辑

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

编辑2

(* "\" "\"    notice-> " *)
Run Code Online (Sandbox Code Playgroud)

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

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

(* "\" "\"    notice-> " *)
  C(QSS)B(SSSSSSSSSSSSS)C
Run Code Online (Sandbox Code Playgroud)

这是一个错误的案例:

(* " *) (* """ *) (* """"" *)
  C(SSSSSSS)()C     C()()(SSS
Run Code Online (Sandbox Code Playgroud)

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

  • 字符串常量内的构造不是令牌.整个字符串常量是令牌. (2认同)
  • 我不同意评论必须包含合法代币的说法.注释的词法分析器与源外注释的词法分析器不同,是简化的.但是,注释的词法分析器识别字符串文字并使用与注释之外的字符串文字标记相同的lexing. (2认同)
  • 第一组中的所有示例都具有一些完整的字符串常量(2,2,3,3,3,2,2,1,2,3).第二组中的所有示例都具有一些完整的字符串常量加上未终止的字符串常量(1 +,1 +,2 +,3 +,2 +,3 +,4 +).字符串常量之外的反斜杠就像任何其他字符一样. (2认同)