Compiler construction Ocaml-编译器和手动之间的差异

Compiler construction Ocaml-编译器和手动之间的差异,compiler-construction,ocaml,Compiler Construction,Ocaml,所以我在阅读,其中包括这段引文(在ocaml问题的背景下): 实际上有三种稍微不同的语法: 手册中描述了官方版本 编译器ocamlc接受其超集 预处理器Camlp4接受类似(但稍有不同)的内容(例如,它接受List.map[1;2;3] ~f:fun x->x,顶级玩家也会接受,但不会接受 (编译程序) ocamlc接受但与手册不匹配的ocaml代码片段示例有哪些 PS-我主要对OCaml 4.00.1感兴趣,但以前的版本也很有趣…一个有趣的例子,仅出于好奇:

所以我在阅读,其中包括这段引文(在ocaml问题的背景下):

实际上有三种稍微不同的语法:

  • 手册中描述了官方版本
  • 编译器ocamlc接受其超集
  • 预处理器Camlp4接受类似(但稍有不同)的内容(例如,它接受List.map[1;2;3] ~f:fun x->x,顶级玩家也会接受,但不会接受 (编译程序)
ocamlc接受但与手册不匹配的ocaml代码片段示例有哪些


PS-我主要对OCaml 4.00.1感兴趣,但以前的版本也很有趣…

一个有趣的例子,仅出于好奇:

                  OCaml version 4.00.0

# type 'a weird_list =
    | ()
    | :: of 'a * 'a weird_list;;
type 'a weird_list = () | :: of 'a * 'a weird_list
# 1::2::3::();;
- : int weird_list = :: (1, :: (2, :: (3, ())))

Camlp4和OCaml编译器之间的差异有时是错误的,但最常见的解释是解析器技术的差异:如果您为同一种语言编写了一个惯用的LR解析器和一个LL解析器,但语法微妙程度稍嫌烦人,那么您不应该期望两者完美匹配。我不认为这在实践中是一个问题(但实际上大多数人不使用Camlp4)。

一个有趣的例子,仅出于好奇:

                  OCaml version 4.00.0

# type 'a weird_list =
    | ()
    | :: of 'a * 'a weird_list;;
type 'a weird_list = () | :: of 'a * 'a weird_list
# 1::2::3::();;
- : int weird_list = :: (1, :: (2, :: (3, ())))

Camlp4和OCaml编译器之间的差异有时是错误的,但最常见的解释是解析器技术的差异:如果您为同一种语言编写了一个惯用的LR解析器和一个LL解析器,但语法微妙程度稍嫌烦人,那么您不应该期望两者完美匹配。我不认为这在实践中是一个问题(但实际上大多数人不使用Camlp4)。

这个页面很旧,不确定,它仍然适用于所有方面

考虑到ocaml 4.00顶级,第三项为false(也考虑到List.map的参数顺序错误…):


好的,顶层使用与ocaml相同的代码来解析代码…

这个页面很旧,不确定,它仍然适用于所有点

考虑到ocaml 4.00顶级,第三项为false(也考虑到List.map的参数顺序错误…):

好的,顶层使用与ocaml相同的代码来解析代码