请输入您要查询的百科知识:

 

词条 算符优先分析法
释义

算符文法:即它的任一产生式的右部都不含两个相继的非终结符的文法。如果G是一个不含空字符的算法文法,那么只要它的任一对终结符都只满足>,=,<的关系的一种,则称G是一个算符优先文法。

算符文法

分类

对于一个算符优先文法,只要能构造出它的算符优先表,就可以利用算符优先分析方法,分析一个句子是否符合这个文法的定义。

那么定义FirstVT(P)={a|P(+=>)a···或P(+=>)Qa···,a属于终结字符集,而Q属于非终结字符集},其中···表示所有字符集

LastVT(P)={a|P(+=>)···a或P(+=>)···aQ,a属于终结字符集,而Q属于非终结字符集}

由以下两条规则来构造FirstVT集:

(1) 若有产生式P=>a···、或P=>Qa···,则a属于FirstVT(P);

(2) 若有a属于FirstVT(Q),且有产生式P=>Q···,则a属于FirstVT(P);

类似的有构造LastVT集的规则:

(1) 若有产生式P=>···a或P=>···aQ,则a属于LastVT集。

(2) 若a属于LastVT(Q),且有产生式P=>···Q,则a属于LastVT集。

构造FirstVT集的算法

Begin

For 每个非终结符P和终结符a Do F[P,a]=FALSE;

For 每个形如P=>a···或P=>Qa···的产生式……(1)

DO insert(P,a)

While Stack 非空 Do

Begin

把Stack 的顶项,记为(Q,a),上托出去;

For每条形如P=>Q···的产生式DO …….(2)

Insert(P,a)

End of while;

END

构造LastVT集的算法

将上述算法的对应的(1),(2)分别修改为

For 每个形如P-〉…a或P-〉…aQ的产生式,

For每条形如P-〉…Q的产生式

便可得。

假定G是一个不含空字符产生式的算符文法。对于任何一对终结符a,b,

(1)a=b,当且仅当G中含有形如P->…ab…或P->…aQb…的产生式;

(2)a<b, 当且仅当G中含有形如P->…aR…的产生式,而R-〉b…或R->Qb…;

(3)a>b, 当且仅当G中含有形如P->…Rb…的产生式,而R->…a或R->…aQ;

这样再结合上次的FirststVT和LastVT集的概念便可以由文法自动构造出算符优先表。

再定义一个素短语的概念:它至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语,所谓最左素短语就是处于句型最左边的素短语。而一个算符优先文法G的任何句型的最左素短语是满足以下条件的最左子串NaNb…NcNdN(N是非终结符,a,b,c,d是终结符)

a<b b=…=c c>d

这样形成一个驼峰结构,当找到这样一个子串的时候,它们优先级相等的一段就可以归约为一个非终结符,否则报错。

因此算符优先文法分析就是找到这样的字串并归约,最终所有终结符都被成功归约为##时表明这个句子符合所定义的文法要求。

构造优先表的算法

For每条产生式P-〉X1X2…Xn DO

For i=1;to n-1 Do

Begin

If xi和xi+1 均为终结符 then 置 xi=xi+1

If i<=n-2 且 xi 和 xi+2都为终结符

但Xi+1为非终结 then 置 xi=xi+1

If xi为终结符而xi+1为非终结符 then

For FirstVt(xi+1)中的每个a DO

置 xi<a;

If xi为非终结符而xi+1为终结符 then

For LastVt(xi)中的每个a DO

置 a>xi;

END

算符优先算法

K=1; s[k]=’#’

Repeat

把下一个输入符号读进a中;

Ifs[k]属于Vt,then j=k else j=k-1;

While s[j]> a do

Begin

Reapeat

Q=s[j];

If s[j-1]属于Vt then j=j-1 else j=j-2

Until s[j]<Q

把s[j+1]…s[k]归约某个N;

K=j+1

S[k]=N

End of while

If s[j]<a or s[j]=a then

Begin k=k+1; s[k]=a end

Else 出错

UNTIL a=’#’

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2024/11/16 8:41:09