2.11 语义连接

有时解析只服务于检测一个字符串的正确性;字符串符合给定的语法就是我们想要知道的,例如因为它证实了我们某些观察模式的猜想,那确定就是被我们特意为之设计的语法正确描述的。然而,一般情况下,我们想要做的更多:我们知道字符串都传达一种含义,一种语义,而且这种语义直接与这个字符串的生成树的结构相关。(如果不是,那我们就弄错了语法!)

语法附加语义是通过一个非常简单但有效的方式完成的:语法中的每一个规则,其规则右侧成员语义相关的一个语义子句被附加在其左侧的语义上,这种情况下语义从生成树的节点直接流向起始符号;或者反过来说,这种情况下,语义反向从起始符号流向节点;又或者同时的,在这种情况下,语义信息一会向上一会向下流动,直到达到某个稳定状态。语义信息向下的流动称为继承:生成树上的每个规则从其父节点继承语义。语义信息向上流动称为派生:每一个规则由其子节点派生。

有许多方式来表达语义子句。因为我们的主题是解析和语法而不是语义,我们将只会简要描述两个经常用到并得到充分研究的技术:属性语法和转导语法。我们会使用同一个简单例子来解释,一位数数字的总和的语言;这个语言的句子的语义是总和的值。这个语言由图Fig 2.30的语法生成。例如他的一个句子是3+5+1;其语义就是9。

图1 Fig2.30