Rascal:语法定义文档中的 "label" 和 "name" 有什么区别?
Rascal: What is the difference between "label" and "name" in the Syntax Definition documentation?
流氓的SyntaxDefinition documentation page分两节,一节讲"labels"(从"Each alternative of a syntax definition is defined by a list of Symbols."开始),另一节讲"names"(以"Alternatives can be named or not."开头)。对于这两个项目,给出的效果列表在很大程度上是重叠的,例如两者都启用 is
运算符,对于内爆 ParseTrees 或编写 Action 函数是必需的。页面顶部的语法部分仅列出了 Name
组件和 Tags
但没有标签。
"label" 是 "name" 的替代词吗?如果是这样,为什么使用它们的效果列表不同?
该文档页面确实需要一些爱。
所讨论的 "labels" 作为 可选 声明 "names" 用于两种不同类型的事物:
- 非终端的替代规则可能有一个标签,如
syntax E = add: E "+" E | sub: E "-" E;
- 语法规则中的符号位置可能有一个标签,如
syntax E = E lhs "+" E rhs | E lhs "-" E rhs;
在规则上添加标签与在符号位置上添加标签启用不同的功能。
对于规则,我们得到:
myExp is myLabel
;检查顶部解析树节点是否有标有该标签的语法规则
ParseTree::implode
使用规则标签将具体解析树节点映射到抽象数据树节点
- 当写一个post-parse消歧过滤器,一个Action过滤器,你必须使用替代名称将过滤器绑定到正确的解析树节点,因为在
Exp add(Exp lhs, Exp rhs) { ... }
中构造时会调用syntax Exp = add: Exp "+" Exp;
对于符号位置,我们得到:
myExp has myLabel
;检查当前解析树节点是否有一个语法规则,其中一个符号位置被标记为 myLabel
myExp.myLabel
;从给定的解析树 中投影出标记位置的树
myExp.myLabel = newExp
;替换给定解析树中标记位置的树
流氓的SyntaxDefinition documentation page分两节,一节讲"labels"(从"Each alternative of a syntax definition is defined by a list of Symbols."开始),另一节讲"names"(以"Alternatives can be named or not."开头)。对于这两个项目,给出的效果列表在很大程度上是重叠的,例如两者都启用 is
运算符,对于内爆 ParseTrees 或编写 Action 函数是必需的。页面顶部的语法部分仅列出了 Name
组件和 Tags
但没有标签。
"label" 是 "name" 的替代词吗?如果是这样,为什么使用它们的效果列表不同?
该文档页面确实需要一些爱。
所讨论的 "labels" 作为 可选 声明 "names" 用于两种不同类型的事物:
- 非终端的替代规则可能有一个标签,如
syntax E = add: E "+" E | sub: E "-" E;
- 语法规则中的符号位置可能有一个标签,如
syntax E = E lhs "+" E rhs | E lhs "-" E rhs;
在规则上添加标签与在符号位置上添加标签启用不同的功能。
对于规则,我们得到:
myExp is myLabel
;检查顶部解析树节点是否有标有该标签的语法规则ParseTree::implode
使用规则标签将具体解析树节点映射到抽象数据树节点- 当写一个post-parse消歧过滤器,一个Action过滤器,你必须使用替代名称将过滤器绑定到正确的解析树节点,因为在
Exp add(Exp lhs, Exp rhs) { ... }
中构造时会调用syntax Exp = add: Exp "+" Exp;
对于符号位置,我们得到:
myExp has myLabel
;检查当前解析树节点是否有一个语法规则,其中一个符号位置被标记为myLabel
myExp.myLabel
;从给定的解析树 中投影出标记位置的树
myExp.myLabel = newExp
;替换给定解析树中标记位置的树