语法分析--FIRST,FOLLOW集和LL(1)文法

1.前言

自顶向下和自底向上语法分析器的构造可以使用和文法G相关的两个函数FIRST和FOLLOW来实现。在自顶向下语法分析过程中,FIRST和FOLLOW使得我们可以根据下一个输入符号来选择应用哪个产生式。在恐慌模式的错误恢复中,由FOLLOW产生的词法单元集合可以作为同步词法单元。

2.FIRST和FOLLOW集

计算各个文法符号X的FIRST(X)时,不断的应用下面的规则,知道在没有新的终结符号或\epsilon可以被加入到任何FIRST集合中为止。

1)如果X是一个终结符号,那么FIRST(X) = X。

2)  如果X是一个非终结符号,且X\rightarrowY_1Y_2...Y_k是一个产生式,其中k\geq1,那么如果对于某个i,a在FIRST(Y_i)中且\epsilon在所有的FIRST(Y_1) ,... ,FIRST(Y_i_-_1)中,就把a加入到FIRST(X)中。也就是说,Y_1...Y_i_-_1\Rightarrow\epsilon。如果对于所有的j = 1,2,...,k,  \epsilon在FIRST(Y_j)中,那么将\epsilon加入到FIRST(X)中。比如,FIRST(Y_1)中的所有符号一定在FIRST(X)中。如果Y_1不能推导出\epsilon,那么我们就不会再向FIRST(X)中加入任何符号,但如果Y_1\overset{*}{\rightarrow}\epsilon,那么我们就加上FIRST(Y_2),依此类推。

3)如果X\rightarrow\epsilon是一个产生式,那么将\epsilon加入到FIRST(X)中。

现在,我们可以依照如下方式计算任何串X_1X_2...X_n的FIRST集合。向FIRST(X_1X_2...X_n)集合中加入F(X_1)中所有的非\epsilon符号。如何\epsilon在FIRST(X_1)中,再加入FIRST(X_2)中所有的非\epsilon符号;如果\epsilon在FIRST(X_1)和FIRST(X_2)中,再加入FIRST(X_3)中加入所有的非\epsilon符号,依此类推。最后,如果对所有的i,\epsilon都在FIRST(X_i)中,那么将\epsilon加入到FIRST(X_1X_2...X_n)中。

计算所有的非终结符号A的FOLLOW(A)集合时,不断的应用下面的原则,直到再没有新的终结符号可以被加入到任意FOLLOW集合中为止。

1)将$放到FOLLOW(S)中,其中S是开始符号,而$是输入右端的结束标记。

2)如果存在一个产生式A\rightarrow\alpha B\beta,那么FIRST(\beta)中除\epsilon之外的所有符号都在FOLLOW(B)中。

3)如果存在一个产生式A\rightarrow\alphaB,或存在产生式A\rightarrow

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验2 文法的读入、判定和处理 一、实验目的 熟悉文法的结构,了解文法在计算机内的表示方法。 二、实验内容 1、 设计一个表示文法的数据结构; 2、 从文本文件中读入文法,利用定义的数据结构存放文法,并输出; 3、 本实验结果将来还有用。 三、实验要求 1、 了解文法定义的4个部分: G(Vn, Vt, S, P) Vn 文法的非终结符号合,在实验中用大写的英文字母表示; Vt 文法的终结符号合,在实验中用小写的英文字母表示; S 开始符号,在实验中是Vn合中的一个元素; P 产生式,分左部和右部,左部为非终结符号中的一个,右部为终结符号或非终结符号组成的字符串,如S->ab|c 2、 根据文法各个部分的性质,设计一个合理的数据结构用来表示文法, 1) 若使用C语言编写,则文法可以设计成结构体形式,结构体中应包含上述的4部分, 2) 若使用C++语言或java语言编写,则文法可以设计成文法类形式,类中至少含有4个数据成员,分别表示上述4个部分 文法数据结构的具体设计由学生根据自己想法完成,并使用C或C++语言或Java实现设计的数据结构。 3、 利用完成的数据结构完成以下功能: 1) 从文本文件中读入文法文法事先应写入文本文件); 2) 根据文法产生式的结构,分析出文法的4个部分,分别写入定义好的文法数据结构的相应部分; 3) 整理文法的结构,判断该文法文法类型,是否为0型,1型,2型或3型文法,并输出判断结果; 4) 在计算机屏幕或者文本框中输出文法文法输出按照一个非终结符号一行,开始符号引出的产生式写在第一行,同一个非终结符号的候选式用“|”分隔的方式输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值