编译原理复习总结--FIrst集、Follow集、Select集、LL(1)文法的判断以及分析过程总结

构造First集合

First集合的大白话定义:

  • 定义:就是由某个非终结符能够推导出来的句子的句首符号的集合,就是这个非终结符的First集合

构造方法:

构造First集合有以下几种情况:

  • E->aB,即以终结符开头的,直接将其加入左部非终结符的First集合中。First(E)<==a

  • E->AB,即以非终结符开头的,但是这种有两种小情况

    • A!=>*ε,即不能由A推导出ε,则只需要把First(A)加入到First(E)。First(E)<==First(A)
    • A=>*ε,即A可以经过若干步推导得ε,则也需要吧B的First集合加入到First(E)。First(E)<==First(A)+First(B)

    例子:

    E->TA A->+TA|ε T->FB B->*FB|ε F->i|(E)

    line1:E是以T开头,是非终结符,且无法推出ε,故将First(T)==>First(E)

    line2:A是以+/ε开头,是终结符,则将{+、ε}==>First(A)

    line3:T是以F开头,是非终结符,且无法推出ε,故将First(F)==>First(T)

    line4:B是以*/ε开头,是终结符,则将{*、ε}==>First(B)

    line5:F是以i/(开头,是终结符,则将{i、(}==>First(F)

    编写程序需循环执行上述的操作,直至所有的First集合没有再变化为止


构造Follow集合:

Follow集合的大白话定义:

  • 定义:对于某个非终结符,紧跟在其后面的终结符的集合就是这个非终结符的Follow集

构造方法:

构造Follow集合有以下几种情况:

  • E->...Ab...,即在产生式中任意位置存在 一个非终结符 + 一个终结符,则将终结符加入到非终结符的Follow集合中,即Follow(A)<==b
  • E->...AB...,即在产生式中存在 两个非终结符相邻,且B不在末尾,则将B的First集合减去ε再加入到A的Follow集合中,即Follow(A)<==First(B)-ε
  • E->...AB,即在产生式中存在 两个非终结符相邻,且B在末尾,此时分为两种情况:
    • B!=>*ε,即B不能推出ε时,需将B的First-ε集加入A的Follow集,且将E的Follow集加入B的Follow集合。即Follow(A) <== First(B) - ε,Follow(B) <== Follow(E)
    • B=>*ε,即经过若干步的推导B能推导出ε,则不仅需要将B的Follow集加入A的Follow集,E的Follow集加入B的Follow集合,还需要将E的Follow集合加入A的Follow集合。即Follow(A) <== First(B) - ε+Follow(E),Follow(B) <== Follow(E)。

例子:

E->TA A->+TA|ε T->FB B->*FB|ε F->i|(E)

首先第一步将#加入到文法的开始符号E的Follow集中

line1:产生式是两个相邻的非终结符,A为末尾且能推出ε,故First(A) -ε ==> Follow(T),Follow(E) ==> Follow(A)

line2:产生式1存在与line1相同的句型,即照着line1的方法做即可,产生式2是空串,不做操作

line3:右部产生式与line1的做法相同,即First(B) -ε ==> Follow(F),Follow(T) ==> Follow(B)

line4:与line2相似,略

line5:对于产生式1不做操作。对于产生式2,存在一个非终结符+终结符,故将 ) ==> Follow(E)

编写程序需循环执行上述的操作,直至所有的Follow集合没有再变化为止


构造Select集合:

Select集大白话理解:

  • 定义与作用:Select集是针对产生式而言,对于一个产生式,它所产生的句子的句首符号所构成的集合称为Select集。其作用就是用于构建预测分析表,以便之后分析时选择正确的产生式。

构造方法

有了前面First集和Follow集的构造,Select集合的构造就相对比较简单了,它有两种情况:

  • 第一种是产生式能产生一个句子,但是不能推导出ε,则Select(E->α)=First(α)
  • 第二种是产生式能推导出ε,则Select(E->α)={First(α)-ε} + Follow(E)

例子:

E->TA A->+TA|ε T->FB B->*FB|ε F->i|(E)

line1:只有一个候选产生式,且E无法推导出ε,所以Select(E->TA) = First(T)

line2:第二行有两个候选式,针对第一个候选式A->+TA,因为以+开头,那么肯定就推不出ε,故Select(A->+TA)=+,而第二个产生式能推出ε,故Select(A->ε) = Follow(A)

line3:与第一行类似,略

line4:与第二行类似,略

line5:针对第一个产生式F->i,满足第一条规则,所以Select(F->i)=i;针对第二个产生式也是如此。


如何判断是否符合LL(1)文法:

观察所有Select集,若左部相同的产生式的Select集的交集不为空,则不符合LL(1)文法,否则满足。

拿上述例子为例:Select(A->+TA) = {+},Select(A->ε) = {#, )}。 Select(A->+TA) ∩ Select(A->ε) = ф;

​ Select(B->*FB) = {*},Select(B->ε) = {+, #, )}。Select(B->*FB) ∩ Select(B->ε) =ф

​ 综上所述每个产生式的Select集没有交集,故上述的例子所示文法为LL(1)文法


预测分析表的构造

预测分析表大白话理解:

  • 定义与作用:预测分析表根据Select集建立,把产生式放到对应的非终结符和终结符所确定的表位置中。作用即根据分析栈中的栈顶元素和符号串的串首字符选择正确的产生式。

举例构造

E->TA A->+TA|ε T->FB B->*FB|ε F->i|(E)
  • Select集
Select(E->TA)= ['i', '('] Select(A->+TA)= ['+'] Select(A->ε)= ['#', ')'] Select(T->FB)= ['i', '('] Select(B->*FB)= ['*'] Select(B->ε)= ['+', '#', ')'] Select(F->i)= ['i'] Select(F->(E))= ['(']
  • 预测表

    将每个产生式放到产生式左部非终结符所对应的行,列表中各个终结符所对应的列,最终得

--------------------------------------------------------- | | + | * | i | ( | ) | # | --------------------------------------------------------- | E | | | TA | TA | | | --------------------------------------------------------- | A | +TA | | | | ε | ε | --------------------------------------------------------- | T | | | FB | FB | | | --------------------------------------------------------- | B | ε | *FB | | | ε | ε | --------------------------------------------------------- | F | | | i | (E) | | | ---------------------------------------------------------

分析

分析时即根据对应的栈顶符号和句首符号选择相应的产生式,注意选择相应的产生式之后,需要逆序入栈,此乃重点,需要谨记。如果遇到没有对应产生式的例子,则说明,次句子不符合该语法。

补充一下FirstVT和LastVT的使用方法Firstvt

Firstvt

找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:
A->a.......,即以终结符开头,该终结符入Firstvt
A->B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt
A->Ba.....,即先以非终结符开头,紧跟终结符,则终结符入Firstvt

Lastvt
找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:
A->.......a,即以终结符结尾,该终结符入Lastvt
A->.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt
A->.....aB,即先以非终结符结尾,前面是终结符,则终结符入Firstvt


__EOF__

本文作者Fortunater
本文链接https://www.cnblogs.com/Fortunater/articles/12883910.html
关于博主:不急不躁,一步一步走向技术巅峰
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   凡璞  阅读(8858)  评论(2编辑  收藏  举报
1 2
3 4
5 6
点击右上角即可分享
微信分享提示