那个文档页面确实需要一些爱。
被称为“标签”的功能是
选择性地
声明了两种不同事物的“名称”:
-
非终端的替代规则可能有标签,如中所示
syntax E = add: E "+" E | sub: E "-" E;
-
语法规则中的符号位置可能有标签,如中所示
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
; 替换给定解析树中标记位置的树