1) 编写文法、消除二义性
2) 消除左递归和提取左因子
改写文法
3) 求非终结符的 FIRST 集和 FOLLOW 集
4) 检查是不是 LL(1) 文法
若不是 LL(1),说明文法的复杂性超过自顶向下方法的分析能力
5) 将 LL(1) 文法改写为 EBNF, 并化简
E → T E'
E'→ + T E'|ε
T → F T'
T'→ * F T'|ε
F → ( E )|id
文法改为 EBNF
E → T E'
E' → { + T }
T → F T'
T' → { * F }
F → ( E )|id
化简为
E → T { + T }
T → F { * F }
F → ( E )|id
6) 按照 EBNF 编制语法图,并化简 (评:本步感觉并不需要,根据EBNF编写子程序更直观)
7) 按照语法图,编写程序算法( 第6步不需要,根据EBNF编写子程序更直观)
为每个非终结符设置一个子程序,按照语法图编写控制结构:
按照 FIRST 集识别,如果后面非终结符可导出为空,加上该非终结符的follow集
procedure exp;
begin
term; T的过程调用
while lookhead='+' do
begin 当前符号等于+时
match(‘+’); 处理终结符+
term T的过程调用
end
end; lookhead:当前符号
procedure term;
begin
factor; F的过程调用
while lookhead='*' then
begin 当前符号等于*时
match('*'); 处理终结符*
factor F的递归调用
end
end;
procedure factor;
begin
if lookhead='(' then
begin 当前符号等于(
match('('); 处理终结符(
exp; E的递归调用
match(')'); 处理终结符)
end
else if lookhead=ID then
match(ID) 处理终结符ID
else error 出错处理
end
主程序
begin
lookhead:=nexttoken; 调词法分析程序
exp E的过程调用
end
procedure match( t:token );
begin
if lookhead=t then
lookhead := nexttoken
else error; 出错处理程序
end;