first集与follow集

对于终结符和非终结符的理解

  终结符:通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行推导。

  非终结符:不是终结符的都是非终结符。

  如:A->B,则A是非终结符;A->id,则id是终结符。(一般书上终结符用小写,非终结符用大写。)

 

文法产生语言句子的基本思想:

 从识别符号(开始符)开始,把当前产生的符号串中的非终结符替换为相应规则右部的符号串,直到全部由终结符组成。所以文法产生句子的基本思想就是基于产生式(例如A->num)的替换,当所有的非终结符都被终结符替换时,推导结束。

first集:就是求一个表示文法的字串(一般指非终结符,终结符的first集就是它自身)开头的所有可能出现的字符的集合。

求法:

  1. 若X->a..,则将终结符a加入FIRST(X)中;

  2. 若X->e ,则将终结符e加入FIRST(X)中(e表示空集);

  3. 若X->BC..D,则将First(B)所有元素(除了空集)加入First(A),然后检测First(B),若First(B)中不存在空集,即e,则停止,若存在则向B的后面查看,将First(C)中所有元素(除了空集)加入First(A),然后再检测First(C)中是否有e...直到最后,若D之前的所有非终结符的First集中都含   有e,则检测到D时,将First(D)也加入First(A),若First(D)中含有e,则将e加入First(A)。


follow集:指非终结符推出的字串最末端后可能出现的所有字符的集合

求法:

  第一种:

        

  1. 对文法开始符号S,置$于FOLLOW(S)中;

  2. 对于产生式:A->aBC,将除去空集e的First(C)加入Follow(B)中;

  3. 对于产生式:A->aB或者A->aBC,(其中C可以推导出空串,C=>*e),则将Follow(A)加入Follow(B)中。

  第二种: 

           1. 直接收取:注意产生式右部的每一个形如“…Ua…”的组合,把a直接收入到Follow(U)中。因a是紧跟在U后的终结符。

           2.直接收取:对形如“…UP…”(P是非终结符)的组合,把First(P)直接收入到Follow(U)中【在这里,如果First(P)中有空字符,那么就要把左部(假设是S)的Follow(S)送入到   

                                   Follow(U)中。还有就是Follow集中是没有空字符的】  

           3. 直接收取:若S->…U,即以U结尾,则#∈Follow(U)

           4.*反复传送:对形如U->…P的产生式(其中P是非终结符),应把Follow(U)中的全部内容传送到Follow(P)中。





  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值