11. 4.4.2 LL(1) 分析表的结构及构造方法
构造 LL ( 1 )分析表:
假定初始分析表 L [ A , a ]
是空白的,分析表元素 L [ A , a ]可按
下述规则确定:
(1) 对于文法中的每个产生式 A→α ,若
a∈ SELECT ( A→α ),则把 A→α 置于
L [ A , a ]中,其中 a 为终结符或#;
(2) 凡未定义的表元素 L [ A , a ]均标上出错标
志。为了使表简化,表中出错处用空白表示。 11
13. ( ) i + - * / #
E E→TE′ E→TE′
E′ E′→ε E′→ATE′ E′→ATE′ E′→ε
T T→FT′ T→FT′
T′ T′→ε T′→ε T′→ε T′→MFT′ T′→MFT′ T′→ε
F F→(E) F→i
A A→ + A→ -
M M→* M→/
13
14. LL ( 1 )分析表的构造算法
其中: n 是最大产生式编号;
i : A→α 表示第 i 个产生式是
A→α 。
i: = 1 ;
do
for i : A→α do
for 每个 a∈ SELECT ( i ) do
把 A→α 填入 L ( A , a )中;
i: = i + 1 ;
while (i≤n) ; 14
向其余空白 L ( A , a )中填入“出错码”;
17. 将′#′和文法开始符号依次入栈;
把字符串的第一个符号送给 a ;
do
弹出分析栈栈顶符号送给 X ;
if X = a then
将 X 从栈中弹出;
把字符串下一个符号送给 a ;
else if X∈ VN then
if L[X , a] 为 X→Y1Y2…Yk then
将 X 从栈中弹出;
将 Yk…Y2Y1 依次入栈;
else error ;
while(X≠′ #′ ) ;
17
if X = a =′#′ then 正确接收,分析
结束;
24. 函数 S :
if token in { a , f , g }
then
主函数: {
scan ; call A ;
call S ; match ( a );
call B ;
if token =′#′ then
}
accept
else if token in { d , e ,
else error ; b}
then
{
call B ;
match ( b ); 24
}
25. 函数 A :
if token =′ a′ 函数 B :
then if token =′ d′
then match ( d );
{ else if token =′ e′
match ( a ); then match ( e );
call D ; else if token in { b ,#
} }
else if token in { f , g } then return ;
then call D ; else error ;
else error ;
25
26. 函数 D :
if token =′ f′
then
{
match ( f );
call D ;
}
else if token =′ g′
then match ( g );
else error ;
26