




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章 语法分析-自上而下分析4.1 语法分析器的功能4.2 自上而下分析面临的问题4.3 LL(1)分析法4.4 递归下降分析程序构造4.5 预测分析程序4.6 LL(1)分析中的错误处理4.1 语法分析器的功能 功能定义: 按照文法产生式,识别输入符号串是否为一个句子。 技术路线: 是否能从文法的开始符号出发推导出这个输入串。或者,建立一颗与输入串相匹配的语法分析树。 战略: 自上而下分析法,自下而上分析法。词词法法分分析析器器分分析析器器符符号号表表取取下下一一个个记记号号源源程程序序记记号号分分析析树树前前端端的的其其余余部部分分中中间间表表示示图4.1 语法分析器在编译程序中的地位接
2、收词法分析器输出的记号串,检查是否合乎语法。报告语法错误,并恢复语法错误,从而可以继续分析。输出是分析树的某种形式。分析时其它任务:将各种记号的信息收入符号表、类型检查和其它语义检查、中间代码的生成,这些放在“前端的其它部分完成。4.2 自上而下分析面临的问题 例4.1 假定有文法 (1) SxAy (2)A*|* 对输入串x*y,构造语法树。 构造过程: (1)把S作为根 (2)用S的产生式构造子树 (3)让输入串指示器IP指向输入串的第一个符号。(4)调整输入串指示器IP与叶结点进行匹配。(5)如果为非终结符,用A的下一个产生式构建子树。(6)如果匹配成功则结束;否则,回溯到步骤(4)。S
3、xAySxAy*SxAy* 自上而下分析法的缺点: 是文法的左递归性问题。一个文法是含有左递归的自上而下的分析过程陷入无限循环。如PP。 由于有回溯,就会产生一大堆麻烦事情。 在上述的自上而下分析过程中,当一个非终结符用某一候选匹配成功时,这种成功可能仅是暂时的。这种虚假现象,我们需要更复杂的回溯技术。一般说,要消除虚假匹配是很困难的。 当最终报告分析不成功时,我们不知道输入串中出错的确切位置。4.3 LL(1)分析法4.3.1 左递归的消除 4.3.2 消除回溯、提左因子 4.3.3 LL(1)分析条件4.3.1左递归的消除 一个简单例子: 已知文法:PP|是一个左递归文法,它的等价的非左递
4、归文法为: P P P P| 例2.2 一般转换规则有: PP1| P2| | Pm| 1 | 2 | n改写成 P1P|2P |nP P1P |2P| |mP | 其中: i都不以P开头, I不等于 一个反例: 文法:SQc|c;QRb|b;RSa|a虽然不是直接左递归,但S、Q、R都是左递归。 消除左递归算法: 算法的思想是: 首先构造直接左递归; 再利用一般转换规则,消除直接左递归 化简文法。 下面算法在不含PP,也不含在右部产生式时可以消除左递归。 消除一个文法的左递归算法: (1)把文法G的所有非终结符按任一种顺利排列成P1Pn;按此顺序执行; (2) FOR i:=1 TO n D
5、O BEGINFOR j:=1 TO i-1 DO把形如Pj+1Pj 的规则改写成Pj+11|1|k|。其中Pj1|1|k是关于Pj的 所有规则;消除关于Pi规则的直接左递归性。 END 化简由所得的文法。即去除那些从开始符号出发永远无法到达的非终结符的产生规则。 例子4.3: 对4.3文法,它的非终结符排序为R,Q,S。把R代入Q,Q代入S得到:SSabc|abc|bc|c 消除左递归后得到: SabcS|bcS|cS SabcS| QSab|ab|b(化简消去) RSa|a化简后消去) 对不同的排列,会有不同形式的无左递归文法,但它们等价。4.3.2 消除回溯、提左因子 消除回溯的思路:
6、对输入符号a,指派一个A的候选式1与a匹配,而再没有其他候选式i的字符与a匹配。 通过提取公共左因子,判断首字符集的差异。 首字符集定义: 对G的所有非终结符的每个候选,它的首字符集为 FIRST()=a| a,aVT,假设*,则规定 FIRST()。 提取公共左因子算法: A1|2|n|1|2| |m(其中每个 不以开头) 那么可以把这些规则改写成: AA|1|2| |m A1|2|n 例4.4 上述算法的不足: 当非终结符A面临输入符号a,且a不属于A的任意候选首符集,但A的某个候选首符集包含时,就一定可以使A自动匹配。这是一种错误。4.3.3 LL(1)分析条件 定义FOLLOW(A)
7、集合: 假定S是文法G的开始符号,对于G的任何非终结符A,我们定义 FOLLOW(A)=a|S*Aa,aVT 若S*A,则规定FOLLOW(A)。 LL(1)文法的充分必要条件: 文法不含左递归。 若 1 |2 | |n , 则FIRST(i)FIRST(j)= (ij) 对文法中的每个非终结符A,若它存在某个候选首符集包含,则FIRST(A)FOLLOW(A)= LL(1)匹配算法: 对输入符号a,A的所有产生式为: 1|2|n (1)若aFIRST(i),则指派I去执行匹配任务。 (2)若a不属于任何一个候选首符集,那么: FIRST(i)且aFOLLOW(A),则让A(i)与(a)自动匹
8、配; 否则,a的出现是一种语法错误。 例 4.44.4 递归下降分析程序构造 递归下降分析器: 这个分析程序由一组递归过程组成的,每个过程对应文法的一个非终结符。 ETE E+TE| TFT T*FT| F(E)|iPROCEDURE E PROCEDURE TBEGIN BEGIN T ; E F ; TEND ENDPROCEDURE E PROCEDURE TIF SYM=THEN IF SYM=THENBEGIN BEGIN ADVANCE ; ADVANCE; T ; E F ; TEND END PROCEDURE F IF SYM=iTHEN ADVANCE ELSE IF SY
9、M=(THEN BEGIN ADVANCE; E; IF SYM=) THEN ADVANCE ELSE ERROR END ELSE ERROR; 扩展巴科斯范式(Backus Naur Form): 用花括号表示闭包运算*。 用n0表示可任意重复次至n次, 000 =。 用方括号表示0,即表示的出现可 有可无,等价于|。 例4.5: 文法 ET|E+T T F|T*F F i|(E) 可表示成 E T+T F F*F F (E)|I4.5 预测分析程序 4.5.1 预测分析程序工作过程 4.5.2 预测分析表的构造 预测分析器思想 :.a总控程序预测分析表MX.#输出输入串栈表4.1 文法
10、4.2的LL(1)分析表 i+*()#EETE ETE E E +TE E E TTFT TFT T T T *FT T T FFi F(E) 预测分析程序的总控程序: 其具体工作过程是首先把文法开始符号和 # 压入栈,然后总控程序在任何时候都是按STACK栈顶符号X和当前输入符号a行事的,如下图。对于任何X,a),总控程序每次都执行下述三种可能的动作之一: 若X=a,则宣布分析成功,停止分析过程。 若X=a,则把X从STACK栈顶逐出,让a指示器指向下一个输入符号。 若X是一个非终结符,则查看分析表M。若MA,a中存放着关于X的一个产生式,则X出栈,把X产生式右部符号串按反序压栈,如果MA,
11、a中存放出错标志,则调用诊断程序。 预测分析程序的总控程序描述是: BEGIN 首先把然后把文法开始符号推进STACK栈; 把第一个输入符号读进a; FLAG:=TRUE; WHILE FLAG DO BEGIN 把STACK栈顶符号上托出并放在X中; IF XVT THEN IF X= a THEN 把下一输入符号读进a ELSE ERROR ELSE IF X=# THEN IF X= a THEN FLAG:=FALSE ELSE ERROR ELSE IF MA,a=XX1X2XkTHEN 把Xk ,Xk-1, ,X1一一推进STACK栈 /*若X1X2Xk=,不推任何字进栈*/ EL
12、SE ERROREND OF WHILE;STOP /*分析成功,过程完毕*/END 例例4.6:输入串为:输入串为i1*i2+i3,利用分析表进行预测分析的步利用分析表进行预测分析的步骤骤步骤步骤 符号栈符号栈 输入串输入串 所用产生式所用产生式0 #E i1*i2+i3#1 #ET i1*i2+i3# ETE2 #ETF i1*i2+i3# TFT3 #ETi i1*i2+i3# Fi4 #ET *i2+i3#5 #ETF* *i2+i3# T*FT 15 #E # T 16 # # E 4.5.2 预测分析表的构造 FIRST(X)集的构造算法: 若XVT,则FIRST(X)X。 若XV
13、n,且有产生式Xa,则把a加入到FIRST(X)中;若X 也是一条产生式,则把也加到FIRST(X)中。 若XY是一个产生式,且YVn,则把FIRST(Y)中所有非-元素都加到FIRST(X)中;若XY1Yi-1是一个产生式且YVn,且对任何的j(1ji-1),FIRST(Yj)都含有(即Y1Yi-1* )则把FIRST(Yj)中的所有非-元素都加到FIRST(X)中;特别地,若FIRST(Yj)都含有,把 加入FIRST(X) 中 重复以上操作,直到FIRST (X)不再增大为止。 上述算法可以推广到FIRST(),= X1Xk 非终结符B的FOLLOW(B)构造算法: 对 于 文 法 的
14、开 始 符 号 S , 置 于FOLLOW(B)中; 若 A B是 一 个 产 生 式 , 则 把FIRST()-加至FOLLOW(B)中; 若AB是一个产生式,或AB是一个产生式而即FIRST()),则把FOLLOW(A)加至FOLLOW(B)中。 构造分析表M的算法: (1)对文法G的每个产生式A执行第步和第步; (2)对每个终结符aFIRST(),把A加至MA,a中; ( 3 ) 若 F I R S T () , 则 对 任 何bfollow(A)把()加至MA,b中; (4)把所有无定义的MA,a标上“出错标志” 例4.7、4.84.6 LL(1)分析中的错误处理 错误类型: 栈顶的终结符与当前的输入符号不匹配。 非终结符A处于栈顶,面临的输入符号为a,但分析表M中的MA,a为空。 错误处理方法: 跳过输入串中的一些符号直至遇到“同步符号为止。 同步符号集合的选择方法: 把FLLOWO(A)加入A的同步活动集。 把FIRST(A)加入到A的同步活动集。 直接弹
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海科创职业技术学院《纺织品图案设计》2023-2024学年第二学期期末试卷
- 安徽师范大学《英语阅读基础1》2023-2024学年第二学期期末试卷
- 云南商务职业学院《绿色建筑》2023-2024学年第二学期期末试卷
- 四川工业科技学院《数据挖掘基础》2023-2024学年第一学期期末试卷
- 察隅县2025年小升初总复习数学测试卷含解析
- 重庆城市科技学院《大数据技术前沿动态》2023-2024学年第二学期期末试卷
- 云南省曲靖市沾益区第一中学2025年高三下学期期末考试试题含解析
- 山西省吕梁柳林县联考2025届下学期初三模拟卷(一)化学试题含解析
- 江苏省姜堰市蒋垛中学2024-2025学年高三下学期期末质量抽测英语试题试卷含解析
- 贵州财经职业学院《艺术与国际关系学》2023-2024学年第二学期期末试卷
- 非营利组织离任审计报告范文
- 家电行业品质部门的质量提升职责
- 抖音服装网店创业计划书
- 电力安全一把手讲安全课
- (2025)驾照C1证考试科目一必考题库及参考答案(包过版)
- 2025年泰兴经济开发区国有企业招聘笔试参考题库含答案解析
- 2025年人民法院信息技术服务中心招聘应届高校毕业生高频重点提升(共500题)附带答案详解
- 国家电投集团招聘笔试冲刺题2025
- 无线通信射频收发系统设计研究
- 造纸厂管理规章制度
- 2025医德医风培训
评论
0/150
提交评论