收藏 分享(赏)

第四章 语法分析2.ppt

上传人:tkhy51908 文档编号:8023219 上传时间:2019-06-04 格式:PPT 页数:45 大小:583KB
下载 相关 举报
第四章 语法分析2.ppt_第1页
第1页 / 共45页
第四章 语法分析2.ppt_第2页
第2页 / 共45页
第四章 语法分析2.ppt_第3页
第3页 / 共45页
第四章 语法分析2.ppt_第4页
第4页 / 共45页
第四章 语法分析2.ppt_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、1 自顶向下分析 2 自底向上分析 A) 递归下降分析法 : 包含回溯的递归下降分析法 不含回溯的递归下降分析法 (递归预测分析法 ) B) 非递归的预测分析法 : LL分析法 A) 算符优先分析法 B) LR分析法 语法分析方法 4.3.1 递归下降分析法 一 ) 包含回溯的递归下降分析法 思想 :从语法的开始符号出发,试探使用不同产生式,寻找匹配于输入符号串的推导。或者说,从对应文法开始符号的根结点出发,自顶向下为输入符号串建立一棵分析树。 这种分析方法实质上是一种 试探 过程,是因为文法中,对于某个非终结符号的规则其右部 有多个选择,并根据所面临的输入符号不能准确 的确定所要选择时,就可

2、能出现回溯。 例 : S cAd A ab a 输入符号串 cad是否为文法的句子? c a d S A c d S cAd A ab a b a a 输入符号串 cad合法 上述 分析称为带回溯的自顶向下分析。对于 w, 从文法的开始符号出发,反复使用不同的产生式谋求匹配输入串 。当用某个非终结符号的候选式进行匹配失败时,删除这个失败分析建立的分析树分支并回头查输入符号,以便与其它候选式匹配。 这种带回溯的自顶向下分析技术,效率很低,代价极高,因此,它只有理论上的意义。 二 ) 不含回溯的递归下降分析法 思想 :一般情况下,对文法进行 消除左递归并提取左因子 可以避免回溯现象。针对这种文法设

3、计的分析器称作 递归 预测分析器 。 例 : S cAd A ab ac 输入符号串 cacd是否为文法的句子? S A c d S cAd A aB a B 输入符号串 cacd合法 B c S cAd A aB B bc c c a c d 在推导过程中,根据当前的 向前看符号 决定选择哪个产生式往下推导,因此,分析过程是完全确定的。这种分析称为自顶向下的预测分析。 文法: type simple array simple of type simple integer char num dotdot num 输入符号串: array num dotdot num of integer是否为

4、该文法的句子? 对文法先进行消除左递归并提取公共左因子 array of num dotdot num integer type type of simple array num dotdot num simple integer type array simple of type simple num dotdot num type simple simple integer 输入符号串合法 S ABC A a B b C c 递归预测分析器的构造 例一 S ABC A a | x B b C c 递归预测分析器的构造 例二 S ABC A a | xB B b C c 递归预测分析器的构造

5、 例二 S ABC | BS A a | x B b C c 递归预测分析器的构造 例三 1 向前看符号决定了选择哪个产生式右部的文法符号串与输入符号串匹配, 在程序中由向前看符号可以确定一段程序完成与某一产生式右部的匹配。 2 每一个非终结符号对应一个函数,函数的功能是根据向前看符号扩展分析树,同时用该非终结符号的儿子结点匹配输入符号串。 递归预测分析器的构造 4.3.2 非递归的预测分析法 一 . 非递归预测分析器的模型 二 . 非递归预测分析器的分析演示 三 . 计算 FIRST和 FOLLOW集合 四 . 非递归预测分析表的构造 五 . LL(1)文法 六 . 在预测分析法中的错误处理

