由于编译程序工作的最终目标是将源程序翻译成可供计算机直接执行的目标程序,所以从整个编译过程来看,词法分析与语法分析仅仅是编译程序工作的一小部分。在早期的一些编译程序中,是在语法分析的基础上根据源程序中各语法成分的语义,直接产生机器语言或汇编语言形式的目标代码。虽然这种编译方式所需的时间较少,但具有很大的局限性,如不利于优化,编译程序难以移植,代码质量不高,等等。现在的编译系统,一般都是将经过语法分析的源程序先翻译为某种形式的中间语言代码,然后再将其翻译为目标代码,这样就使编译程序各组成部分功能更单一,编译程序的逻辑结构更为清晰,从而使得编译程序更易于编写与调整,同时也为代码优化和编译程序的移植创造了条件。
对于中间代码生成来说,我们也自然希望同样能够形式化地自动生成。遗憾的是,中间代码生成与语言的语义密切相关,而语义的形式化描述是一个非常困难的课题,时至今日,还没有一个被广泛接受的、可用于描述中间代码生成所需的全部语义动作的形式化系统。
然而,尽管如此,却存在一种称为语法制导翻译的模式(Syntax-Directed TranslationSchenm,SDTS),这种模式实际上是对前后文无关文法的一种扩充。概括地说,就是对文法中的每个产生式都附加一个语义动作或语义子程序,且在语法分析过程中,每当需要使用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作外,还要执行相应的语义动作或调用相应的语义子程序。每个语义子程序都指明了相应产生式中各个符号的具体含义,并规定了使用该产生式进行分析时所应采取的语义动作(如传送或处理信息、查填符号表、计算值、产生中间代码等等)。这种模式既把语法分析与语义处理分开,又令其平行地进行,从而在同一遍扫描中同时完成语法分析和语义处理两项工作。
一个文法符号X 的语义信息我们称之为语义属性或简称为属性(Attributes)。我们把适用于定义语义的特殊文法叫做属性文法,适用于语义翻译的文法叫做属性翻译文法。