- 19
- 0
- 约1.81万字
- 约 95页
- 2017-08-22 发布于江苏
- 举报
编译原理第4语法分析和语法分析程序
第4章 语法分析和语法分析程序
计算机与软件学院 陆克中 kzlu@szu.edu.cn
1
第4章 语法分析和语法分析程序
2
编译程序的逻辑结构
词法分析程序
语法分析程序
语义分析程序
中间代码生成
代码优化程序
目标代码生成
信息表管理程序
错误检查和处理程序
源
程
序
目
标
代
码
第4章 语法分析和语法分析程序
3
编译程序的组织
语法分析
程序
语义分析及
代码生成程序
词法分析
程序
整理目标程序
源程序
目标程序
停机
开始
第4章 语法分析和语法分析程序
4
语法树(分析树、推导树)
每个结点均有标记?VN∪VT
根的标记为开始符号S
内部结点标记?VN
若以A为标记的结点有k个孩子分别标记为X1, X2, …, Xk, 则A?X1X2…Xk必然是G的一个产生式。
文法的二义性:一个句子对应多个语法树。
对无二义文法,一个句子只对应一个语法树。
第4章 语法分析和语法分析程序
5
按产生语法树的方向分类
自顶向下分析
递归下降法
LL
自底向上分析
算符优先法
LR
4.1 自顶向下的语法分析
6
例 文法G[E]:
E?T | EAT
T?F | TMF
F?(E) | i
A?+ | -
M?* | /
建立从E到i+i*i的最左推导。
左递归与死循环:E?EAT,必须消除左递归。
4.1.1 消除文法的左递归
7
直接左递归的消除
前提:掌握算法2.1-2.6消除无用符号和无用产生式、?产生式和单产生式。
直接左递归的形式:A?A?,??V+
方法一:将A?A?|? 改写为A??{?}
方法二:引入A,改写为A??A和A??A|?
一般化:将A?A?1|A?2|…|A?n|?1|?2|…|?m改写为A??1A |?2A |…|?mA和A??1A |?2A |…|?nA |?
4.1.1 消除文法的左递归
8
左递归的消除
从线性方程组到矩阵方程
从3类文法到2类文法
只关心产生式右部各符号串的首字符
对n个非终结符X1…Xn,得到矩阵方程
或表示为: X=XA+B,方程的解为: X=BA*
由于A*=A0+A1+A2+…=I+AA* (r*=?|rr*)
若令A*=Z,则对X=BA*可得X=BZ和Z=I+AZ
X会不会产生左递归?
Z会不会产生左递归?
4.1.1 消除文法的左递归
9
左递归的消除
从线性方程组到矩阵方程
例 消除文法S?Sa|Ab|a, A?Sc的左递归。
S=Sa+Ab+a
A=Sc+AΦ+Φ
4.1.1 消除文法的左递归
10
课堂练习
消除文法S?AS|b, A?SA|a的左递归。
4.1.1 消除文法的左递归
11
课堂练习
消除文法S?AS|b, A?SA|a的左递归。
S=SΦ+AS+b
A=SA+AΦ+a
S?bz11 | az21 A?bz12 | az22
z11?? | Az21 z12?Az22 z21?Sz11 z22?? | Sz12
4.1.4 预测分析法
12
FIRST集的定义
对符号串?,FIRST(?)={a|??*a?, 且a?VT, ??V*} (当??*?,约定??FIRST(?)),即FIRST(?)由?推导出的每个符号串的首个终结符组成。
若?以终结符a打头,则FIRST(?)=FIRST(a)={a}。
若?以非终结符X打头,则FIRST(?)=FIRST(X)?(若X?*?,等式不成立)
4.1.4 预测分析法
13
构造FIRST集的方法
令X?VN,a?VT,X的产生式具有下述3种形式
4.1.4 预测分析法
14
构造FIRST集的方法
遍历所有左部为X的产生式
set FIRST(X) {
ft = ?;
if (X?VT) return {X};
if (X?? ?P) ft += {?};
for each(X?Y1Y2…Yk?P ) {
for each(Yi) {
if (??FIRST(Yi)) {
ft += (FIRST(Yi) - {?});
if (i == k) ft += {?};
} else {
ft += FIRST(Yi);
break;
}
}
}
return ft;
}
4.1.4 预测分析法
15
构造FIRST集的方法
例 对文法G[E]:
E?TE′
E′?ATE′ | ?
T?FT′
T′?MFT′ | ?
F?(E) | i
A?+ | -
M?* | /
求每个非终结符的FIRST集合。
4.1.4 预测分析法
16
构造FIRST集的方法
例
FIRST(A)={+, -}
FIRST(F)={(, i}
FIRST(T)=FIRST(F)={(, i}
F
原创力文档

文档评论(0)