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语法中的注释,但这还没有准备好使用。)我完全同意。事实上,我已经用一个派生生成器重新编写了整个过程。但这个错误困扰了我一段时间。