当前位置:
文档之家› 编译原理课程设计之第六章 语义分析
编译原理课程设计之第六章 语义分析
mcy
13
文法规则 number1→number2 digit
语义规则 number1.val = number2.val*10 + digit.val
number→digit
number.val = digit.val
mcy
14
数345对应 的注释分析树
mcy
15
digit → 0 digit → 1 digit → 2 digit → 3 . . .
一个属性文法中所有的属性都是合成的,就 称作S-属性文法(S-attributed grammar)。
mcy
17
树遍历的合成属性的计算
从语法分析树角度看,如果一个节点(文法符 号)的某一属性其值由其子节点的属性值来计 算,则称该属性为合成属性。 给定由语法分析程序构造的分析树或语法树, S-属性文法的属性值可以通过对树进行简单的 自底向上或后序遍历来计算。这可以用以下递 归的属性赋值程序来表示:
课程内容
第一章
概论 第二章 词法分析 第三章上下文无关文法及分析 第四章自上而下的语法分析 第五章自下而上的语法分析 第六章语义分析 第七章运行时环境 第八章代码生成
mcy 1
第6章 语义分析
程序设计语言的语义分为静态语义和动态语义
两种。
静态语义是指在编译阶段能够检查的语义; 动态语义是指在目标程序运行阶段能够检查的语义。
产生式1
...
相关的属性等式
...
产生式n
相关的属性等式
mcy
8
例6.1: 如无符号数文法
number→number digit |digit
digit→0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
的val(十进制值)属性的属性文法如下:
mcy
9
数345对应 的分析树
mcy
39
在组合合成和继承属性的属性文法中, 如果合成属性依赖于继承属性(及其他 合成属性),但继承属性不依赖于任何 合成属性,那么就可能在分析树或语法 树的一遍遍历中计算所有的属性。
mcy
40
void CombinedEval (T: treenode); { for each child C of T do
mcy
29
文法规则
语义规则 var-list.dtype = type.dtype type.dtype = integer type.dtype = real
decl→type var-list type→int type→float
mcy
30
var-list1→id,var-list2
id.dtype = var-list1.dtype var-list2.dtype = var-list1.dtype
Xi.aj=fij(X0.a1,...,X0.ak,X1.a1,..., X1.ak,...,Xn.a1,...,Xn.ak)
fij是一个数学函数。 即产生式的语义规则是产生式中相关文法符号属性值的等式。
mcy
7
一般将属性文法写成表格形式,每个产生式 用相应语义规则列出,如下所示:
文法规则 语义规则
mcy
32
mcy
33
例6.4:文法:
based-num→num basechar
basechar →o | d
num→num digit | digit
digit→0|1|2|3|4|5|6|7|8|9
考虑其属性val(十进制值)的属性文法:
mcy
34
mcy
35
文法规则 based-num → num basechar basechar→o basechar→d
{for each child C of T do
compute all inherited attributes of C;
PreEval ( C );
}
mcy
28
例6.3:文法 decl→type var-list
type→int|float
var-list→id,var-list|id 考虑其属性dtype(数据类型)的属性文法:
var-list→id
id.dtype=var-list.dtype
mcy
31
考虑符号串float x,y的分析树:
decl type var-list float id , var-list
id
节点dtype属性的递归程序的伪代码如下: documents\006-06\节点dtype属性的计 算.doc
term→factor
factor→(exp) factor→number
term.val=factor.val
factor.val=exp.val factor.val=number.val
mcy
22
对于上述简单整型算术表达式属性文法,假 设表达式(34-3)*42语法分析的结果如下:
* 34 3 (34-3)*42 的抽象语法树 42
mcy
23
抽象语法树的定义如下:
typedef enum { Plus, Minus, Times } OpKind; typedef enum { OpKind, ConstKind } ExpKind;
typedef struct streenode
{ ExpKind kind; OpKind op; struct streenode *lchild, *rchild; int val;
compute all inherited attributes of C;
CombinedEval ( C ); compute all synthesized attributes of T; }
mcy
41
5. 属性计算方法
1)
树遍历的属性计算方法 假设语法树已经建立起了,并且树中已 带有终结符的合成属性。然后以某种次 序遍历语法树,直至计算出所有属性。 如果需要的话,可使用多次遍历(或称 遍)。
(1)所采用的语法分析方法
(2)属性的计算次序。 语法分析方法都要求从左向右处理输入程 序,等价于要求属性能通过从左向右遍历 分析树进行赋值。
mcy
44
定义属性a1,...,ak 的一个属性文法是L-属性(Lattributed)文法,如果满足
mcy
18
void PostEval (T: treenode); { for each child C of T do PostEval (C); compute all synthesized attributes of T; }
mcy
19
例6.2:简单整型算术表达式文法 exp→exp+term|exp-term|term term→term*factor|factor factor→(exp)|number 的val(十进制值)属性的属性文法如下
34 val=34
3 val=3
mcy
26
4. 继承属性
从语法分析树角度看,一个节点的某一属性 值是由父结点和/或兄弟结点的属性值来计算, 则该属性称为继承属性。 继承属性的计算可以通过对分析树或语法树 的前序遍历或前序和中序遍历的组合来进行, 用伪代码表示:mcy Nhomakorabea27
void PreEval(T: treenode);
语法制导语义是对上下文无关文法的推广,其中
每个文法符号(终结符号或非终结符号)都有一个相关的 属性集(语义信息)。 每个产生式都有一个相关的语义规则集合。
如果X是一个文法符号,a是X的一个属性,那么我 们把与X关联的属性a的值记作X.a。
mcy
6
2.属性文法的定义
对于上下文无关文法中的任一产生式X0→X1X2...Xn,属性集 合a1,...,ak的属性文法是文法所有产生式的语义规则的集合。 其语义规则定义如下:
mcy
2
语义分析的任务:
计算各类语法成分的语义信息(属性信息),一般将收集
的语义信息存放到相应的信息表中,在编译程序中符号 表是用来存放源程序中标示符相关属性(语义)信息的一 种信息表。 静态语义检查
类型检查:指类型相容问题的检查,如果操作符作用于不相容的操作数, 则编译器应该报错。 上下文有关问题的检查:当某个对象出现时,要求它必须在前面的某个 适当位置已经出现过。 唯一性检查:有时,要求某个对象只能被定义一次。 控制流检查:引起控制流从某个结构中跳转出来的语句,必须能够决定 控制流转向的目标地址。
mcy
3
6.1 属性和属性文法 6.2 符号表 6.3 数据类型和类型检查
文法符号语 义信息的计 算技术 语义分析 的两个主 要方面
mcy
4
6.1 属性和属性文法
至今没有形式化的系统来描述语义,但存在一种 语法制导语义,将语义信息和程序设计语言的语 法结构联系起来。
mcy
5
1.语法制导语义的原理
digit.val = 0 digit.val = 1 digit.val = 2 digit.val = 3 . . .
mcy
16
3. 合成属性 一个属性a是合成(综合)的,如果给定一个 产生式A→X1X2...Xn,相关属性等式有以下 形式: A.a=f(X1.a1,…,X1.ak,...,Xn .a1,…,Xn.ak)
语义规则 based-num.val=num.val num.base=basechar.base basechar.base=8 basechar.base=10
mcy
36
num1→num2 digit
if digit.val=error or num2.val=error then num1.val = error else num1.val =num2.val*num1.base+digit.val num2.base=num1.base digit.base=num1.base