文章目录
一. 什么是算符文法?应满足什么条件
-
算符文法
设有一个文法G,若G中有形如U->Vw的产生式,即它的任意产生式的右部都不含两个相继的非终结符,则称G为算数文法,或称为OG文法。 -
算符优先文法
(1)是自上而下分析法中的一种,虽然他不是规范规约,但具有分析速度快的特点,是和表达式分析。
(2)算符优先分析法就是仿照算数四则运算的运算过程。定义任意两个相继出现的终结符号a和b之间的优先关系,一点确定了这种优先关系,就可以用他确定“句柄”进行规约。
二. 算符文法中,相邻算符之间的优先关系有几种?如何定义?
设G是不含ε-产生式的文法,对任何终结符a,b∈VT,A,B,C∈VN
- a优先级高于b: a > b,a先于b被规约
- a优选级等于b: a = b,a与b同时被规约
- a优先级低于b: a < b,a后于b被规约
三. 如何构造优先关系矩阵?
1. FIRSTVT集、LASTVT集的定义及构造方法;
定义FirstVT§={a|P(+=>)a···或P(+=>)Qa···,a属于终结字符集,而Q属于非终结字符集},其中···表示所有字符集
LastVT(P)={a|P(+=>)···a或P(+=>)···aQ,a属于终结字符集,而Q属于非终结字符集}
- 由以下两条规则来构造FirstVT集:
- 若有产生式P=>a···、或P=>Qa···,则a属于FirstVT(P);
- 若有a属于FirstVT(Q),且有产生式P=>Q···,则a属于FirstVT§;# 四. 算符优先分析法最左可规约串的确定
- 类似的有构造LastVT集的规则:
- 若有产生式P=>···a或P=>···aQ,则a属于LastVT集。
- 若a属于LastVT(Q),且有产生式P=>···Q,则a属于LastVT(P)集。
2. 构造优先关系矩阵的算法?举例加以讲解;
四. 算符优先分析法最左规约串的确定
1. 最左素短语的定义是什么?
- 素短语:某文法句型的短语它至少包含有一个终结符号,并且除它之外,不再包含任何更小的素短语。
- 最左素短语:任意句型最左边的素短语。
2. 最左素短语的特征?如何根据其特征确定当前句型的最左可归约串?
3. 什么是“单非产生式”,算符优先分析法进行规约为什么速度快?
- 右部仅有一个非终结符的产生式
- 比用文法的优先关系矩阵节省内存,若有n个终结符号,优先关系矩阵占内存为(n+1)2,优先函数为2(n+1);
- 编程时便于比较运算,即用一般的关系运算即可;
五. 算符优先分析法总控程序的工作流程及伪代码
1. 工作流程
- 定义两个相继出现的终结符a 和b 的优先关系
- 确定要规约的句型的最左素短语
- 将最左素短语规约
2. 伪代码
void Isleft( )
{ Stack s;
k=1;
s[k]=’#’;
do{ 把下一个输入符号读进a中;
if (S[k]∈VT) j=k;
else j=k-1;
while(S[j]>a)
{ do{ Q=S[j];
if(S[j-1] ∈VT) j=j-1;
else j=j-2;
}while(S[j]>Q);
把S[j+1]…S[k]归约为某个N;
k=j+1;
S[k]=N;
}
if(S[j]<a || S[j]=a)
{ k=k+1;
S[k]=a;
}
}while(a!=’#’);
}