6、 一 . 非递归预测分析器的模型 array of num dotdot num integer # 输入 预测分析 控制程序 simple of type # 栈 输出 分析表 M type #栈 通常也可以为 $ 在实际语言中,每一种 语法成分都有确定的左右界 符,为了研究问题方便,统 一以表示 # 执行程序 分析表 # 符号栈 输入串 ( 1)分析表:二维矩阵 M A i MA,a= 或 error A Vn a Vt or # i V* ( 2)符号栈 : 有四种情况 #S 符号栈 开始状态 xxxxxx# 工作状态 # X 符号栈 a# 查分析表得: X Vn, MX,a= X i

7、X Vt, X = a 出错状态 结束状态 # X 符号栈 a# 查分析表得: X Vn, MX,a= error X Vt, X a # 符号栈 # 执行程序主要实现如下操作 : 1.把 #和文法 开始符号 S推进栈 ,并读入输入串的第一 个单词 a,重复下述过程直到正常结束或出错 . 2.根据 栈顶文法符号 X和 当前单词符号 a的关系进行 不同的处理 (1)若 X=a=#, 分析成功,停止。匹配输入串成功 . (2)若 X=a#, 把 X从栈顶弹出,再读入下一个符号 . (3)若 X Vn, 查分析表 M。 ( 3)执行程序 # X 符号栈 a# (3)若 X Vn, 查分析表 M。 a

8、) MX,a= X UVW 则将 X弹出栈,将 UVW压入 注 : U在栈顶 b) MX, a = error 转出错处理 c) MX, a = X 则将 X弹出栈 ,继续分析。 # X # WVU (最左推导) 文法: type simple id array simple of type simple integer char num dotdot num 输入符号串: array num dotdot num of integer是否为该文法的句子? 二 . 非递归预测分析器的分析演示 type type id type simple type simple type simple si

9、mple error error simple integer simple char array integer char num type array simple of type simple num dotdot num 非终结符号 输 入 符 号 非 终 结 符 # 栈 type array of num dotdot num integer # simple of array num dotdot num simple integer 句子 array num dotdot num of integer合法 type array simple of type simple num

10、dotdot num type simple simple integer 预测分析控制程序 置 ip指向输入符号串 w#的第一个符号; REPEAT 令 X为栈顶符号, a是 ip所指向的符号 . IF (XVT#) IF (X= =a) 弹出 X; ip:=ip+1 ELSE error( ) ELSE IF (Mx,a=xy1y2y k ) pop(st); push(st,yk);push(st,y 1); write(xy1y2y k) ELSE error( ) UNTIL (X= =#) 文法: E TE E +TE T F T T *F T F (E)|id 输入符号串 id+

11、id*id 是否为该文法的句子? 非终结 符号 输 入 符 号 id + * ( ) # E E TE E TE E E+TE E E T T FT T FT T T T*FT T T F F id F (E) 文法分析表 M 预测分析 控制程序 # 输入 栈 id + * ( ) # E E TE E TE E E +TE E E T T FT T FT T T T *F T T T F F id F ( E ) E T ETE T F FTE id idTE +idE id+TE id+FTE id+idTE id + id * id # E 栈 输入 输出 在输入 id+id*id上预测

12、分析器作出的移动 #E #ET #ETF #ETid #ET #ETid #ET #E # id+id*id # id+id*id # id+id*id # id+id*id # +id*id # id # # # # E TE T FT F id #E #ET+ #ET #ETF #ETid #ET #ETF* #ETF +id*id # +id*id # id*id # id*id # id*id # *id # *id # id # T E+TE T FT Fid T*FT Fid T E 三 . 计算 FIRST和 FOLLOW集合 定义 令 GS=(VT,VN,S,P),则对任一 文法串 ( VTV N) * FIRST()=a a , a VT * 若 , 则规定 FIRST() * FIRST()是 所有可能推导的开头终结符号 或可能推导出的 所构成的集合 如何构造 FIRST() ? ( VTV N) * 1 单个文法符号的 FIRST集合构造方法 当 ( VTV N) FIRST() ? 2 在单个文法符号的基础上,任一文法符号串的FIRST集合构造方法 当 = X1X2 Xn FIRST() ?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报