gpt4 book ai didi

ocaml - 创建一个简单的camlp4语法扩展

转载 作者:行者123 更新时间:2023-12-04 06:02:28 25 4
gpt4 key购买 nike

鉴于这种类型:

type 'a variable = { name: string; mutable value: 'a } 

我正在尝试创建一个接受此语法的语法扩展:
var foo = true

...并将其转换为:
let foo = { name = "foo"; value = true }

这是我的尝试:
open Camlp4.PreCast
open Syntax

type 'a variable = { name: string; mutable value: 'a }

EXTEND Gram
expr: LEVEL "top"
[ [ "var"; v = a_LIDENT; "="; e = expr ->
<:expr< let $lid:v$ = { name= $`str:v$ ; value = $e$ } in $e$ >>
] ]
;
END

(我很确定它需要在替换结束时使用 $e$ 作为表示“其余部分”的一种方式,但鉴于我们希望记录的 value 字段具有以下值,它看起来也有点可疑右边的表达式 - 最初我在那里没有结尾 $e$ 并且得到了同样的错误)

我尝试编译:
ocamlc -I +camlp4 camlp4lib.cma -pp camlp4orf -c pa_var.ml

结果是:
File "pa_var.ml", line 10, characters 50-51:
While expanding quotation "expr" in a position of "expr":
Parse error: "}" expected after [label_expr_list] (in [expr])

File "pa_var.ml", line 1, characters 0-1:
Error: Preprocessor error

我不知道为什么它似乎要在记录的名称字段后有一个“}”。 (否则,我在正确的轨道上吗?)

最佳答案

错误是您使用了 camlp4orf ,它使用代码的标准语法,但修改了引号的语法,以及字段名称 value , 这是 OCaml 修订语法中的关键字。最简单的解决方法是使用 camlp4oof在任何地方使用标准语法,但您也可以重命名该字段。

PS:我真的不认为有必要写一个Camlp4扩展来做到这一点。我建议忍受冗余并使用 let foo = var "foo" true反而。这将简化维护、与其他代码库的交互等。

PPS:还有一些评论:

  • 你不想那样实现它;如果你想捕捉顶级声明短语 let x = foo;; ,你必须住在struct_item ,不是 expr ,并在 expr您可能想要捕获形式为 var <lid> = <expr> in <expr> 的本地声明.
  • 如果您坚持使用Camlp4,则应避免使用EXTEND 进行语法修改。 ,正如你现在所做的那样。而是选择 let foo = VAR true作为您的具体语法,并使用 Camlp4Filters将其转换为您想要的机制。这将更加健壮且易于实现。
  • 关于ocaml - 创建一个简单的camlp4语法扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8774620/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com