递归下降子程序法

本文详细介绍了一种文法从编写到程序实现的全过程,包括文法的编写、消除二义性和左递归、提取左因子,求FIRST/FOLLOW集,检查LL(1)文法,文法的EBNF形式化及简化,最终根据EBNF编写程序算法。
摘要由CSDN通过智能技术生成

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值