编译原理:算符优先分析法
语法分析有自上而下(推导)和自下而上(归约)分析法两种,而算符优先分析法是自上而下分析法中的一种,应用也比较普遍,但是值得注意的是,其不是规范归约(最左归约)。
一般情况,算符优先分析法的流程如下:
求解FIRSTVT集和LASTVT集→构造优先关系矩阵→进行句型的“归约”操作。
下文所用文法如下:
E→E+T |T
T→T*F | F
F→(E) | i
FIRSTVT集和LASTVT集
这里我们需要与FIRST集和FOLLOW集合做一下区分:
(1)FIRST集和FOLLOW集:
①用于LL(1)文法的预测分析表构造
②FIRST集和FOLLOW集中均为终结符号集合,但是FOLLOW集中没有ε
(2)FIRSTVT集和LASTVT集:
①用于算符优先文法中的优先关系矩阵的构造
②FIRSTVT集和LASTVT集均为终结符号集合
FIRSTVT集
*定义+求法:
通过定义我们可以得出以下几点:
① U→b…,b进入FIRSTVT(U)
②U→V…,FIRSTVT(V)进入FIRSTVT(U)
③U→Vb…,b进入FIRSTVT(U)
(注意:U和V:非终结符号;b:终结符号)
- 例解
FIRSTVT(E)={+,* , ( , i }
FIRSTVT(T)={ * , ( , i }
FIRSTVT(F)={ ( , i }
LASTVT集
- 定义+求法:
通过定义我们可以得出以下几点:
①U->…a,a进入LASTVT(U)
②U->…V,LASTVT(V)进入LASTVT(U)
③U->…aV,a进入LASTVT(U)
(注意:U和V:非终结符号;a:终结符号)
- 例解
LASTVT(E)={+ , * , ) , i }
LASTVT(T)={ * , ) , i }
LASTVT(F)={ ) , i }
优先关系矩阵
如果要构造优先关系矩阵,我们需要明确两个相继出现的终结符号a和b之间的优先关系(a与b之间可有一个非终结符),一旦确定了这种优先关系,就可以用它来确定“可归约串”进行归约。
①a·>b(a的优先级高于b的优先级):当且仅当G中含有产生式:U→…Ub…,且任意的a∈LASTVT(U),a·>b成立。
②a<·b(a的优先级低于b的优先级):当且仅当G中含有产生式:U→…aU…,且任意的b∈FIRSTVT(U),a<·b成立。
③a=·b(a的优先级等于b的优先级):当且仅当G中含有产生式:U→…ab…或U→aVb…
NOTE:
①优先级高的先参加归约!
②优先关系不是对偶的,也就是说:a<·b≠b·>a
- 例解
归约
在算符优先分析法中采用的是归约最左素短语的方式进行归约。
预备知识
- 概念问题
(1)短语:一棵子树的所有叶子自左至右排列起来形成一个相对于子树根的短语。
(2)直接短语:仅有父子两代的一棵子树,其所有叶子自左至右排列起来所形成的符号串。
(3)句柄:一个句型的分析树中最左那棵只有父子两代的子树的所有叶子的自左至右排列。
(3)素短语:至少包含有一个终结符号,并且除它之外,不再包含其它素短语。
(4)最左素短语:任意句型最左边的素短语为该句型的最左素短语。
举例:
- 最左素短语的特征
(1)算符文法句型的一般形式:#N1a1N2a2……NnanNn+1# 其中,Ni∈VN, ai∈VT;
(2)定理:一个算符优先文法的句型的最左素短语是满足下列条件的最左子串:NjajNj+1aj+1……NiaiNi+1
其优先关系为:aj=.aj+1 ,aj+1=. aj+2, …, ai-1 =. ai;且:aj-1<.aj, ai >. ai+1
将子串左右邻接符号一起考虑:aj-1NjajNj+1aj+1……NiaiNi+1ai+1
它们的优先关系表示为:aj-1<.aj=. aj+1=. ……=.ai>.ai+1
则<.和>.之间用等号连接的部分(aj=. aj+1=. ……=.ai)即为最左素短语,可以进行归约。
注意:
Nj和Ni+1属于最左素短语,而aj-1和ai+1 不属于最左素短语。
- 例解
至此,算符优先分析已经完成。