我创建了一个语法扩展,允许将类型定义为
type.yjson type_name {
/* type_declaration */
}能够直接从json文件构建记录值。语法扩展插入模块和执行此操作所需的函数。到这里为止,没问题。语法扩展做的正是我想要的。
如果我想在代码中的其他地方使用"yjson“(i.e:function参数),我就会遇到一些问题。
下面是我尝试过的:
EXTEND Gram
str_item:
[
[ KEYWORD "type"; KEYWORD "."; "yjson"; tdl_raw = type_declaration ->下面是我使用"yjson“作为函数参数时得到的错误
[fun_binding] expected after [ipatt] (in [let_binding])我真的不明白这里发生了什么。看起来规则并不匹配,那么为什么会出现解析错误呢?
发布于 2013-05-30 15:13:56
我不完全理解P4围绕这一点的机制,但是[ [ "blahblah" -> ...使blahblah成为该语言的一个新关键字,因此您不能再将blahblah用作函数参数。
要了解这一点,请尝试使用camlp4of对您的pa_*.ml进行预处理,看看"blahblah"是如何扩展到Gram.Skeyword "blahblah"的。这个Skeyword _似乎是通过Insert.insert of P4传递给Structure.using的,并且该字符串被注册为一个新的关键字。
要保持yjson作为常规变量可用,请在您的规则中使用id = LIDENT而不是"yjson",然后在您的操作中检查id的内容是否为"yjson"。
发布于 2013-05-30 16:27:19
如果我可以说一些离题的话,我认为为类型导向的代码生成设计自定义语法是错误的,因为已经存在两种不同的语法(一种用于type_conv,另一种用于派生),其中一种(类型转换)正在成为事实上的标准。
type foo = {
...
} with json如果你为这个选择了一个语法,你应该使用这个语法,除非你有很好的理由不这样做。事实上,type-conv本身是一个辅助实用程序,让您可以编写自己的类型导向代码生成器,因此您也可以直接使用type-conv来完成您想要做的事情。
(您可能知道Martin Jambon的Atdgen,它有意识地选择不使用Camlp4;Alain Frisch正在进行的工作是直接支持OCaml语法中的批注,但还没有准备好使用。)
https://stackoverflow.com/questions/16824398
复制相似问题