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" 用于两种不同类型的事物:

  1. 非终端的替代规则可能有一个标签,如 syntax E = add: E "+" E | sub: E "-" E;
  2. 语法规则中的符号位置可能有一个标签,如 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;替换给定解析树中标记位置的树