收藏 分享(赏)

第四章 语法分析-自上而下分析.ppt

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

1、程序设计语言 编 译 原 理 主讲:张永梅,课程安排,实验时间: 实验一词法分析: 第6、7、8、9周 实验二语法分析:第13、14、15、16周 实验地点: 计算机系实验中心(5教910、911) 指导教师: 杨健、张谦,实验安排,杨健:13488702754 张谦:18801041780 邮箱: 地点:五教8层802图像处理研究室,数字媒体制作实验室910 计11-12 软件开发实验室911 计11-34 第6、7、8、9周,都是周二1,2节,实验一 词法分析器(第6、7、8、9周),第四章 语法分析-自上而下分析,4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(

2、1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序,第四章 语法分析-自上而下分析,了解:语法分析器的功能。 熟悉:预测分析程序、递归下降分析程序的设计方法。 掌握:LL(1)分析法的条件,消除左递归的算法,预测分析表的构造。,第四章 语法分析-自上而下分析,作业:4.1,4.2,4.1 考虑下面文法G1:,Sa(T)TT,SS (1)消去G1的左递归。然后对每个非终结符,写出不带回溯的递归子程序。 (2)经改写后的文法是否是LL(1)的?给出它的预测分析表。,第四章 语法分析-自上而下分析,4.2 对下面的文法G:ETEE+ETFTTTFPFF*FP(E)ab (1)计算这个文法

3、的每个非终结符的FIRST和FOLLOW。 (2)证明这个文法是LL(1)的。 (3)构造它的预测分析表。 (4)构造它的递归下降分析程序。,第三章 词法分析,实验一 词法分析器,每次实验结束都必须写出实验报告,报告内容包括:实验题目、实验目的和要求,实验的实现(包括主要设计思想、实现算法、主要技术问题的处理方法,及实验结果),结论分析。,实验二 语法分析器,实验二 语法分析器构造,一、目的和要求 借助于词法分析程序提供的分析结果,编写一个算符优先语法分析程序,程序能进行语法结构分析和错误检查并产生相应的归约信息。同时给出出错信息和错误类型,从而加深对语法分析的理解。 二、实验内容 给定文法G

4、和算符优先分析法,构造其算符优先分析程序。文法G: 语句赋值语句条件语句转移语句带标号的赋值语句 带标号的赋值语句 赋值语句变量=算术表达式 条件语句 IF THEN 语句 IF THEN 语句 ELSE 语句,实验二 语法分析器构造,转移语句GOTO标号 变量标识符 标识符字母 字母ABZabz 数字019 算术表达式项算术表达式+项算术表达式-项 项因子项*因子项/因子因子项 因子变量常数(表达式) 布尔表达式 关系符= 标号常数 常数数字,实验二 语法分析器构造,三、说明和提示 1.本实验的优先表可以手工先设计好。 2.本实验要求中提出的“产生相应的归约信息”意指在语法分析的过程中,一旦

5、产生归约,在程序上产生并最终输出归约产生式序号。 3.出错类型的产生可预先对应优先表中出错栏列表说明其出错类型,并分别编序,当分析中产生错误时以字符串输出相应表中错误信息。 4.算法采用一个符号栈的数据结构,既用它存放终结符,也用它存放非终结符。,第四章 语法分析-自上而下分析,4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序,词法分析器,语法分析器,语义分析与中间代码产生器,优化器,表格管理,出错处理,目标代码生成器,编译程序总框,本章主要介绍语法分析的处理 要进行语法分析,必须对语言的语法结构进行描述。

6、采用正规式和有限自动机可以描述和识别语言的单词符号; 用上下文无关文法来描述语法规则。,第四章 语法分析-自上而下分析,形式化定义: 一个上下文无关文法是一个四元式(VT ,VN ,S ,) VT是一个非空有限集,它的每个元素称为终结符号; VN是一个非空有限集,它的每个元素称为非终结符号,VTVN=; S是一个非终结符号,称为开始符号;SVN。 是一个产生式集合(有限),每个产生式的形式是P。其中,PVN ,(VTVN)。开始符号S必须至少在某个产生式的左部出现一次。 P1|2|n。其中,i称为是P的一个候选式。读作“定义”,直竖读为“或”,它是元语言符号。,2.3.1 上下文无关文法,2.

7、3.1 上下文无关文法,定义:称A直接推出,即 A仅当A 是一个产生式,且, (VT VN)* 。 如果1 2 n,则我们称这个序列是从1到n的一个推导。若存在一个从1到n的推导,则称1可以推导出n 。 对文法G(E): E i | E+E | E*E | (E) E (E) (E+E) (i+E) (i+i),用 表示:从1出发,经过0步或若干步,可以推出n。,所以 : 即 或,定义:假定G是一个文法,S 是开始符号。如果 ,则称是一个句型。仅含终结符号的句型是一个句子。文法G所产生的句子的全体是一个语言,将它记为 L(G)。,通常,用 表示:从1出发,经过一步或若干步,可以推出n。,例:

8、(i*i+i)是文法 G(E): E i | E+E | E*E | (E) 的一个句子。证明:E (E) (E+E)(E*E+E)(i*E+E)(i*i+E)(i*i+i)E,(E),(E+E),(E*E+E),(i*i+i)是句型。,2.3.1 上下文无关文法,第四章 语法分析-自上而下分析,4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序,4.1 语法分析器的功能,语法分析的任务是分析一个文法的句子结构。 语法分析器的功能:按照文法的产生式,识别输入符号串是否为一个句子。,策略:自上而下分析法,自下而上

9、分析法。,两种方法反映了两种语法树的构造过程。,.,图4.1 语法分析器在编译程序中的地位,4.1 语法分析器的功能,语法分析的方法-自上而下分析法(Top-down),基本思想:它从文法的开始符号出发,反复使用各种产生式,寻找“匹配”的推导。从树根到叶子来建立语法树。 递归下降分析法:对每个非终结符号构造一个相应的子程序,每个子程序识别一定的语法单位,通过子程序间的信息反馈和联合作用实现对输入串的识别。 预测分析程序 优点:直观、简单和宜于手工实现。,语法分析的方法-自下而上分析法(Bottom-up) 基本思想:从输入串开始,逐步进行“归约”,直到文法的开始符号。即从树末端开始,构造语法树

10、。从树叶到树根来建立语法树。所谓归约,是指根据文法的产生式规则,把产生式的右部替换成左部符号。 算符优先分析法:按照算符的优先关系和结合性质进行语法分析。适合分析表达式。 LR分析法:规范归约,G(E): E i| E+E | E-E | E*E | E/E | (E)给出i*i+i的语法树。i*i+i E*i+i E*E+i E+i E+E E,i,+,*,i,i,第四章 语法分析-自上而下分析,4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序,4.2 自上而下分析面临的问题,自上而下就是从文法的开始符号出

11、发,向下推导,推出句子。 自上而下分析的主旨:对任何输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树。或者说,为输入串寻找一个最左推导。,例 文法G(E): E i E E+E E E*E E (E) 对句子(i+i)最左推导 E(E)(E+E)(i+E)(i+i),4.2 自上而下分析面临的问题,例 假定有文法G(S):(1) SxAy(2) A*|* 分析输入串x*y,存在回溯的原因,文法中非终结符A的产生式右部称为A的候选式,如果有多个候选式左端第一个符号相同,则语法分析程序无法根据当前输入符号选择产生式,只能试探。,例 假定有文法G(S):(

12、1) SxAy(2) A*|* 分析输入串x*y,自上而下分析方法的步骤:(带回溯的试探过程) 遇非终结符, 就试图用某个候选式展开, 期望此候选能匹配输入串, 若不能匹配, 则要回溯。 遇终结符,就进行匹配,然后移动输入串指针IP指向下一个符号。 回溯是一项复杂而费时的工作,须废弃已做的许多工作,恢复到前面的某一情况,效率很低。,4.2 自上而下分析面临的问题,当某个非终结符有多个产生式候选时,可能带来如下问题: 1. 分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的。出错时,不得不“回溯”。 2. 文法左递归问题。一个文法是含有左递归的,如果存在非终结符P,含有左递归

13、的文法将使自上而下的分析陷入无限循环。,4.2 自上而下分析面临的问题,第四章 语法分析-自上而下分析,4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序,4.3 LL(1)分析法,构造不带回溯的自上而下分析算法 要消除文法的左递归性 克服回溯,4.3 LL(1)分析法,4.3.1 左递归的消除 4.3.2 消除回溯、提左因子 4.3.3 LL(1)分析条件,4.3.1 左递归的消除,直接消除见诸于产生式中的左递归:假定关于非终结符P的产生式为PP | 其中不以P开头, 不等于。 可以把P的产生式等价地改写为如

14、下的非直接左递归形式:PPPP|,左递归变右递归,例 文法G(E): EET | T TT*F | F F(E) | i 经消去直接左递归后变成:ETEE+TE | TFTT*FT | F(E) | i,一般而言,假定P的产生式是PP1 | P2 | | Pm | 1 | 2|n 其中,每个都不等于,每个都不以P开头。那么,消除P的直接左递归性就是将产生式改写成: P1P | 2P | | nPP1P | 2P | | mP | ,左递归变右递归,4.3.1 左递归的消除,例如文法G(S): SQc|c QRb|b RSa|a 虽没有直接左递归,但S、Q、R都是左递归的 SQcRbcSabc,

15、一个文法消除左递归的条件: 不含以为右部的产生式 不含回路。,4.3.1 左递归的消除,消除左递归的算法: (1)把文法G的所有非终结符按任一种顺序排列成P1,P2,Pn;按此顺序执行; (2)FOR i:=1 TO n DOBEGINFOR j:=1 TO i-1 DO把形如PiPj的产生式改写成Pi1|2|k ; (其中Pj1|2|k是Pj的产生式)消除Pi产生式的直接左递归性END (3)化简由(2)所得的文法。去除那些从开始符号出发永远无法到达的非终结符的产生式。,为非终结符编号,再采用代入法将间接左递归变为直接左递归,消除直接左递归。,例 考虑文法G(S) SQc|c QRb|b R

16、Sa|a 令它的非终结符的排序为R、Q、S。对于R,不存在直接左递归。把R代入到Q的有关候选后,把Q的产生式变为 QSab | ab | b,现在的Q不含直接左递归,把它代入到S的有关候选后,S变成 SSabc | abc | bc | c,消除S的直接左递归后:SabcS | bcS | cSSabcS | QSab |ab | bRSa|a,Q和R的规则已是多余的,化简为:SabcS | bcS | cSSabcS | 文法(4.4),注意,由于对非终结符排序的不同,最后所得的文法在形式上可能不一样。但不难证明,它们都是等价的。 例如,若对文法非终结符排序选为S、Q、R,那么,最后所得的无

17、左递归文法是:SQc | cQRb | b 文法(4.5)RbcaR | caR |aR R bcaR | 文法(4.4)和(4.5)的等价性是显然的。,消除左递归前后,文法的开始符号不变。,4.3.1 左递归的消除,例 考虑文法G(S) SQc|c QRb|b RSa|a 令它的非终结符的排序为S、Q、R 。对于S 和Q都不存在直接左递归。把S代入到R的有关候选后,把R的产生式变为 R Qca | ca | a,把Q代入到R的有关候选后,R变成 R Rbca | bca | ca | a,消除R 的直接左递归后:R bcaR | caR | aR Rbca R | ,最后所得的无左递归文法是

18、:SQc | cQRb | b 文法(4.5)RbcaR | caR |aR R bcaR | ,4.3 LL(1)分析法,4.3.1 左递归的消除 4.3.2 消除回溯、提左因子 4.3.3 LL(1)分析条件,回溯问题,什么是回溯?,分析工作要部分地或全部地退回去重做叫回溯。,造成回溯的条件:,文法中,对于某个非终结符号的产生式右部 有多个选择,并根据所面临的输入符号不能准确 地确定所要的选择时,就可能出现回溯。,回溯带来的问题:,严重的低效率,只有在理论上的意义而无实际意义。,例 假定有文法G(S):(1) SxAy(2) A*|* 分析输入串x*y,4.3.2 消除回溯、提左因子,为了

19、消除回溯就必须保证:对文法的任何非终结符,当要它去匹配输入串时,能够根据它所面临的输入符号准确地指派它的一个候选去执行任务,并且此候选的工作结果应是确信无疑的。 A 1 | 2 | | n,令G是一个不含左递归的文法,对G的所有非终结符的每个候选定义它的终结首符集FIRST()为:,特别是,若 ,则规定FIRST()。,若非终结符A的所有候选终结首符集两两不相交,即A的任何两个不同候选 i和 j FIRST(i)FIRST(j)当要求A匹配输入串时,A就能根据它所面临的第一个输入符号a,准确地指派某一个候选前去执行任务。这个候选就是那个终结首符集含a的。,FIRST()是的所有可能推导的开头终

20、结符或可能的。,提取公共左因子:假定关于A的产生式是A 1 | 2 | | n | 1 | 2 | | m (其中,每个 不以开头)那么,可以把产生式改写成 AA | 1 | 2 | | m A 1 | 2 | | n 经过反复提取左因子,就能够把每个非终结符(包括新引进者)的所有候选首符集变成为两两不相交。,52,文法S iBtSeS|iBtS|aB b 提取公共左因子改写文法。,提取公共左因子,将文法改写为S iBtSS|aS eS|B b,4.3.2 消除回溯、提左因子,一个文法不含左递归,且所有候选式首符集两两不相交,但带产生式,在自上而下分析又带来新问题:这就引出自动匹配问题。,当非

21、终结符A面临输入符号a,且a不属于A的任意候选首符集,但A的某个候选首符集包含时,就一定可以使A自动匹配。这是一种错误。,4.3.2 消除回溯、提左因子,4.3 LL(1)分析法,4.3.1 左递归的消除 4.3.2 消除回溯、提左因子 4.3.3 LL(1)分析条件,文法是LL(1)的第一个L 从左到右扫描输入串第二个L 生成的是最左推导1 向前看一个输入符号(lookahead),ETEE+TE | TFTT*FT | F(E) | ii+i,4.3.3 LL(1)分析条件,例 文法G(E): EET | T TT*F | F F(E) | i 经消去直接左递归后变成:ETEE+TE |

22、TFTT*FT | F(E) | i,i + i,IP,E,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,i,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,i,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,i,G(E

23、):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,i,+,T,E,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,i,+,T,E,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,i,+,T,E,F,T,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,i,+,T,E,F,T,i,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,

24、F,T,i,+,T,E,F,T,i,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,i,+,T,E,F,T,i,G(E):ETEE+TE | TFTT*FT | F(E) | i,i + i,IP,E,T,E,F,T,i,+,T,E,F,T,i,G(E):ETEE+TE | TFTT*FT | F(E) | i,S T+,假定S是文法G的开始符号,对于G的任何非终结符A,我们定义,若 , 则规定FOLLOW(A),4.3.3 LL(1)分析条件,即FOLLOW(A)是所有句型中紧跟在A之后的终结符或#。,构造不带回溯的自上而下分析的文法

25、条件 1. 文法不含左递归。 2. 对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。即,若 A1|2|n则 FIRST(i)FIRST(j) (ij) 3. 对文法中的每个非终结符A,若它存在某个候选首符集包含,当FIRST(j)时,则FOLLOW(A)FIRST(i)= 如果一个文法G满足以上条件,则称该文法G为LL(1)文法。,对于一个满足上述条件的文法,可以对其输入串进行有效的无回溯的自上而下分析。假设要用非终结符A进行匹配,面临的输入符号为a,A的所有产生式为 A1 | 2 | | n 1. 若aFIRST(i),则指派i执行匹配任务; 2. 若a不属于任何一个候选首符集

26、,则:(1) 若属于某个FIRST(i )且 aFOLLOW(A), 则让A与自动匹配。(2) 否则,a的出现是一种语法错误。,第四章 语法分析-自上而下分析,4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造 4.5 预测分析程序,4.4 递归下降分析程序构造,构造不带回溯的自上而下分析程序 要消除文法的左递归性 克服回溯,当一个文法满足LL(1)条件时,我们就可以为它构造一个不带回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。这样的一个分析程序称为递归下降分析器。,4.4 递归下降分析

27、程序构造,如果用某种高级语言写出所有递归过程,那就可以用这个语言的编译系统来产生整个的语法分析程序。,几个全局过程和变量: ADVANCE,读入IP 指向的输入符号到SYM中,把输入串指示器IP指向下一个输入符号。 SYM,IP当前所指的输入符号。 ERROR,出错处理程序。,例:文法G(E): ETE E+TE | TFT T*FT | F(E) | i,非终结符号的分析子程序的功能是:用产生式右部符号串来匹配输入串。,每个非终结符都有对应的递归过程,在分析过程中,当需要从某个非终结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。,假定在开始工作前,输入串指示器IP指向第一个输入符

28、号。当每个子程序工作完毕之后,IP总是指向下一个未处理的符号。,E+TE | ,E 只有两个候选,第一个候选的开头终结符为+,第二个候选为。,当E 面临输入符号+时,就令第一个候选进入工作,当面临任何其它输入符号时, E就自动认为获得了匹配(这时,更精确的做法是判断该输入符号是否属于FOLLOW(E)) 。,4.4 递归下降分析程序构造,/ 将看成与任一符号匹配,例:文法G(E): ETE E+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为:,PROCEDURE E; BEGIN T;E END;,PROCEDURE E;IF SYM=+ THEN BEGIN ADV

29、ANCE;T;E END;,PROCEDURE T; BEGINF;T END;,PROCEDURE T; IF SYM=* THEN BEGINADVANCE;F;T END;,例:文法G(E): ETE E+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为:,例:文法G(E): ETE E+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为:,PROCEDURE F;IF SYM=i THENADVANCEELSEIF SYM=( THENBEGINADVANCE;E;IF SYM=) THENADVANCEELSE ERRORENDELSE

30、ERROR;,第四章 语法分析-自上而下分析,4.1 语法分析器的功能 4.2 自上而下分析面临的问题 4.3 LL(1)分析法 4.4 递归下降分析程序构造,4.5 预测分析程序,4.5 预测分析程序,4.5.1 预测分析程序工作过程 4.5.2 预测分析表的构造,本节要重点掌握:1.对给定文法构造符号串的FIRST集合和非终结符的FOLLOW集合。2. 构造预测分析表的方法。,4.5.1 预测分析程序工作过程,预测分析程序或LL(1)分析法: 总控程序 分析表 MA,a矩阵,A VN ,a VT 是终结符或, 分析栈 STACK 用于存放文法符号,输入串,分析栈 STACK,预测分析器模型

31、,输出,总控程序根据现行栈顶符号X和当前输入符号a,执行下列三种动作之一: (1) 若Xa,则宣布分析成功,停止分析过程。 (2) 若Xa ,则把X从STACK栈顶逐出,让a指向下一个输入符号。,匹配成功,4.5.1 预测分析程序工作过程,4.5.1 预测分析程序工作过程,(3) 若X是一个非终结符,则查看分析表M。 若MX,a中存放着关于X的一个产生式,首先将X弹出STACK栈顶,把产生式的右部符号串按反序一一推进STACK栈(若右部符号为,则意味不推任何东西进栈)。在把产生式的右部符号推进栈的同时应做这个产生式相应的语义动作(目前暂不管)。 若MX,a中存放着“出错标志”,则调用出错诊察程

32、序ERROR。,推导,例 对于文法G(E) ETE E+TE | TFT T*FT | F(E) | i 输入串为i1*i2+i3,利用分析表进行预测分析:,分析表矩阵元素MA, a指出非终结符A,面临输入符号a时,应选用的候选式(或产生式)。若A不该面临a,则放一出错标志。,注:矩阵元素空白表示ERROR,步骤 符号栈 输入串 所用产生式 0 #E i1*i2+i3# 1 #ET i1*i2+i3# ETE 2 #ETF i1*i2+i3# TFT 3 #ETi i1*i2+i3# Fi,推导,步骤 符号栈 输入串 所用产生式 4 #ET *i2+i3# 5 #ETF* *i2+i3# T*

33、FT 6 #ETF i2+i3# 7 #ETi i2+i3# Fi,推导,推导,步骤 符号栈 输入串 所用产生式 8 #ET +i3# 9 #E +i3# T 10 #ET+ +i3# E+TE 11 #ET i3#,推导,推导,步骤 符号栈 输入串 所用产生式 12 #ETF i3# TFT 13 #ETi i3# Fi 14 #ET # 15 #E # T 16 # # E,推导,输出的产生式序列对应最左推导的过程,同时对应相应的分析树。,最左推导过程:E TE FTE iTE i*FTE i*iTE i*iE i*i+TE i*i+FTE i*i+iTE i*i+iE i*i+i,4.5

34、 预测分析程序,4.5.1 预测分析程序工作过程 4.5.2 预测分析表的构造,4.5.2 预测分析表的构造,构造FIRST()和FOLLOW(A) 构造分析表MA,a,构造FIRST(),对每一文法符号XVTVN构造FIRST(X)。连续使用下面的规则,直至每个FIRST集合不再增大为止: (1)若XVT,则FIRST(X)X。 (2)若XVN,且有产生式Xa,则把a加入到FIRST(X)中;若X也是一条产生式,则把也加到FIRST(X)中。,(3)若XY是一个产生式且YVN,则把FIRST(Y)中的所有非-元素都加到FIRST(X)中;若XY1Y2Yk是一个产生式,Y1,Yi-1都是非终结

35、符,而且,对于任何j,1ji-1,FIRST(Yj)都含有, 则把FIRST(Yi)中的所有非-元素都加到FIRST(X)中;特别是,若所有的FIRST(Yj)均含有,j1,2,k,则把加到FIRST(X)中。,对文法G的任何符号串=X1X2Xn构造集合FIRST()。 (1)置FIRST()FIRST(X1); (2)若对任何1ji-1,FIRST(Xj),则把FIRST(Xi)加至FIRST()中;特别是,若所有的FIRST(Xj)均含有,1jn,则把也加至FIRST()中。显然,若则FIRST()。,构造FIRST(),构造FOLLOW(A),对于文法G的每个非终结符A构造FOLLOW(

36、A)的办法是,连续使用下面的规则,直至每个FOLLOW不再增大为止: (1)对于文法开始符号S,置于FOLLOW(S)中; (2)若AB是一个产生式,则把FIRST()加至FOLLOW(B)中;,(3) 若AB是一个产生式,或AB是一个产生式而 (即FIRST(),则把FOLLOW(A)加至FOLLOW(B)中。,例 对于文法G(E) ETE E+TE | TFT T*FT | F(E) | i 构造每个非终结符的FIRST和FOLLOW集合:,FIRST(E) =(,i FIRST(E)=+, FIRST(T) =(,i FIRST(T)=*, FIRST(F) =(,i,FOLLOW(E)

37、 =),# FOLLOW(E)=),# FOLLOW(T) =+,),# FOLLOW(T)=+,),# FOLLOW(F) =*,+,),#,在对文法G的每个非终结符A及其任意候选都构造出FIRST()和FOLLOW(A)之后,现在可以用它们来构造G的分析表MA,a。 (1) 对文法G的每个产生式A执行第2步和第3步; (2) 对每个终结符a FIRST(),把A加至MA,a中; (3) 若FIRST(),则对任何bFOLLOW(A),把A加至MA,b中。 (4)把所有无定义的MA,a标上“出错标志”。,对产生式ETE 由于FIRST(TE)=FIRST(T)= (,i 故应把ETE放入ME

38、,( 和ME,i中。 对于产生式E+TE 由于FIRST(+TE)= + 所以,应把E+TE放入ME,+中。 对于产生式E 由于FOLLOW(E)=),# 故应把E放入ME,)和ME, #中。,如果G是左递归或二义的,那么,M至少含有一个多重定义入口。因此,消除左递归和提取左因子将有助于获得无多重定义的分析表M。 可以证明,一个文法G的预测分析表M不含多重定义入口,当且仅当该文法为LL(1)的。,4.5.2 预测分析表的构造,LL(1)的含义: 第一个L表示从左至右扫描输入符号串 第二个L表示生成输入串的一个最左推导 1表示在决定分析器的每步动作时,向前看一个符号。,LL(1)文法,定义:一个

39、文法G,其分析表M不含多重定义入口(即分 析表中无二条以上产生式),则称它是一个LL(1)文法。,定理:文法G是LL(1)文法的充分必要条件是:对于G的 每一个非终结符A的产生式A| ,下列条件成立:,(1)FIRST() FIRST() = ,试证明文法G是LL(1)文法。,证明:E +TE | FIRST(+TE)=+FOLLOW(E)=),#T *FT | FIRST(*FT)=*FOLLOW(T)=+,),#F (E) | i FIRST(E)=(FIRST(i)=i 所以G(E)是LL(1) 文法。,G(S):S iCtS | iCtSeS | aC b 提取左因子之后,改写成: G

40、(S):S iCtSS | aS eS | C b,最近匹配原则,FIRST(S)=i, a FIRST(S)=e, FIRST(C)=b FOLLOW(S)=e, # FOLLOW(S)=e, # FOLLOW(C) =t,LL(1)文法的判断,一个文法是LL(1)文法,当且仅当它的每一个产生式A|,满足: FIRST()FIRST()= 若推导出,则FIRST()FOLLOW(A)= 构造出的分析表中不含多重定义入口 文法G(S) 不是LL(1)文法 因为FIRST(eS)FOLLOW(S)=e MS,e中两个产生式,对于一个满足上述条件的文法,可以对其输入串进行有效的无回溯的自上而下分析

41、。假设要用非终结符A进行匹配,面临的输入符号为a,A的所有产生式为 A1 | 2 | | n 1. 若aFIRST(i),则指派i执行匹配任务; 2. 若a不属于任何一个候选首符集,则:(1) 若属于某个FIRST(i )且 aFOLLOW(A), 则让A与自动匹配。(2) 否则,a的出现是一种语法错误。,ETEE+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为:,PROCEDURE E; BEGIN T;E END;,PROCEDURE T; BEGINF;T END,文法G(E):,ETEE+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为

42、:,PROCEDURE E;IF SYM=+ THEN BEGIN ADVANCE;T;E ENDELSE IF SYM# AND SYM) THEN ERROR,文法G(E):,文法G(E):,ETEE+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为:,PROCEDURE T;IF SYM=* THENBEGINADVANCE;F;TENDELSE IF SYM# AND SYM) AND SYM+ THEN ERROR,文法G(E):,ETEE+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为:,PROCEDURE F;IF SYM=i THEN ADVANCEELSEIF SYM=( THENBEGINADVANCE;E;IF SYM=) THEN ADVANCEELSE ERRORENDELSE ERROR;,ETEE+TE | TFT T*FT | F(E) | i 对应的递归下降子程序为:,主程序: PROGRAM PARSER; BEGINADVANCE;E END;,文法G(E):,复 习,语法分析方法:,自上而下分析法,自下而上分析法,自上而下分析,(1)概述自上而下分析的一般过程,(2)两种常用方法:,1.构造FIRST集合的算法 2.构造FOLLOW集合的算法 3.构造分析表的算法,

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

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

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


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

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

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