李元金 计算机与信息工程学院 E-mail: liyuanjin10@126.com 第9讲 语法分析—自上而下分析(1) 李元金 计算机与信息工程学院 E-mail: liyuanjin10@126.com.

Slides:



Advertisements
Similar presentations
复习: :对任意的x∈A,都有x∈B。 集合A与集合B间的关系 A(B) A B :存在x0∈A,但x0∈B。 A B A B.
Advertisements

七(7)中队读书节 韩茜、蒋霁制作.
编 译 原 理 指导教师:杨建国 二零一零年三月.
编 译 原 理 指导教师:杨建国 二零一零年三月.
常用逻辑用语复习课 李娟.
LR与LL分析 编译原理习题课二 胡云斌 PB
编 译 原 理 ——— 清华大学出版社 新 疆 大 学 信 息 科 学 与 工 程 学 院.
八桥初中九年级思想品德课复习导学案之五---
§5.3 定积分的换元法 和分部积分法 一、 定积分的换元法 二、 定积分的分部积分法 三、 小结、作业.
第三节 格林公式及其应用(2) 一、曲线积分与路径无关的定义 二、曲线积分与路径无关的条件 三、二元函数的全微分的求积 四、小结.
课标教材下教研工作的 实践与思考 山东临沂市教育科学研究中心 郭允远.
编译原理与技术 --文法和分析 2018/9/17 《编译原理与技术》讲义.
第四章 语法分析 赵建华 南京大学计算机系
第三章 语法分析 本章内容 上下文无关文法 自上而下分析和自下而上分析 围绕分析器的自动生成展开 词 法 分析器 记 号 取下一个记号
编译原理与技术 第3章 语法分析 14学时.
自上而下分析 4.4.
自上而下分析 4.4.
第二章 矩阵(matrix) 第8次课.
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
走进编程 程序的顺序结构(二).
元素替换法 ——行列式按行(列)展开(推论)
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
LL(1)分析方法 LL(1)是LL(k)的特例,其中的k则表示向前看k个符号. LL(1)方法和递归下降法属于同一级别的自顶向下分析法.
LL分析法 LL分析法的分析器由一张预测分析表(LL(1)分析表),一个控制程序(表驱动程序)及一分析栈组成 输入
求曲线方程(3).
第三章 文法和语言 本章目的为语言的语法描述寻求工具,以便: 对源程序给出精确无二义的语法描述。(严谨、简洁、易读)
《编译原理与技术》 期末复习 计算机科学与技术学院 郑启龙 李 诚 25/12/2018.
编译原理 第四章 语法分析—自上而下分析 编译原理.
第三章 语法分析 自顶向下语法分析思想 语法分析方法的分类: 自顶向下语法分析方法(Top-Down) ,亦称面向目标的分析方法;
第3,4次课 一个简单的语法制导翻译器 2.3~2.5.
LL(1)分析法 复 习 LL分析程序构造及分析过程 输入串 符号栈 执行程序 此过程有三部分组成: 分析表 执行程序 (总控程序)
第4章 非线性规划 4.5 约束最优化方法 2019/4/6 山东大学 软件学院.
第2章 高级语言及其语法描述 2.1 程序语言的定义 2.2 高级语言的一般特征 2.3 程序语言的语法描述.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
编译原理总结-1 第3~5章.
编译原理实践 13.语法分析程序的自动生成工具YACC.
第四章 自底向上分析方法 主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法 LR(0)分析方法 SLR(1)分析方法
文法等价变换 文法的等价 对文法G1和G2,若有:L(G1)=L(G2),则称文法G1和G2等价, 记作:G1=G2. 文法等价变换
2.6 直角三角形(二).
顺序表的删除.
第四章 自顶向下语法分析方法 语法分析的主要工作:是识别由词法分析给出的单词 序列是否是给定的正确句子(程序)。
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
人教版高一数学上学期 第一章第四节 绝对值不等式的解法(2)
复习.
自底向上的语法分析 4.5.
定理21.9(可满足性定理)设A是P(Y)的协调子集,则存在P(Y)的解释域U和项解释,使得赋值函数v(A){1}。
第九节 赋值运算符和赋值表达式.
iSIGHT 基本培训 使用 Excel的栅栏问题
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
编译原理与技术 -- 自顶向下分析 2019/5/5 《编译原理与技术》讲义.
1.2 子集、补集、全集习题课.
1.设A和B是集合,证明:A=B当且仅当A∩B=A∪B
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
上杭二中 曾庆华 上杭二中 曾庆华 上杭二中 曾庆华.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
2.2直接证明(一) 分析法 综合法.
第四章 语法分析 南京大学计算机系 戴新宇
第四节 向量的乘积 一、两向量的数量积 二、两向量的向量积.
编译原理 第五章 语法分析——自下而上分析 编译原理.
第四章 UNIX文件系统.
插入排序的正确性证明 以及各种改进方法.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
编译原理实践 6.程序设计语言PL/0.
最小生成树 最优二叉树.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
§3.1.2 两条直线平行与垂直的判定 l1 // l2 l1 ⊥ l2 k1与k2 满足什么关系?
编译原理 第一章 编译程序概述 第二章 PL/0编译程序的实现 第三章 文法和语言 第四章 词法分析 第五章 自顶向下语法分析方法
9.3多项式乘多项式.
Presentation transcript:

