为什么终端可以有合成属性而没有继承属性?

问题描述 投票:0回答:1

在Aho等人的《编译器。原理、技术和工具》第305页中说:"终端可以有合成属性,但不能有继承属性。" 我的疑惑是:如果合成属性是可以基于节点的子节点计算的属性,而继承属性可以基于节点的父节点和兄弟姐妹计算,那么我觉得这是不对的,因为既然终端会是解析树的叶子,它们就不会有任何子节点。如果它们没有任何子节点,那么它们就不应该有合成的属性。同样,既然它们是叶子,那么它们很可能会有父节点,因此,可以有继承的属性。如果有人能指出我哪里做错了,那就太好了。

grammar code-translation parse-tree
1个回答
1
投票

当初在龙书上看到这句话的时候,我也是一头雾水。但如果你想一想,就会明白了。终端合成的属性并不是来自于解析器,而是来自于lexer。举个例子假设你有一个终端 数字 (例取自龙书)。数字 具有综合属性 lexval. 这个合成属性不是来自解析器,而是来自词典。而是来自于词法器。这应该很清楚为什么终端不能有继承的属性:)

© www.soinside.com 2019 - 2024. All rights reserved.