编译原理(龙书第二版)--怎么求FIRST集

提示:建议先看例题,有不懂的地方再结合相应的文字部分。

怎么求FIRST集

什么是FIRST集?可以这么理解,first的意思是第一,首个的。所以FIRST集就是 “ 箭头右侧首个终结符的集合 ” 。现在不理解也问题不大,往下看,做个题练练就明白了。

给出文法如下:
S → ABc
A → a|ε
B → b|ε

先明确一些概念,“产生式的头”就是箭头左边的大写字母,“产生式的体”就是箭头右侧的一堆符号。

非终结符就是大写字母。
终结符就是非终结符以外的所有符号(注意是符号,而不只局限于字母,终结符包括小写字母,数字,加号,减号,逗号等等)。

代入:对于产生式S → ABc, 箭头两侧是等价的,当箭头右部出现S时,就可以用ABc等价代替,可以方便地称为“代入”,这个做题时很好用。代入是用箭头右部代替左部,不能用左部代替右部。

如果求 某个非终结符的FIRST集,做题步骤:
1.首先找到文法中箭头左边的是该非终结符所有式子;
2.然后在每个式子的产生式体中(也就是箭头右边那一堆),从左向右找,直到遇到一个终结符,就结束对这个式子的分析,将这个终结符写入所求的FIRST集,这个开头的终结符就是所求FIRST集中的一个元素;
注意如果在这个过程中,出现了" 非终结符->ε "的形式也就是箭头右侧只剩下ε这一个符号,比如S → ε,这个式子的分析结束,将ε写入S的FIRST集。
3.如果在从左向右找的过程中,遇到非终结符M,则要将箭头左侧是该非终结符M的所有产生式的产生式体依次代入
4.这些得到的所有终结符共同组成该非终结符的FIRST集(集合中不能出现重复元素)。
例题1: 求解上面文法所有非终结符的FIRST集。
非终结符共有3个,即S,A,B。

先求S的FIRST集:
题目中的文法等价于:
S → ABc
A → a
A → ε
B → b
B → ε
如果是初学者,建议将给出的文法改写成这种形式,全部罗列出来。
1.找到箭头左边是S的全部式子,本题只有S → ABc。
2.然后逐个看箭头右边的部分。本题只有一个式子,这个式子的右侧是ABc。
(1)从左向右找,直到遇到一个终结符,首先遇到A;
(2)A是非终结符,找箭头左侧是A的所有产生式即 A → a和A → ε,将产生式的体依次代入得到:S → aBc和S → Bc;
(3)对于产生式S → aBc,aBc的第一个符号a是终结符,这个式子分析结束,将a写入S的FIRST集中;
(4)再分析S → Bc,Bc的第一个符号B是非终结符,找箭头左侧是B的所有产生式即B → b和B → ε,代入得到:S → bc和S → c;
(5)分析S → bc,箭头右部的第一个是终结符,这个式子分析结束,将b写入S的FIRST集中;
(6)再分析S → c,箭头右部第一个是终结符,这个式子分析结束,将c写入S的FIRST集中。
3.此时,所有的式子都分析结束,S的FIRST集就是{a,b,c}。

注意一个问题,FIRST集中不会出现重复的元素,如果之前已经存在某个终结符,不用写入第二次。

接下来求A的FIRST集:
题目中的文法等价于:
S → ABc
A → a
A → ε
B → b
B → ε
1.找到箭头左边是A的全部式子,本题有A → a和A → ε。
2.然后逐个看箭头右边的部分。先看A → a
(1)从左向右找第一个终结符,首先遇到a,这个式子分析结束,将a写入A的FIRST集;
(2)再分析A → ε,上面说过如果箭头右侧只剩下ε这一个符号,结束这个式子的分析,将ε写入A的FIRST集中。
3.所有的式子都分析结束,S的FIRST集就是{a,ε}。

B的FIRST集分析过程与A类似,不再赘述,B的FIRST集是{b,ε}。