李元金 计算机与信息工程学院 E-mail: liyuanjin10@126.com 第9讲 语法分析—自上而下分析(1) 李元金 计算机与信息工程学院 E-mail: liyuanjin10@126.com

内容与目标 内容 a.语法分析器的功能 b.自上而下分析面临的问题 c. LL(1)分析法 目标 a.掌握语法分析器的功能

源程序 表 词法分析器 出 单词符号 格 错 语法分析器 管 处 语法单位 理 理 四元式 优化段 四元式 目标代码生成器 目标代码 语义分析与中间代码生成器 四元式 优化段 四元式 目标代码生成器 目标代码

4.1 语法分析器的功能 语法分析的任务:在词法分析识别出单词符号的基础上,分析判定程序的语法结构是否符合语法规则。 即对于任一给定w∈VT*,判断L(G) 语言的语法结构是用上下文无关文法描述的,因此语法分析器的工作本质上就是按文法的产生式识别输入串是否为一个句子。这里所说的输入串是指单词符号组成的有限序列。

语法分析器的功能:它是一个程序,该程序按照文法的产生式P(语言的语法规则),识别输入符号串w是否为一个句子(合式程序)。 语法分析器在编译程序中的地位 如下图所示。

单词符号 语法分 析树 源程序 词法分 析器 语法分 符号表 编译程序 后续部分 取下一单词 ... 图1 语法分析器在编译程序中的地位

语法分析的两种方法: 自下而上分析法(Bottom-up) 基本思想:从输入串开始,逐步进行“归约”,直到文法的开始符号。即从树末端开始,构造语法树。所谓归约,是指根据文法的产生式规则,把产生式的右部替换成左部符号。 算符优先分析法:按照算符的优先关系和结合性质进行语法分析。适合分析表达式。 LR分析法:规范归约

E E + E E * E i i i G(E): E  i| E+E | E-E | E*E | E/E | (E) i*i+i

自上而下分析法(Top-down) 基本思想:它从文法的开始符号出发,反复使用各种产生式,寻找"匹配"的推导。 递归下降分析法:对每一语法变量(非终结符)构造一个相应的子程序,每个子程序识别一定的语法单位,通过子程序间的信息反馈和联合作用实现对输入串的识别。 预测分析程序 优点:直观、简单和宜于手工实现。

4.2 自上而下分析面临的问题 自上而下就是从文法的开始符号出发,向下推导, 推出句子。 带“回溯”的 4.2 自上而下分析面临的问题 自上而下就是从文法的开始符号出发,向下推导, 推出句子。 带“回溯”的 不带“回溯”的递归子程序(递归下降)分析方法。 自上而下分析的主旨:对任何输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。其本质上是一个试探的过程,是反复使用不同产生式谋求匹配输入串的过程。

