<编译原理>——first集、follow集、firstvt集及lastvt集

来源:互联网 发布:android 解析json数据 编辑:程序博客网 时间:2024/06/16 08:22

之前自顶向下语法分析写了下怎么求first、follow集,这次写一下firstvt、lastvt的求法,顺便写写我对这四个集合的理解


先补充一下上篇博客:

我们知道,first集和follow集是用在自顶向下语法分析中。假如给定例子S->aA|bB|c,那么S被替换后,打头的字符可能是a、b或c;而形如S->Aa,A->b,这时候替换S后,打头的是非终结符A,替换A,得到b,也就是b成为了S的打头。这里需注意的是如果有A->空,那么这时候a也有可能成为打头的。所以我的理解,first集为非终结符所有可能的打头非终结符。而follow集不是非终结符的最末尾非终结符,而是非终结符下一位的终结符。


Firstvt集的求法
有三条规则
(1)A->a.......,即以终结符开头,该终结符入Firstvt(2)A->B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt(3)A->Ba.....,即先以非终结符开头,紧跟终结符,则终结符入Firstvt


Lastvt集的求法
也有三条规则:(1)A->.......a,即以终结符结尾,该终结符入Lastvt(2)A->.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt(3)A->.....aB,即先以非终结符结尾,前面是终结符,则终结符入Firstvt


Firstvt集和Lastvt集主要用在自底向上语法分析,这时候要考虑一个问题。比如说读入3+3*3,这里的+和*优先级未知,那读到3+3的时候,是进行规约还是继续读入就涉及到优先级的问题,Firstvt集和lastvt集的作用就在于此。

比如说S->aA,A->b 那么S的firstvt集为a,A的为b,对于S->aA来说A的firstvt集中所有元素其优先级都高于a;同理对于某非终结符的lastvt集,集中的所有元素的优先级高于非终结符后跟的终结符