编译原理 第五部分
语法制导翻译
语法制导翻译是处理语义的基本方法,它以语法分析为基础,在语法分析得到语言结构的结果时,对附着于此结构的语义进行处理,如计算表达式的值、生成中间代码等。
语法与语义的关系
语法是指语言的结构、即语言的“样子”;语义是指附着于语言结构上的实际含意 ,即语言的“意义”
语义不能离开语法独立存在
语义远比语法复杂
同一语言结构可以包含多种含意,不同语言结构表示相同含意
语法与语义之间没有明确的界线。
语义分析的两个作用
检查是否结构正确的句子所表示的意思也合法
执行规定的语义动作,如:表达式求值、符号表填写、中间代码生成等
语义分析的方法
语法制导翻译
语义规则有两种常用的描述形式:
语法制导定义:定义翻译所必须的语义属性和语义规则,一般不涉及计算顺序。
翻译模式: 除了定义翻译所必须的语义属性和语义规则,还给出计算顺序。
语法制导的定义
语法制导的定义是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。这些属性代表与文法符号相关的信息,例如它的类型、值、代码序列、符号表内容等等。属性和变量一样,可以进行计算和传递。
属性一般分为两类:综合属性和继承属性。简单的说,综合属性用于“自下而上”传递信息,而继承属性用于“自上而下”传递信息。
属性加工的过程即是语义处理的过程,对于文法的每一个产生式都配备了一组属性的计算规则,则称为语义规则。
语法制导翻译的基本思想(Syntax-Directed Translations)
以语法分析为基础,伴随语法分析的各个步骤,执行相应的语义动作。
具体方法:
- 将文法符号所代表的语言结构的意思,用附着于该文法符号的属性表示;
- 用语义规则规定产生式所代表的语言结构之间的关系(即属性之间的关系),即用语义规则实现属性计算。
语义规则的执行:
在语法分析的适当时刻(如推导或归约)执行附着在对应产生式上的语义规则,以实现 对语言结构语义的处理,如计算、查填符号表、生成中间代码、发布出错信息等。
属性文法
属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。这些属性代表与文法符号相关的信息,例如它的类型、值、代码序列、符号表内容等等。属性和变量一样,可以进行计算和传递。
属性一般分为两类:综合属性和继承属性。简单的说,综合属性用于“自下而上”传递信息,而继承属性用于“自上而下”传递信息。
终结符只有综合属性,它由词法分析器提供
非终结符既可以有综合属性也可以有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值
终合属性
在语法树中,一个结点的综合属性的值由其子结点的属性值确定。因此,通常使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值。仅仅使用综合属性的属性文法称S—属性文法。
继承属性
在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定。用继承属性来表示程序语言结构中的上下文依赖关系很方便。
S-属性文法:只包含综合属性,S-属性文法是L-属性文法的一个特例
L-属性文法
- 可以包含综合属性,也可以包含继承属性
- 产生式右端某文法符号的继承属性的计算只取决于该符号左边文法符号的属性 (对于产生式左边文法符号,只能是继承属性)