首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >camlp4语法扩展,解析器错误

camlp4语法扩展,解析器错误
EN

Stack Overflow用户
提问于 2013-05-30 05:44:41
回答 2查看 513关注 0票数 4

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

代码语言:javascript
复制
type.yjson type_name {
  /* type_declaration */
}

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

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

下面是我尝试过的:

代码语言:javascript
复制
EXTEND Gram
str_item:
    [
      [ KEYWORD "type"; KEYWORD "."; "yjson"; tdl_raw = type_declaration ->

下面是我使用"yjson“作为函数参数时得到的错误

代码语言:javascript
复制
[fun_binding] expected after [ipatt] (in [let_binding])

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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"

票数 5
EN

Stack Overflow用户

发布于 2013-05-30 16:27:19

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

代码语言:javascript
复制
type foo = {
   ...
} with json

如果你为这个选择了一个语法,你应该使用这个语法,除非你有很好的理由不这样做。事实上,type-conv本身是一个辅助实用程序,让您可以编写自己的类型导向代码生成器,因此您也可以直接使用type-conv来完成您想要做的事情。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16824398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档