camlp4语法扩展,解析器错误

Mar*_*mon 4 ocaml camlp4

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

type.yjson type_name {
  /* type_declaration */
}
Run Code Online (Sandbox Code Playgroud)

能够直接从json文件构建记录值.语法扩展插入模块和执行此操作所必需的功能.直到这里,没问题.语法扩展正是我想要的.

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

这是我尝试过的:

EXTEND Gram
str_item:
    [
      [ KEYWORD "type"; KEYWORD "."; "yjson"; tdl_raw = type_declaration ->
Run Code Online (Sandbox Code Playgroud)

这里是我使用"yjson"作为函数参数时得到的错误

[fun_binding] expected after [ipatt] (in [let_binding])
Run Code Online (Sandbox Code Playgroud)

我真的不明白这里发生了什么.似乎规则不匹配,为什么我会得到一个解析错误?

cam*_*ter 5

我不完全理解的P4的解决这个机制,但[ [ "blahblah" -> ...使得blahblah作为语言的一个新的关键字,这样你就可以不再使用blahblah作为函数参数.

要查看此内容,请尝试使用camlp4of预处理pa _*.ml并查看如何"blahblah"扩展到Gram.Skeyword "blahblah".似乎这Skeyword _被传递给P4的Structure.usingvia Insert.insert并且字符串被注册为新的关键字.

为了保持yjson可作为一个正常的变量,可以使用id = LIDENT,而不是"yjson"在您的规则,然后检查id的内容"yjson"或不在您的行动.