流氓:语法定义文档中的"label"和"name"有什么区别?



Rascal的SyntaxDefinition文档页面有两个部分,其中一个部分讲述"标签"(以"语法定义的每个替代项都由符号列表定义。">开始(,另一个部分则讲述"名称"(以"替代项可以命名也可以不命名。",例如两者都启用is运算符对于内爆ParseTrees或写入Action函数是必要的。页面顶部的"语法"部分仅列出Name组件和Tags,但没有标签。

"标签"是"名称"的替代词吗?如果是这样,为什么使用它们的效果列表不同?

这个文档页面确实需要一些爱。

谈论的"标签"的作用是可选地为两种不同的东西声明"名称":

  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使用规则标签将具体的解析树节点映射到抽象的数据树节点
  • 在编写解析后消除歧义的过滤器(Action过滤器(时,必须使用替代名称将过滤器绑定到正确的解析树节点,如在构造syntax Exp = add: Exp "+" Exp;时将调用Exp add(Exp lhs, Exp rhs) { ... }

对于我们得到的符号位置:

  • myExp has myLabel;检查当前解析树节点是否具有其中一个符号位置标记为myLabel的语法规则
  • myExp.myLabel;从给定的解析树中投影出标记位置的树
  • myExp.myLabel = newExp;替换给定解析树中标记位置的树

最新更新