6.7.3 获取解析树信息

图6.15中的DCG程序是一个识别器而不是解析器,但逻辑变量让它也可以很轻松的获取解析树的信息。因此我们为DCG程序中的非终结符提供了一个逻辑参数,即它构建的树。树中的节点可以直接用复合值表示,整个规则(引号之间的部分)作为名称,子规则作为其组件。因此带有子规则XY的规则S--->AB可以表示为 ’S--->AB’(X,Y)。右侧的token不产生解析树,因为它们已经出现在规则名称中了。

由于非终结符A的子节点的解析树是由A的DCG规则右侧的子元素传递的,因此要获得A要传递的正确解析树,我们要做的就是从规则名称和它子集的解析树创建一个复合值。结果如图6.16所示。它很大程度上依赖于Prolog的能力,即推迟值得实例化,直到实例的源可用。