- 6
- 0
- 约9.01千字
- 约 57页
- 2018-10-13 发布于江苏
- 举报
06-自下而的语法分析
第六章 自下而上的语法分析 主要内容 本章学习目标 自下而上语法分析概述 简单优先分析 算符优先分析 小结本章 重点习题解析 思考&练习 相关术语的回顾(英文版) 本章学习目标 一.学习目标 理解语法分析器的功能 理解算符优先分析方法 二.课程安排 2学时 自下而上语法分析概述 As the name suggests, bottom-up parsing begins with a string and tries to backwards to the start symbol by applying the productions in reverse. 也称为移进--归约分析 6.1自下而上语法分析概述 如名字如示,自下而上语法分析试图将一个字符串反向归约至开始符号。 自下而上语法分析比自上而下语法分析更有效率,对语法的限制更少 6.1自下而上语法分析概述 一、基本思想 自下而上语法分析就是对输入串自左向右,逐步进行扫描,并将输入符逐个移入一个后进先出的栈中,边移入边分析,一旦栈顶符号串形成一个句型的句柄,就用该产生式的左部非终结符代替相应右部的文法符号串。这一步叫归约。重复这一过程直到归约为文法的开始符号。自下而上语法分析过程实际就是一个不断进行直接归约的过程。 二、自下而上语法分析法 1、优先分析法(简单优先分析法和算符优先分析法) 2、LR分析法 自下而上语法分析概述 研究的关键问题 1、如何确定归约的句柄? 2、找出的句柄,应直接归约到哪一个非终结符号? 自底向上的语法分析 算法应考虑的问题 算法是否能够终止? 算法是否快速? 算法是否能够处理所有的情况? 在每一步中如何选择子串进行归约? 自下而上语法分析的策略:移进-规约分析; 移进就是将一个终结符推进栈 归约就是将0个或多个符号从栈中弹出,根据产生式将一个非终结符压入栈 移进-归约过程是自顶向下最右推导的逆过程(规范归约) 我们如何决定什么时候移进,什么时候规约? 考虑 int | * int + int 我们可以用 T ? int进行归约,而得到 T | * int + int 致命错误: 无法规约到开始符号 E 直觉: Want to reduce only if the result can still be reduced to the start symbol 一般的移进-归约策略: 若句柄在栈顶出现,则归约 否则移进 句柄(Handles):句型的最左直接短语 回顾 从句型E+T*F+i的语法树中找短语、直接短语和句柄 答:短语(该句型中的某一部分) E+T*F+i —— 相对于E E+T*F —— 相对于E T*F —— 相对于T i —— 相对于F 直接短语: S* =?A?且A?β则称β是句型 ??? 相对于产生式A??的一个直接短语。对于上述句型T*F, i为直接短语 句柄: 一个句型的最左直接短语称之为该句型的句柄。上述句型T*F为句柄(最左直接短语)。 自下而上的分析算法 优先分析法 简单优先分析法 算符优先分析法 LR分析(将在下一章中介绍) 6.2简单优先分析法 简单优先分析法的基本思想:按照文法符号(包括终结符和非终结符)的优先关系确定句柄。示例见下页 算符优先分析法的基本思想:只考虑算符(终结符)之间的优先关系来确定句柄。 某些文法具有“算符”特性 表达式运算符(优先级、结合性) 人为地规定其算符的优先顺序,即给出优先级别和同一级别的结合性 优先关系 优先关系 X=Y ? 文法G中存在产生式A→...XY... XY? 文法G中存在产生式A→...XB...,且B Y... XY? 文法G中存在产生式A→...BD...,且B ...X,D Y... 如何确定两个文法符号之间的优先关系? 简单优先文法的定义 满足以下条件的文法是简单优先文法 (1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立。 (2)在文法中任意两个产生式没有相同的右部 (3)不含空产生式 6.3算符优先分析 某些文法具有“算符”特性 表达式运算符(优先级、结合性) 人为地规定其算符的优先顺序,即给出优先级别和同一级别的结合性 只考虑算符之间的优先关系来确定句柄 如何确定算符优先关系? (1)i的优先级最高 (1) ?优先级次于i,右结合 (2)*和/优先级次之,左结合 (3)+和-优先级最低,左结合 (4)括号‘(’,‘)’的优先级大于括号外的运算符,小于括号内的运算符,内括号的优先性大于外括号 (5)#的优先性低于与其相邻的算符 算符文法的定义 定义 如果不含空产生式的上下文
原创力文档

文档评论(0)