L-属性语法和自下而上的解析

L-attributed grammar and bottom-up parsing

我想了解自下而上解析过程中 L 属性语法和计算属性之间的关系。在为每个上下文无关文法或只为某些选定的文法(如 LR(k))创建语法树期间,是否总是可以计算所有属性?让我们假设允许进行一些转换,例如添加新的非终结符和 epsilon 产生式。 我一直在寻找相关信息,但找不到。

如果你能从左到右自底向上构造解析树,那么你就可以计算 L 属性。这是一个重言式,因为 L 属性是您可以自下而上从左到右计算的那些属性。您如何设法进行解析无关紧要。

通用 LR 解析算法允许您从左到右自下而上地解析,条件是在给定时刻可能有不止一种可能的解析可用。 (事实上​​ ,如果不需要语法明确,则可以对整个输入进行多次解析。)

实际上,在您知道解析节点是最终解析的一部分之前计算解析节点的属性可能效率极低。同样在实践中,人们会在此处插入有关具有副作用的操作的警告,但计算解析节点的属性本身并不是副作用,如果它对宇宙有其他影响,那么我们就不再处于数学理论领域。

此外,如果语法是明确的,则可能的解析数量可能会在输入的长度上呈指数增长。大多数广义 LR 算法构造解析图而不是解析树,这可以仅使用多项式 space 来表示可能树的指数数量。但这需要在不同的解析之间共享节点,这在属性计算方面可能是不可能的,因为要共享的节点可能具有不同的属性。

在这里,我认为,值得重新审视上面提到的副作用问题,因为计算节点的属性值可能并非真的不是副作用。如果您正在构建一个在其构造过程中可观察到的持久结构(解析树),那么将属性分配给该结构的组件肯定是一个副作用。另一方面,如果结构在其构建过程中从外部不可见,那么何时将属性分配给组件就无关紧要了。在那种情况下,最好将 L 属性视为可以在(完全构造的)解析树的单个深度优先从左到右遍历中计算的那些属性。