因此,问题归结为: ①构造该二个集合的算法,对每一V的 FIRSTVT(P)、LASTVT(P) ②使用每个VN的FIRSTVT(P)、LASTVT(P),检 查每一个产生式,找出所有(a,b)的关 系,就完成了构造优先关系表
①构造该二个集合的算法,对每一 VN的 FIRSTVT(P) 、LASTVT(P) ②使用每个VN的FIRSTVT(P) 、LASTVT(P),检 查每一个产生式,找出所有(a,b)的关 系,就完成了构造优先关系表。 因此,问题归结为:
3构造集合FIRSTVT(P)的算法 ①P->a…或P->Qa…,则a∈FIRSTVT(P); ②若a∈FIRSTVT(Q),且有产生式P->Q·,则 a∈FIRSTVT(P) 4构造集合LASTSTVT(P)的算法 ①P->…a或P->…aQ,则a∈LASTVT(P); ②若a∈LASTVT(Q),且有产生式P->Q,则 a∈LASTVT(P)
3 构造集合FIRSTVT(P)的算法 ① P->a…或P->Qa…,则a∈FIRSTVT(P); ②若a∈FIRSTVT(Q),且有产生式P->Q…,则 a∈FIRSTVT(P) 4 构造集合LASTSTVT(P)的算法 ① P->…a 或 P->…aQ,则a∈LASTVT(P); ②若a∈LASTVT(Q),且有产生式P->…Q,则 a∈LASTVT(P)
5构造优先表方法 ①对形如P->…ab…和形如P->…aQb…,有a=b; ②对形如P->aR…,而b∈FIRSTVT(R),有a≤b; ③对形如P->…Rb…,而a∈LASTVT(R),有a>b; ④对文法开始符号S,有#<FIRSTVT(S),LASTVT(S)>#, 且对#S#,有#工#
5 构造优先表方法 ① 对形如 P->…ab…和形如P->…aQb…,有a b; ②对形如 P->…aR…,而b∈FIRSTVT(R),有a b; ③对形如 P->…Rb…,而a∈LASTVT(R),有a b; ④对文法开始符号S,有# FIRSTVT(S),LASTVT(S) #, 且对 #S#,有# #
●FIRSTVT(P)的自动构造 >过程NSERT: PROCEDUREINSERT(P,a) IF NOT F[P,a]THEN BEGIN F[P,a]:=TRUE; 把(P,a)下推进STACK栈 END; >主程序:
⚫FIRSTVT(P)的自动构造 ➢过程INSERT: PROCEDURE INSERT(P,a) IF NOT F[P,a] THEN BEGIN F[P,a] := TRUE; 把(P,a)下推进STACK栈 END; ➢主程序:
BEGIN FOR每个非终结符P和终结符aDOF[P,a]:=FALSE; FOR每个形如P->a…或P->Qa…的产生式DO INSERT(P,a); WHILE STACK非空DO BEGIN 把STACK的顶项,记为(Q,),弹出去 FOR每条形如P->Q…的产生式DO INSERT(P,a) END OF WHILE; END
BEGIN FOR 每个非终结符P和终结符a DO F[P,a] := FALSE; FOR 每个形如P->a …或P->Qa…的产生式DO INSERT(P,a); WHILE STACK 非空 DO BEGIN 把STACK的顶项,记为(Q,a),弹出去 FOR 每条形如P->Q…的产生式DO INSERT(P,a) END OF WHILE; END