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