目录
1.定义
大家看完定义之后是不是觉得有点懵,这很正常,我们要利用定义做题的第一步就是理解定义。
笔者在这里先给大家抛个引子,我认为它们的计算与FOLLOW集的计算有类似之处(FOLLOW集的计算我在之前的文章里详细介绍过)
2.定义剖析与理解
大家看看这样是不是比上面的定义要好理解的多,其实这就是我们解决问题的思路与过程。
如果大家觉得还不够通俗易懂,我再用白话文来解释一下,可能不够严谨,但却非常容易理解。
(1)FIRSTVT(P)
第一步:从第一个推导式开始找,有没有以终结符开头(a...)或者以一个非终结符加上一个终结符开头(Qa...)的表达式,有的话将FIRSTVT(a)中所有的元素加到FIRSTVT(P)中去。
第二步:如果FIRSTVT(a)中所有元素都在FIRSTVT(Q)中,并且P可以推导出以Q开头的表达式,则将FIRSTVT(a)中所有元素放入FIRSTVT(P)中去。
(2)LASTVT(P)
和上面的推导过程是一样的,同学们模仿上面的进行推导。
3.例题演示
(1)FIRSTVT的详细计算过程
1.第一遍扫描
首先分析E->E+T,进行第一步可知符合以一个非终结符加上一个终结符开头(Qa...),将+加入到FIRSTVT(E)中。
再分析第二步,可知E->E+T还符合P->Q,FIRSTVT(E)中的元素加入到FIRSTVT(E)中,集合不发生变化。
E的第二个候选E->T经过分析也符合P->Q,FIRSTVT(T)中的元素加到FIRSTVT(E)中,此时FIRSTVT(T)为空,集合不发生变化。
第二个候选式和第三个候选式的推导过程和第一个基本是一模一样的思路,我把过程推导出来的表格附在上面,同学们动手推导以后再对答案。
最后一个候选式比较特殊,我再来手工推导一遍。我们先来看第一个式子P->(E) |i,同样可以知道以终结符开头(a...)符合第一步,将(和i放FIRSTVT(P),接着看,他们并不符合第二步。
第一遍结束,集合发生了变动,接着进行第二遍。
2.第二遍扫描
直接上推导图
第二遍推导结束,集合发生变化,进行第三遍推导。
3.第三遍扫描
第三遍扫描结束,集合有变化,开始第四遍推导。
4.第四遍扫描
第四遍扫描结束,集合有变化,开始第五遍推导。
5.第五遍扫描
集合没有发生变化,推导结束。
(2)LASTVT的详细计算过程
其实和FIRSTVT是类似的,同学们按照前面的思路自行推导。