一个例题是不够的,再来一道。
例题2:

求出下图中所有非终结符的FIRST集

图片来源:烟台大学计控学院
分析过程:

题目文法等价于:
S → MH
S → a
H → LSo
H → ε
K → dML
K → ε
L → eHf
M → K
M → bLM
1.求S的FIRST集,找出箭头左侧是S的所有产生式:S → MH和S → a
(1)先分析S → MH,箭头右部第一个符号是非终结符M,将M → K和M → bLM代入得到:S → KH和S → bLMH;
(2)再分析S → KH,箭头右部第一个符号是非终结符K,将K → dML和K → ε代入得到:S → dMLH和S → H;
(3)再分析S → dMLH,箭头右部第一个符号是终结符d,这个式子分析结束,将d写入S的FIRST集;
(4)再分析S → H,箭头右部第一个符号是非终结符H,将H → LSo和H → ε代入得到:S → LSo和S → ε;
(5)再分析S → LSo,箭头右部第一个符号是非终结符L,将L → eHf代入得到S → eHfSo;
(6)再分析S → eHfSo,箭头右部第一个符号是终结符e,这个式子分析结束,将e写入S的FIRST集;
这时要注意上面还有好几个式子没有分析结束,按照从下向上的顺序依次分析。
(7)所以接下来分析(5)剩下的S → ε;
(8)箭头右侧只剩下ε这一个符号,这个式子分析结束,将ε写入FIRST集。
(9)再分析(1)剩下的S → bLMH,箭头右部的第一个符号是终结符b,这个式子分析结束,将b写入S的FIRST集;
(10)还没完,因为本题以S开头的式子有两个,刚才分析的是S → MH,还剩S → a没有分析,不过这个式子一目了然,a是终结符,结束分析,写入FIRST集。

S的FIRST集:{d,e,ε,b,a}.
整个过程就是一个递归的过程,WHAT HAPPENED ? 学习FIRST集竟然学会了递归,还不赶紧趁热打铁这次一定。

2.求H的FIRST集,找出箭头左侧是H的所有产生式:H → LSo和H → ε
(1)先分析H → LSo,箭头右侧第一个符号是非终结符L,将L → eHf代入得到:H → eHfSo;
(2)分析H → eHfSo,箭头右侧第一个是终结符e,结束分析,将e写入FIRST集;
(3)再分析剩下的H → ε;
(4)箭头右侧只剩下ε这一个符号,分析结束,将ε写入FIRST集。
H的FIRST集:{e,ε}.
3.求K的FIRST集,找出箭头左侧是K的所有产生式:K → dML和K → ε
(1)先分析K → dML,箭头右侧第一个符号是终结符d,这个式子分析结束,将d写入K的FIRST集;
(2)再分析K → ε,简简单单,箭头右侧只剩下ε这一个符号,这个式子分析结束,将ε写入FIRST集。
OK,结束。
K的FIRST集就是:{d,ε}.
4.L的FIRST集:{e}
5.求M的FIRST集,找出箭头左侧是M的所有产生式:M → K和M → bLM
(1)先分析M → K,K是非终结符,代入:M → dML和M → ε;
(2)再分析M → dML,d是终结符,结束分析,将d写入FIRST集;
(3)再分析M → ε,将ε写入FIRST集;
(4)还剩M → bLM,b是终结符,将b写入FIRST集。
M的FIRST集就是:{d,ε,b}

例题2答案

终结符FIRST集
Sd,e,ε,b,a
He,ε
Kd,ε
Le
Md,ε,b

注意还有一种题型,是让你求产生式体的FIRST集。
其实和上面的解法本质一样。就还是用例题2的文法。
题目让你求S → MH中MH的FIRST集,这种情况就把除此之外的“其他箭头左侧是S的式子”忽略掉,再按照上面的方法求S的FIRST集即可。
FIRST(MH):{d,e,ε,b},没有a了。

练习题,可以自己练练手。
文法
答案:
在这里插入图片描述

  • 40
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值