我创建了一个语法扩展,允许将类型定义为
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)
我真的不明白这里发生了什么.似乎规则不匹配,为什么我会得到一个解析错误?
我不完全理解的P4的解决这个机制,但[ [ "blahblah" -> ...使得blahblah作为语言的一个新的关键字,这样你就可以不再使用blahblah作为函数参数.
要查看此内容,请尝试使用camlp4of预处理pa _*.ml并查看如何"blahblah"扩展到Gram.Skeyword "blahblah".似乎这Skeyword _被传递给P4的Structure.usingvia Insert.insert并且字符串被注册为新的关键字.
为了保持yjson可作为一个正常的变量,可以使用id = LIDENT,而不是"yjson"在您的规则,然后检查id的内容"yjson"或不在您的行动.
| 归档时间: |
|
| 查看次数: |
507 次 |
| 最近记录: |