Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml camlp4语法扩展,分析器错误_Ocaml_Camlp4 - Fatal编程技术网

Ocaml camlp4语法扩展,分析器错误

Ocaml camlp4语法扩展,分析器错误,ocaml,camlp4,Ocaml,Camlp4,我创建了一个语法扩展,允许将类型定义为 type.yjson type_name { /* type_declaration */ } 能够直接从json文件构建记录值。 语法扩展插件插入模块和执行此操作所需的函数。 在这里之前,没问题。语法扩展完全符合我的要求 如果我想在代码中的其他地方使用“yjson”(即:函数参数),我就会遇到一些问题 以下是我所尝试的: EXTEND Gram str_item: [ [ KEYWORD "type"; KEYWORD ".";

我创建了一个语法扩展,允许将类型定义为

type.yjson type_name {
  /* type_declaration */
}
能够直接从json文件构建记录值。 语法扩展插件插入模块和执行此操作所需的函数。 在这里之前,没问题。语法扩展完全符合我的要求

如果我想在代码中的其他地方使用“yjson”(即:函数参数),我就会遇到一些问题

以下是我所尝试的:

EXTEND Gram
str_item:
    [
      [ KEYWORD "type"; KEYWORD "."; "yjson"; tdl_raw = type_declaration ->
这里是使用“yjson”作为函数参数时出现的错误

[fun_binding] expected after [ipatt] (in [let_binding])

我真的不明白这里发生了什么。规则似乎不匹配,为什么会出现解析错误?

我不完全理解P4的机制,但是
[[“blahblah”->…
blahblah
作为语言的新关键字,因此您不能再将
blahblah
用作函数参数

要看到这一点,请尝试通过camlp4of预处理您的pa*.ml,并查看如何将
“blahblah”
扩展为
Gram.Skeyword“blahblah”
。似乎此
Skeyword
已传递到
结构。通过P4的
插入
,使用
并将字符串注册为新关键字


要使
yjson
可用作普通变量,请在规则中使用
id=LIDENT
而不是
“yjson”
,然后检查
id
的内容是否为
“yjson”
或者不在您的行动中。

如果我可以稍微偏离主题,我认为为类型导向的代码生成设计自定义语法是错误的,因为已经存在两种不同的语法(一种用于派生,一种用于派生),其中一种(type conv)正在成为事实上的标准

type foo = {
   ...
} with json
如果你选择了一种语法,除非你有很好的理由不这样做,否则你应该使用这种语法。事实上,type conv本身是一个帮助工具,可以让你编写自己的类型定向代码生成器,所以你也可以直接使用type conv来完成你想要做的事情


(您可能知道Martin Jambon's,它有意识地选择不使用Camlp4;Alain Frisch正在进行工作,以直接支持OCaml语法中的注释,但这还没有准备好使用。)

我完全同意。事实上,我已经用一个派生生成器重新编写了整个过程。但这个错误困扰了我一段时间。