编译原理第4语法分析和语法分析程序.pptxVIP

  • 19
  • 0
  • 约1.81万字
  • 约 95页
  • 2017-08-22 发布于江苏
  • 举报

编译原理第4语法分析和语法分析程序.pptx

编译原理第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)

1亿VIP精品文档

相关文档