代码之家  ›  专栏  ›  技术社区  ›  ThomasH

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

  •  0
  • ThomasH  · 技术社区  · 6 年前

    这个 SyntaxDefinition documentation page 《流氓》有两个章节,其中一个讲的是“标签”(从 “语法定义的每个选项都由符号列表定义。” ),另一个是关于“名字”(以 “备选方案可以命名,也可以不命名。” ).对于这两个项目,都给出了一个很大程度上重叠的效果列表,例如,两者都使 is 运算符,对于内爆语法树或编写操作函数是必需的。页面顶部的语法部分只列出了 Name 组件,以及 Tags 但没有标签。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Jurgen Vinju    6 年前

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

    被称为“标签”的功能是 选择性地 声明了两种不同事物的“名称”:

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

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

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