例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|* 分析输入串 =x*y。 按文法的开始符号产生根结S,并让IP指向指示器输 入串的第一个符号x。然后,把语法分析树的子结点从 左至右对IP所指向的符号进行匹配。第一个符号匹配 ,于是IP向后移动一个符号。 S x*y IP A x y

由于S的第二个子结点是非终符,它有两个候选. 和 由于S的第二个子结点是非终符,它有两个候选**和*。先试着拿出第一个,此时语法树发展如上所示。把子树A的最左子结点与IP所指向的符号进行匹配,结果一致,故IP移向下一个符号。 S x*y IP A x y *

再拿A的第二个子结点与IP所指的符号进行匹配, 结果不一致。 S x*y IP A x y *

回朔,注销掉A子树,并把IP回退到进入A前的位置,然后取出A的第二个候选。此时匹配获得成功。IP向前移动到下一个符号。 S x*y IP A x y * S x*y IP A x y * S x*y IP A x y

下面对S的第三个子结点y进行匹配。由于这个结点与最后一个输入字符相符,所以就完成了对构造语法分析树的任务。

当某个非终结符有多个产生式候选时,可能带来如下问题: 1.回溯:分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的。出错时,不得不“回溯”。 2.左递归:一个文法是含有左递归的,如果存在非终结符P

含有左递归的文法将使自上而下的分析陷入无限 循环,所以首先要消除左递归。 虚假匹配:当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的。 当最终报告匹配不成功时,难以知道输入串中出错的位置。 效率低、代价高、只有理论意义

4.3 LL(1)分析法 LL(1)的意思:第一个L表示从左到右扫 描输入串,第二个L表示最左推导,1表 示分析时只需向前看一个符号。它是递 归下降分析法与预测分析法的基础。

4.3.1 左递归的消除 左递归变右递归 简单直接左递归:(规则左递归) 假定关于非终结符P的规则为 4.3.1 左递归的消除 简单直接左递归:(规则左递归) 假定关于非终结符P的规则为 P→P |  其中不以P开头。 我们可以把P的规则等价地改写为如下的非直接左递归形式: P→P P→P| 左递归变右递归 改写前后是等价的。

例:文法G(E): E→E+T | T T→T*F | F F→(E) | i 经消去直接左递归后变成: E→TE E→+TE |  T→FT T→*FT | 

P→P1 | P2 | … | Pm | 1 | 2|…|n 普遍的直接左递归(规则左递归) 一般而言,假定P关于的全部产生式是 P→P1 | P2 | … | Pm | 1 | 2|…|n 其中,每个都不等于,每个都不以P开头 那么,消除P的直接左递归性就是把这些规则 改写成: P→1P | 2P | … | nP P→1P | 2P |… | mP |  左递归变右递归

例:已知简单表达式文法 exp→exp+term|exp-term|term 解:这里P=exp, 1= +term, 2= -term, =term 改写: exp →term exp’, exp’→+term exp’|-term exp’| 

一般的左递归:(文法左递归) 一个文法消除左递归的条件: 不含以为右部的产生式 不含回路。 P Þ +

例如文法G(S): S→Qc|c Q→Rb|b R→Sa|a (4.3) SQcRbcSabc 虽没有直接左递归,但S、Q、R都是左递归的 SQcRbcSabc

消除左递归的算法: 1. 把文法G的所有非终结符按任一种顺序排列成P1,P2,…,Pn;按此顺序执行; 2. for (i=1;i<=n; i++)//文法有n个非终结符 { for ( j=1;j<=i-1;j++)//第i个每个非终结符Pi可能有i-1个产生式 把形如Pi→Pj的规则改写成 Pi→1|2|…|k ; (其中Pj→1|2|…|k是关于Pj的所有规则) } 消除关于Pi规则的直接左递归性 3. 化简由2所得的文法。去除那些从开始符号出发永远无法到达的非终结符的产生规则。

例:已知文法: S→Sa|Tbc|Td T→Se|gh 试消除其左递归 解:①把非终结符排序P1=S,P2=T(n=2) ②执行循环 i=1,j=1 不执行关于i的内循环,但关于P1=S存在规则左递归,对它进行改写: S→(Tbc|Td)S’ S’→aS’|

