令G是一个文法,S是文法的开始符号,假定abd是文法G的一个句型
其中α,β,d∈(VN∪VT)*,A∈VN ,如果有
定义两个终结符‘a’与‘b’的优先关系
a =.b 表示a的优先性等于b
a >.b 表示a的优先性大于b
算符优先分析算法和设计:句型的一般表示形式:#N1a1N2a2…NnanNn+1#,其中,每个ai都是终结符,Ni是可有可无的非 终结符
定理:一个算符优先文法G的任何句型的最左素短语是满足如下条件的最左子串Njaj…NiaiNi+1,
aj-1<.aj
aj=. aj+1,aj+1=. aj+2,…,ai-1=. ai
ai>. ai+1
优先函数的定义:把每个终结符q与两个自然数f(q)与g(q)相对应,使得
若q1<.q2,则f(q1)< g(q2)
若q1 =. q2,则f(q1)= g(q2)
若q1 >. q2,则f(q1) >g(q2)
f称为入栈优先函数,g称为比较优先函数。
(1)优点:便于比较,节省空间;
(2)缺点:原来不存在优先关系的两个终结符,由于自然数相对应,变成可以比较的。要进行一些特殊的判断。
(1)通过检查产生式的每一个候选式可以找出满足a=.b(即P→…ab…或P→…aQb…的产生式)
(2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):
构造集合FIRSTVT(P)的算法
按其定义,可用下面两条规则来构造集合FIRSTVT(P)
① 若有产生式P→a…或P→Qa…,则a∈FIRSTVT(P);
② 若a∈FIRSTVT(Q),且有产生式P→Q…,则a∈FIRSTVT(P)。即P每一步推导中第一个出现的终结符的集合。
有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<.和>.的所有终结符对。
(1)假定有个产生式的一个候选形为…aP… 那么,对任何bFIRSTVT(P),有a <. b。
(2)假定有个产生式的一个候选形为…Pb… 那么,对任何aLASTVT(P),有a >. b。这样就可以求得优先表。
LR(0)分析表的构造
项目、项目集、项目集规范族
项目集的闭包(closure)
ACTION[s,a]:
<1>. 移进
<2>. 归约
<3>. 接受
<4>. 报错
GOTO[s,X]:
LR(0)分析表的ACTION和GOTO表的构造步骤
(1)若项目A→a•ab属于Ik,且转换函数GO(Ik,a)=Ij,当a为终结符时 ,则置ACTION[k,a]为Sj;
(2)若项目A→a•属于Ik,则对a为任何终结符或“#”,置ACTION[k,a]=rj, j为产生式在文法G′中的编号;
(3)若GO(Ik,A)=Ij,则置GOTO[k,A]=j,其中A为非终结符,j为某一状态号;
(4)若项目S′→S•属于Ik,则置ACTION[k,#]= acc;
(5)其它填上“报错标志”。