我想了解LR-属性解析器能做什么以及它是如何实现的。
使用$0,$-1等规范语法时,yacc生成的解析器允许继承属性,当属性来源是位于其左侧的一个兄弟节点时。对于
现在,zyacc文档指出,他们允许LR-属性语法,这可能与yacc允许的相同或者更多。只是在zyacc中,这些属性是由非终端符号(类似参数)指定的,并且不仅仅在语义动作中访问。是否还有其他差异,例如LR-属性比yacc继承属性更强大,或者LR-属性的实现方式不同(不只是向下查找堆栈)?
使用$0,$-1等规范语法时,yacc生成的解析器允许继承属性,当属性来源是位于其左侧的一个兄弟节点时。对于
S -> A B
,B可以从A继承合成属性,但无法从S继承。我认为这是通过在堆栈中向下查找1个元素(即A)来完成的。现在,zyacc文档指出,他们允许LR-属性语法,这可能与yacc允许的相同或者更多。只是在zyacc中,这些属性是由非终端符号(类似参数)指定的,并且不仅仅在语义动作中访问。是否还有其他差异,例如LR-属性比yacc继承属性更强大,或者LR-属性的实现方式不同(不只是向下查找堆栈)?