已阅读5页,还剩77页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章自顶向下语法分析方法 自顶向下分析的一般过程和问题FIRST和FOLLOW集定义和计算LL 1 文法定义LL 1 分析程序实现 4 1语法分析概述 语法分析是编译过程的核心 其任务是在词法分析识别出正确的单词符号串的基础上 分析并判定程序的语法结构是否符合语法规则 高级语言的语法结构适合用上下文无关文法来描述 上下文无关文法是语法分析的基础 语法分析在编译系统中所处的位置 语法分析器的输入Token序列 词法分析的输出 是各个单词都正确的源程序的变换形式 是一个有限序列语法分析器的输出分析树 表示方法 见教材P89错误处理信息 定位 继续编译 语法分析的接口设计 语法分析器的功能按照语言的语法构成规则 识别输入的符号串能否构成一个句子 这些规则是用文法的产生式来定义的 问题对给定的一个输入串 如何判定它是不是一个句子 方法根据文法的产生式规则 从开始符号出发 看能否推导出与这个输入串匹配的句子 这就需要建立与输入串匹配的语法分析树 G E i P E P E E EE E EE E E i 解 使用最左推导 E E E E E E E E i E E i i E i i i 例1 判定输入串 i i i是否是下述文法的句子 结论 能够从开始符号出发推导出给定的输入串 因此 是句子 7 7 例2 已知符号串S cad文法G Z Z cAdA ab a求证 S L G Z 分析过程是设法建立一棵语法树 使语法树的末端结点与给定符号串相匹配 2 用Z的右部 符号串去匹配输入串 完成一步推导Z cAd检查c c匹配A是非终结符 将匹配任务交给A 8 8 3 选用A的右部符号串匹配输入串A有两个右部 选第一个 完成进一步推导A ab检查 a a匹配 b d不匹配 失败 但是还不能冒然宣布S L G Z 4 回溯即砍掉A的子树改选A的第二右部 A a检查a a匹配d d匹配 建立语法树 末端结点为cad与输入cad相匹配 建立了推导序列Z cAd cad cad L G Z S cadG Z Z cAdA ab a 分析工作要部分地或全部地退回去重做叫回溯 常用的语法分析方法 自顶向下分析法 从文法的开始符号出发 向下推导 使用最左推导 尽可能使用各种产生式 推导出与输入串匹配的句子 从而建立语法树 自底向上分析法 从输入符号串开始 逐步进行归约 最右推导的逆过程 直至归约到文法的开始符号 从而建立语法树 具体分类 4 2自顶向下语法分析 自上而下分析主要是 对任何输入串 试图用一切可能的办法 从文法的开始符号出发 自上而下地为输入串建立一个语法树 从推导的角度看 从开始符号出发 使用最左推导 试图推导出与输入符号串相同的句子 从语法树的角度看 从根节点出发 反复使用所有可能的产生式 谋求输入串的匹配 试图向下构造一棵语法树 其末端节点正好与输入符号串相同 需要反复试探 句型的推导 最左 最右 推导 在推导的任何一步 其中 是句型 都是对 中的最左 右 非终结符进行替换最右推导被称为规范推导 由规范推导所得的句型称为规范句型 复习 自顶向下分析方法特点 1 分析过程是带有预测的 对输入符号串要预测属于什么语法成分 然后根据该语法成分的文法建立语法树 2 分析过程是一种试探过程 是尽一切办法 选用不同规则 设法建立语法树的过程 由于是试探过程 故难免有失败 所以分析过程需进行回溯 因此我们也称这种方法是带回溯的自顶向下分析方法 例1 设有文法 1 S xAy 2 A 现有输入串 x y其分析过程如右 失败 需要退回 重新选取A的侯选式 这时使得分析器的动作不稳定 思考 产生回溯的原因 问题1 回溯 真正原因是 文法的产生式有问题 回溯问题 14 14 什么是回溯 分析工作要部分地或全部地退回去重做叫回溯 造成回溯的条件 文法中 对于某个非终结符号的规则其右部有多个选择 并根据所面临的输入符号不能准确的确定所要选择时 就可能出现回溯 回溯带来的问题 严重的效率低 只有在理论上的意义而无实际意义 左递归 文法中存在某个A Vn 有AA 直接左递归 有产生式A A 间接左递归 例2 设有文法G E 1 E E T T 2 T T F F 3 F E i现有输入串i i i 分析过程是 失败 对左递归文法使用最左推导 出现死循环 思考 产生左递归的原因 问题2 左递归 真正原因是 文法的产生式有问题 结论 1 左递归和回溯问题的产生直接与描述语言的文法有关2 应该改造文法 使其不含左递归和回溯 才能进行确定的自顶向下分析 4 3问题的解决方法 消除左递归消除回溯 4 3 1消除左递归 1 直接左递归的消除 假定产生式为 P P 将其替换为形式等价的产生式组 例2 文法E E T TT T F FF E i消去左递归后为 T FT T FT E TE E TE F E i 证明的关键步骤 P P P P P P P P P P P 一般而言 若产生式形式为 A A 1 A 2 A n 1 2 m将其替换为 练习 消去文法G S 的左递归 S T a S aT T S S 例 给定间接左递归文法 请消除左递归 1 代入2 消除直接左递归 S Qc cQ Rb bR Sa a 解 第1步 为R S Q排序第2步 代入 将R代入Q Q代入S 得到新的文法产生式组 R Sa aQ Sab ab bS Sabc abc bc c第3步 消去S的直接左递归 得到 S abcS bcS cS S abcS 2 间接左递归的消除方法 方法是 反复 提取公共左因子 使得文法的每个非终结符号的各个候选式的首终结符集两两不相交 来避免回溯 设产生式为 A 1 2 n 4 3 2消除回溯 例3 有如下两个产生式 ifEthenS1elseS2 ifEthenS1 提取左因子后 ifEthenS1B B elseS2 练习 提取下述文法的左因子 S T a S aT ST T ST 问题 如果希望没有回溯 对文法有什么要求 回溯产生的真正原因是 某非终结符对应多个侯选式 它们右部的第一个终结符相同 从而导致语法分析器选择了错误的侯选式 如果希望没有回溯 对文法有什么要求 4 4 1侯选式的首终结符集的定义 即 由该候选式推导出的所有符号串中的第一个终结符的集合 4 4LL 1 文法 S ApS BqA aA cAB bB dB 练习 求给定文法的每个候选式的First集 1 S xAy 2 A 在右边给定的文法中 A的候选式有两个 其首终结符集为 First A1 First A2 相交 就会产生回溯 因此 只要存在某个非终结符的多个候选式的首终结符集相交 就会在推导的某时刻产生回溯 从而导致语法分析器选择了错误的侯选式 因此 不产生回溯的条件就是 对非终结符A的任意两个不同的侯选式ai和aj 都有 First ai First aj 当要求用A进行匹配时 就能根据所面临的输入字符 准确地选取一个A的侯选式 32 32 例子 设有文法G S S Aa BbA d cAB b aB 对S FIRST Aa d c FIRST Bb a b FIRST Aa FIRST Bb 对A FIRST d d FIRST CA c FIRST d FIRST Ca 对B FIRST b b FIRST aB a FIRST b FIRST aB 若给定w abb则自顶而下分析对应的推导为 S Bb aBb abb 求非终结符A的First集的算法 求某一非终结符A的首终结符集First A 的算法为 1 若有产生式A a a VT 把a加到First A 中 2 若有产生式A 把 加到First A 中 3 若有产生式A X X VN 把First X 中非 元素加到First A 中 4 若有产生式A X1X2X3 Xk 其中X1X2 Xk VN 则当X1X2X3 Xi 1 i k 时 把First Xi 1 Xk 的非 元素加到First A 中 当X1X2X3 Xk 时 把First 加入First A 中5 重复执行上述过程 直到First A 不再增大 S ApS BqA aA cAB bB dB 例 用算法求下述文法的每个非终结符的First集 E TE E TE E T FT T FT T F E F i First F i First T First E First T First F i First E First T i 练习 求下列文法的每个非终结符的First集 是否满足 没有左递归 每个侯选式的首终结符集不相交这两个条件 就一定能进行有效的自顶向下分析呢 思考题 确定的自上而下的分析举例1 对于文法G1 S S pAS qBA cAdA a对输入串pccadd 自上而下的推导过程是 S pA pcAd pccAdd pccadd对应的分析树 例2 对于文法G2 S S ApS BqA aA cAB bB dB 输入串ccap 自上而下的推导过程是 S Ap cAp ccAp ccap 4 4 2后随符号集的定义 假定S是文法的开始符号 对于 A N Follow A a S Aa a T 特别 若S A 则 FOLLOW A 当非终结符A面临a时 a不属于A的任何侯选首终结符集 但A的某个候选首终结符集中含 只有当a FOLLOW A 时才能自动进行匹配 注 FOLLOW集合中不能有 对右边给定的文法 求A的后随符号集follow A S ApA a A cAA aA follow A p 求非终结符A的Follow集的算法 1 如果A是开始符号 Follow A 2 若有产生式B Aa a VT 则把a加入到Follow A 中 3 若有产生式B AX X VN 则把First X 中非 元素加入Follow A 中 4 若B A或B A 则把Follow B 加入到Follow A 中 5 连续使用上述规则 直到Follow A 不再增大 例 求下题的Follow集 S ApS BqA aA cAB bB dB 解 Follow S Follow A p Follow B q 规则1 规则2 规则2 练习 1 E TE 2 E TE 3 E 4 T FT 5 T FT 6 T 7 F E 8 F i follow E follow E follow E follow T first E follow E follow T follow T follow F first T follow T E是开始符号 应用规则1 根据产生式7 应用规则2 根据产生式1 应用规则4 根据产生式2 应用规则3 根据产生式2 3 应用规则4 根据产生式4 应用规则4 根据产生式4 应用规则3根据产生式4 6 应用规则4 求下题的Follow集 例 仍讨论文法G S S AB bCA b B aD C AD bD aS c所有非终结符求FOLLOW集过程如下 FOLLOW S FOLLOW D FOLLOW A a a c FOLLOW S FOLLOW B FOLLOW S FOLLOW C FOLLOW S FOLLOW D FOLLOW B FOLLOW C 从FOLLOW S 开始 不断循环求解直到所有FOLLOW集不再增大 最后可得 FOLLOW S FOLLOW A a c FOLLOW B FOLLOW C FOLLOW D 4 4 3LL 1 分析方法 所谓LL 1 分析方法 如此命名该分析方法的原因在于相应的语法分析将按自左至右的顺序扫描输入符号串 并在此过程中产生一个句子的最左推导 至于括号中的 1 则表示在分析过程中 每进行一步推导 只要向前查看一个输入符号 便能确定当前所应选用的产生式 规则 因此 我们通常把按上述方法执行语法分析任务的程序称为LL 1 分析程序或LL 1 分析器 对文法进行不带回溯的确定的自顶向下分析的条件 据此判别是否为LL 1 文法 1 文法不含左递归 2 对文法中的任一个非终结符A的各个候选式的首终结符集两两不相交 是否有回溯 即 若A 1 2 n 则First ai First aj i j 3 对文法中的每个非终结符A 若它的某个首终结符集含有 则First A Follow A LL 1 文法的判别 例 判断下述文法是否是LL 1 文法 S aASS bA bAA 解 1 该文法不含左递归 2 First S aAS a First S b b First A bA b First A S和A的侯选式的first集都不相交 满足条件2 3 由于 First A Follow A First S a b Follow A First A bA 不满足条件3 则不是LL 1 文法 练习 判断给定的文法是否为LL 1 文法 若不是 进行改造 解答 First A ab a First A a a 不满足条件2 故不是LL 1 文法 改造方法 消除回溯 提取公因子 S xAy A a b S xAy A aA A b S xAyA ab a 例3 使用下述文法对i i进行分析 E TE E TE T FT T FT F E i 第一步 i First TE i First FT i First F 第三步 First E 第二步 first T First T Follow T 自动匹配 不读输入符号 LL 1 分析过程 follow E follow E follow E follow T follow E first E follow T follow T follow F first T follow T LL 1 文法的分析过程 假设要用非终结符A进行匹配 面临输入符号a A的所有侯选式为 A 1 2 n分析过程为 总结 若a First A i 使用 i去匹配 若a不属于任何一个产生式的首终结符集 1 若 不属于任何一个First A i 则出错 2 若 属于某个First A i 同时a Follow A 则让A与 自动匹配 否则 a的出现是一种语法错误 4 5递归下降分析方法 是进行语法分析的一种方法要求文法是LL 1 文法实现思想 为文法中每个非终结符编写一个递归过程 每个过程的功能是识别由该非终结符推出的串 当某非终结符的产生式有多个候选式时 按LL 1 形式唯一确定选择哪个候选式进行推导 若遇到某候选式为 认为其自动匹配 把这些递归过程组合起来就构成了文法的递归下降分析程序 基本架构 1 对于每个非终结符号的产生式U u1 u2 un处理的方法如下 U ch 当前符号 if ch是u1符号串的第一个符号 处理u1elseif ch是u2符号串的第一个符号 处理u2 elseerror 由于无回溯的文法保证选择是唯一的 当存在 时 可以用error 替代为 return 这样可以较晚发现错误 约定 进入这个过程时 已读入U的第一个符号 离开这个过程时 下一个符号已经被读到当前符号 基本架构 2 对于U的每个右部ui x1x2 xn的处理架构如下 处理x1的程序 处理x2的程序 处理xn的程序 如果右部为空 则不处理 基本架构 3 对于右部中的每个符号xi如果xi为终结符号 If x 当前输入符号串中的符号 NextCh return else出错处理如果xi为非终结符号 直接调用相应的过程 xi 基本架构 4 对于形如Xi 的产生式 在相应的子程序Pi 中 应该能够判断当前输入符号a是否属于集合FOLLOW Xi 从而决定是从Pi 返回还是报错 在给定的语法定义中选择与IF语句有关的产生式 ifthenelse 0 1 2 3 9 如 对应于产生式 ifthen的过程的算法描述为 ifs gettoken If token if error getnexttoken bool expr getnexttoken If token then error getnexttoken exe sentence 相应于产生式 的过程 bool expr gettoken handle varible Getnexttoken If tokennotin error Getnexttoken handle varible 思考请写出for语句的递归下降的分析程序 for todo 例 为下列表达式文法G E 编写递归下降识别程序 E E T TT T F FF E i 解 步骤1 消除左递归 E TE E TE T FT T FT F E i步骤2 编写递归下降识别子程序 这里使用C语言形式 见下页图 步骤3 编写递归下降识别主程序 使用该识别程序识别输入串 i i i 首先读入符号i 然后调用子程序E 在E中调用子程序T 在T中调用子程序F 匹配i 读入下一符号 子程序F调用完毕 回到T 在T中继续调用子程序T 匹配 读入下一符号i 在T 中继续调用子程序F 匹配i 读入下一符号 回到子程序T 在T 中递归调用子程序T 不执行任何操作返回T 进而返回T 进而返回E 在E中继续调用子程序E 匹配 读入下一符号i 调用子程序T 在T中调用子程序F 匹配i 读入下一符号 为输入串结束符 返回E 在E 中递归调用E 不执行任何操作返回E 进而返回E 至此子程序E调用完毕 回到主程序 检查到达输入串末尾 从而识别成功 由于有些信息需要保留 通常在入口处需保留某些信息 出口时需要恢复 由于递归过程是遵循先进后出规律 所以通常需要开辟先进后出栈来处理 递归分析程序的优点 实现思想简单明了 程序结构和语法规则直接对应 因为每个过程表示一个非终结符号的处理 添加语义加工工作比较方便 需要书写程序的语言支持递归调用 如果递归调用机制是高效的 那么分析程序也是高效的 4 6预测分析程序 递归下降分析法 采用递归过程 因此实现分析程序所使用的高级语言必须支持递归过程才行 预测分析法是自顶向下分析的另一种方法 使用下推自动机的方式实现 使用一个二维分析表和栈联合进行控制来实现分析 预测分析器模型 分析表M 是一个从VN VT 到产生式的映射 在分析时遇到A和a时 应该选择M A a 中存放的产生式 如果M A a 为空 表示出现语法错误 分析表格式 第1列为非终结符 第1行为终结符 每个元素为产生式或空 E TE E TE T FT T FT F E i 总控程序 将 压入堆栈中 将开始符号S压入堆栈中读取第一个输入符号到a 循环执行下述操作 栈顶符号弹出放入X中 如果X为终结符号 如果X a 表明成功匹配a符号 读取下一个符号到a 否则出错 如果X 如果X a 分析结束 接受句子 如果X a 出错处理 如果X为非终结符号 则查分析表M 如果M X a 为空 出错处理 如果M X a X1X2 Xn 则 将右部Xn X2X1反序压入堆栈中 预测分析过程 下面用预测分析方法对输入串i i i 进行分析 给出栈的变化过程如下 构造预测分析表 预测分析过程的总控程序是固定的 对于某个文法 分析表是分析过程的核心 表中M A a A X1X2 Xn 表示对应于X1X2 Xn字的首终结符可以是a 就是说X1X2 Xn aw 可以通过这个方式来确定分析表中的值 即 求首终结符 预测分析表的构造算法 对文法的每个文法符号X构造First X 对于每一产生式A 对于每个终结符a First 将A 填入M A a 如果 First 则构造Follow A 对任何元素b Follow A 将A 填入M A b 将所有无定义的M A a 标上错误标志 如果文法是LL 1 文法 其预测分析表中没有多重定义的元素 可以进行确定的分析 例 求对应于下述文法的预测分析表 1 首先求first集 E TE E TE T FT T FT F E i First E i First E First T i First T First F i 2 由于 First E First T 求E 和T 的Follow集 Follow E Follow T E TE E TE E T FT T FT T F E F i 3 根据集合的值填表 得到 综合练习 设文法G S S L aS aL L S S 1 消除左递归和回溯 2 计算每个非终结符的First和Follow集 3 构造预测分析表 预测分析表 First S a Follow S First S a Follow S First L a Follow L First L Follow L S L aS S S L SL L SL 4 6自上而下语法分析程序的设计 实现的语法成分包括 1 带类型的简单变量的说明语句 2 算术表达式和布尔表达式 3 简单赋值语句 4 各种控制语句 如if语句 while语句 repeat语句 for语句 源程序举例 programexample consti 5 vara b c integer x char beginif a c 3 b and b 3 thenc 3 x 2 3 a b c 8 forx 1 2to3dob 100 whilea bdoc 5 repeata 10 untila
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 能源公司安全生产制度
- 汽车维修服务价格制度
- 教育培训机构教学管理制度
- 2026山东临沂职业学院引进高层次人才63人备考题库及答案详解(名校卷)
- 2026黑龙江哈尔滨工业大学电气工程及自动化学院现代电子技术研究所招聘备考题库含答案详解(培优b卷)
- 2026浙江温州医科大学附属第一医院泌尿外科(男性科)康复技师招聘1人备考题库有答案详解
- 2026春季山东济宁市鱼台邮政校园招聘备考题库及答案详解【名校卷】
- 税务法律诊所管理制度(3篇)
- 项目部生产现场管理制度(3篇)
- 有限合伙型私募股权基金中普通合伙人信义义务的多维审视与制度构建
- 景观照明设施养护服务方案投标文件(技术方案)
- 《北京人》(剧本全本)曹禺-(三幕剧)
- 医院承包保安管理制度
- T/SFABA 3-2018银耳多糖产品中多糖含量的测定
- 砂石销售承包协议书
- ①《可爱的汽车》游戏课件
- GB/T 45236-2025化工园区危险品运输车辆停车场建设规范
- 浙江宁波海曙区洞桥镇招考聘用村级脱产干部(高频重点提升专题训练)共500题附带答案详解
- 护理文书书写存在的问题原因分析及整改措施讲
- 越南人学汉语语音偏误分析
- 维吾尔语字母表(中国境内)
评论
0/150
提交评论