4

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

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])

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

4

2 回答 2

5

我不完全理解 P4 的机制,但[ [ "blahblah" -> ...makeblahblah作为语言的新关键字,所以你不能再blahblah用作函数参数。

要看到这一点,请尝试通过 camlp4of 预处理您的 pa_*.ml 并查看如何"blahblah"扩展为Gram.Skeyword "blahblah". 似乎这Skeyword _是传递给P4 的Structure.usingviaInsert.insert并且该字符串被注册为新关键字。

要保持yjson可用作普通变量,请在规则中使用id = LIDENT而不是"yjson",然后检查id' 的内容是否"yjson"在您的操作中。

于 2013-05-30T07:13:55.907 回答
4

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

type foo = {
   ...
} with json

如果您为此选择一种语法,除非您有充分的理由不这样做,否则您应该使用它。事实上,type-conv 本身就是一个帮助工具,让您可以编写自己的类型导向代码生成器,因此您不妨直接使用 type-conv 来完成您想要做的事情。

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

于 2013-05-30T08:27:18.670 回答