Ocaml s表达式中是否禁止尾随空格?

Ocaml s表达式中是否禁止尾随空格?,ocaml,s-expression,Ocaml,S Expression,当我尝试sexplib时,它告诉我 Sexp.of_字符串“a”是正确的 Sexp.of_字符串“a”是错误的 sexp中是否禁止使用尾随空格 为什么?根据一个非正式的语法规范,原子两端的空格应该被忽略: {2 S表达式的语法规范} {9 S-表达式的词汇约定} 空格,包括空格、换行符、回车符、, 除非在 OCaml字符串,根据OCaml约定对其进行处理。这个 分号引入注释。注释将被忽略,范围最大为 下一个换行符。左括号将打开一个新列表, 右括号再次将其关闭。列表可以为空。这个 双引号表示字符

当我尝试sexplib时,它告诉我

Sexp.of_字符串“a”是正确的

Sexp.of_字符串“a”是错误的


sexp中是否禁止使用尾随空格


为什么?

根据一个非正式的语法规范,原子两端的空格应该被忽略:

{2 S表达式的语法规范}

{9 S-表达式的词汇约定}

空格,包括空格、换行符、回车符、, 除非在 OCaml字符串,根据OCaml约定对其进行处理。这个 分号引入注释。注释将被忽略,范围最大为 下一个换行符。左括号将打开一个新列表, 右括号再次将其关闭。列表可以为空。这个 双引号表示字符串后面的开始和结束 OCaml的词汇约定(有关详细信息,请参阅OCaml手册)。全部的 除双引号、左括号和右括号以外的字符 空格被认为是连续字符串的一部分

实际上,您可以从文件中读取带有尾随空格的atom,而不会出现任何错误

如果解析器成功返回,但缓冲区中仍有某些内容,则会从\u string\u bigstring
的函数
Pre\sexp.抛出错误。所以,主要的问题是,为什么有东西留在缓冲区。似乎存在多个解析器,文件和字符串使用不同的解析器进行解析

我检查了
parse_atom
pre_sexp.ml:699
中定义的规则(所有位置均为),发现当命中尾随空格时,会调用
bump_found_atom
。然后,如果堆栈上有内容,位置指示符将递增,解析将继续。否则,解析将完成,但位置不会增加。通过一个简单的补丁,可以解决这一问题:

diff --git a/lib/pre_sexp.ml b/lib/pre_sexp.ml
index 86603f3..9690c0f 100644
--- a/lib/pre_sexp.ml
+++ b/lib/pre_sexp.ml
@@ -502,7 +502,7 @@ let mk_cont_parser cont_parse = (); fun _state str ~max_pos ~pos ->
     let pbuf_str = Buffer.contents pbuf in \
         let atom = MK_ATOM in \
     match GET_PSTACK with \
-    | [] -> Done (atom, mk_parse_pos state pos) \
+    | [] -> Done (atom, mk_parse_pos state (pos + 1)) \
     | rev_sexp_lst :: sexp_stack -> \
         Buffer.clear pbuf; \
         let pstack = (atom :: rev_sexp_lst) :: sexp_stack in \
在此修补程序之后,以下代码将生成预期的
'a','a','a'
输出:

let s1 = Sexp.of_string " a" in
let s2 = Sexp.of_string "a " in
let s3 = Sexp.of_string " a " in
printf "'%s', '%s', '%s'\n"
  (Sexp.to_string s1)
  (Sexp.to_string s2)
  (Sexp.to_string s3);

所以你认为这是一只虫子?我应该向git回购报告吗?@JacksonTale,看起来像。为什么不呢?