Rascal的SyntaxDefinition文档页面有两个部分,其中一个部分讲述"标签"(以"语法定义的每个替代项都由符号列表定义。">开始(,另一个部分则讲述"名称"(以"替代项可以命名也可以不命名。",例如两者都启用is
运算符对于内爆ParseTrees或写入Action函数是必要的。页面顶部的"语法"部分仅列出Name
组件和Tags
,但没有标签。
"标签"是"名称"的替代词吗?如果是这样,为什么使用它们的效果列表不同?
这个文档页面确实需要一些爱。
谈论的"标签"的作用是可选地为两种不同的东西声明"名称":
- 非终端的替代规则可能有标签,如
syntax E = add: E "+" E | sub: E "-" E;
- 语法规则内的符号位置可能有标签,如
syntax E = E lhs "+" E rhs | E lhs "-" E rhs;
在规则上设置标签可以实现与在符号位置设置标签不同的功能。
对于我们得到的规则:
myExp is myLabel
;检查顶部解析树节点是否具有标记有该标签的语法规则ParseTree::implode
使用规则标签将具体的解析树节点映射到抽象的数据树节点- 在编写解析后消除歧义的过滤器(Action过滤器(时,必须使用替代名称将过滤器绑定到正确的解析树节点,如在构造
syntax Exp = add: Exp "+" Exp;
时将调用Exp add(Exp lhs, Exp rhs) { ... }
对于我们得到的符号位置:
myExp has myLabel
;检查当前解析树节点是否具有其中一个符号位置标记为myLabel
的语法规则myExp.myLabel
;从给定的解析树中投影出标记位置的树myExp.myLabel = newExp
;替换给定解析树中标记位置的树