FIRSTVT和LASTVT白话版

FIRSTVT和LASTVT白话版

FIRSTVT集合

如:FIRSTVT®的集合为R推出的串中非终极符中出现的第一个终结符,如果第一个出现(A)为非终结符,则还需要查看这个非终结符(A)的的FIRSTVT(A)加入到FIRSTVT®中,一直到结束。

求FIRSTVT(R)的步骤:

  • 1.对所有的R∈VN,若有产生式 R->a…或者R->Qa…则a∈FIRSTVT(R);
  • 2.若a∈FIRSTVT(Q),且有产生式R->Q…,则把a加入FIRSTVT(R);
  • 3.重复2一直到FIRSTVT(R)集合不在扩大为止。

理解:
对于第一步,我们可以知道,在右部产生式中出现的第一个终结符加入FIRSTVT(左部产生式)。
第二步,对右边出现的首字符是非终结符的FIRSTVT(首字符)移入FIRST(左部产生式)。

LASTVT集合

LASTVT集合刚好和FIRSTVT集合相反,出现的是右部产生式最后出现的终结符加入集合,以及最后一个字符是非终结符时的LASTVT加入集合。

求LASTVT(R)的步骤:

  • 1.对所有的R∈VN,若有产生式 R->…a或者R->…aQ则a∈LASTVT(R);
  • 2.若a∈LASTVT(Q),且有产生式R->Q…,则把a加入LASTVT(R);
  • 3.重复2一直到LASTVT(R)集合不在扩大为止。

理解:和FIRSTVT类似。

例题:

例:构造下面文法的算符优先表。      
S ->if R then E else E       
E ->E+T|T        
T ->T*F|F       
F ->i
R ->b     

解:1)求各非终结符的首终结符集和尾终结符集。为了考虑语句的开始和结束符号“#”,对文法拓广,加一个产生式S’->#S#
FIRSTVT(S)={if} LASTVT(S)={else,+,,i}
FIRSTVT(E)={+,
,i} LASTVT(E)={+,,i}
FIRSTVT(T)={
,i} LASTVT(T)={*,i}
FIRSTVT(F)={i} LASTVT(F)={i}
FIRSTVT®={b} LASTVT®={b}

你可能感兴趣的:(编译原理)