∴T→T((bc|d) S’ e|gh i=2,j=1 先执行内循环: 形如关于P2→P1的规则,即T→Se且S→ (Tbc|Td)S’ 呈递归,对它进行改写: P1→1|2形,故写成: P2→1 |2形,连同T→gh,有: ∴T→T((bc|d) S’ e|gh

消去关于P2=T规则的左递归如下: T→ghT’ T’→(bc|d) S’ e T’| ③最后得到的整个文法为: S→(Tbc|Td)S’ S’→aS’| T’→(bc|d)S’eT’| 

现在的Q不含直接左递归,把它代入到S的有关候选后,S变成 S→Sabc | abc | bc | c 例:考虑文法G(S) S→Qc|c Q→Rb|b R→Sa|a 令它的非终结符的排序为R、Q、S。 Q的规则变为 Q→Sab | ab | b 现在的Q不含直接左递归,把它代入到S的有关候选后,S变成 S→Sabc | abc | bc | c

消除S的直接左递归后: S→abcS | bcS | cS S→abcS |  Q→Sab |ab | b R→Sa|a 关于Q和R的规则已是多余的,化简为: S→abcS |  (4.4)

注意,由于对非终结符排序的不同,最后所得的文法在形式上可能不一样。但不难证明,它们都是等价的。 例如,若对文法(4.3)的非终结符排序选为S、Q、R,那么,最后所得的无左递归文法是: S→Qc | c Q→Rb | b R→bcaR | caR |a R (4.5) R→ bca R |  文法(4.4)和(4.5)的等价性是显然的。

4.3.2 消除回溯、提左因子 为了消除回溯就必须保证:对文法的任 何非终结符,当要它去匹配输入串时, 能够根据它所面临的输入符号准确地指 派它的一个候选去执行任务,并且此候 选的工作结果应是确信无疑的。 A→ 1 |  2 | … |  n S a…. IP A ...

1.令G是一个不含左递归的文法,对G的所有非终结符的每一个候选,定义它的终结首符集FIRST()为: 特别是,若 ,则规定FIRST()。即, FIRST()是的所有可能推导的开头终结符或可能的。

例:文法G(S): S→Ap|Bq; A→a|cA; B→b|dB 有: FIRST(Ap)={a,c}, FIRST(Bq)={b,d},

2.文法符号的FIRST集计算(P78) 对每一文法符号XVT∪VN构造FIRST(X) 连续使用下面的规则,直至每个集合FIRST不再增大为止: a.若XVT,则FIRST(X)={X}。 b.若XVN,且有产生式X→a…,则把a加入到FIRST(X)中。 c.若X→也是一条产生式,则把也加到FIRST(X)中。

d.若X→Y…是一个产生式且YVN,则把FIRST(Y)中的所有非-元素都加到FIRST(X)中; e.若X→Y1Y2…Yk是一个产生式,Y1,…,Yi-1都是非终结符,而且,对于任何j,1ji-1,FIRST(Yj)都含有(即Y1…Yi-1), 则把FIRST(Yi)中的所有非-元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj)均含有,j=1,2,…,k,则把加到FIRST(X)中。

3.求符号串的FIRST集合(P79) 对文法G的任何符号串=X1X2…Xn构造集合FIRST()。 a.置FIRST()=FIRST(X1)\{}; b. 若对任何1ji-1,FIRST(Xj),则把FIRST(Xi)\{}加至FIRST()中;特别是,若所有的FIRST(Xj)均含有,1jn,则把也加至FIRST()中。显然,若=则FIRST()={}。

∴First(E)= First(T)= First(F )={(,i} First(E)={+, } First(T)={*, } 例:文法 E→TE E→+TE |  T→FT T→*FT |  F→(E) | i First(E)={(,i} First(E)={+, } First(T)={(,i} First(T)={*, } First(F)={(,i} ∴First(E)= First(T)= First(F )={(,i} First(E)={+, } First(T)={*, }

作业 1.作业 P81-1,2,3 2.实验 实验二 3.课后要求 复习本节内容,预习下节。