当前位置: 首页 > java >正文

【编译原理】递归下降分析程序的构造

当一个文法满足LL(1)条件(L自左向右扫描输入串,L分析过程采用最左推导,1只需向右看一个符号)时,我们就可以为它构造一个不带回溯的自上而下分析程序(递归过程,每个过程对应文法的一个非终结符)

advance是指把输入串指示器IP调至下一个输入符号

sym是指IP当前所指的那个输入符号

error为出错诊察处理程序

E\rightarrow TE' \\ E'\rightarrow +TE'|\varepsilon \\ T\rightarrow FT' \\ T'\rightarrow *FT'|\varepsilon \\ F\rightarrow (E)|i

E\rightarrow TE'

procedure E;
beginT;E'
end

E'\rightarrow +TE'|\varepsilon

procedure E'
if sym='+' then
beginadvance;T;E'
end

T\rightarrow FT'

procedure T
beginF;T'
end

T'\rightarrow *FT'|\varepsilon

procedure T'
if sym='*' then
beginadvance;F;T'
end

F\rightarrow (E)|i

procedure F
if sym='i' then advance
else if sym='(' thenbeginadvance;E;if sym=')' then advanceelse errorendelse error;

S\rightarrow a|\wedge |(T) \\ T\rightarrow ST' \\ T'\rightarrow ,ST'|\varepsilon

不带回溯的递归子程序

procedure S;

begin

        if sym='a' or sym='^'

                then advance

        else if sym='('

                then begin

                        advance;

                        T;

                        if sym=')' then advance;

                        else error;

        else error

end

procedure T;

begin

        S;

        T';

end

procedure T';

begin

        if sym=','

                then begin

                        advance;

                        S;

                        T';

                end

end

E\rightarrow TE' \\ E'\rightarrow +E|\varepsilon \\ T\rightarrow FT' \\ T'\rightarrow T|\varepsilon \\ F\rightarrow PF' \\ F'\rightarrow *F'|\varepsilon \\ P\rightarrow (E)|a|b|\wedge

递归下降分析程序

(更精确,判断该输入符号是否属于FOLLOW)

procedure E;beginif sym='(' or sym='a' or sym='b' or sym='^' //FIST(E)then begin T; E' endelse errorend
procedure E';
beginif sym='+'                                 //FIRST(E') 有εthen begin advance; 		E;
endelse if sym<>')' and sym<>'#' then error  //FOLLOW(E')
endprocedure T;
beginif sym='(' or sym='a' or sym='b' or sym='^'   //FIRST(T)then begin F; T' endelse error
end	procedure T';
beginif sym='(' or sym='a' or sym='b' or sym='^'  //FIRST(T) 有εthen T else if sym='*' then error                //??
endprocedure F;
beginif sym='(' or sym='a' or sym='b' or sym='^'  //FIRST(F)then begin P; F' endelse error
end	procedure F';
beginif sym='*' then begin advance; F' end
endprocedure P;
beginif sym='a' or sym='b' or sym='^'     //FIST(P)then advanceelse if sym='(' thenbeginadvance; E;if sym=')' then advanceelse errorendelse error
end;

 

http://www.xdnf.cn/news/6630.html

相关文章:

  • 排序算法之高效排序:快速排序,归并排序,堆排序详解
  • 实例分割AI数据标注 ISAT自动标注工具使用方法
  • 如何在win11上 运行arm虚拟机
  • labelimg安装及使用指南(yolo)
  • VR场景制作如何完成?
  • 图像处理:预览并绘制图像细节
  • 汽车二自由度系统模型以及电动助力转向系统模型
  • LearnOpenGL --- 你好三角形
  • Android native崩溃问题分析
  • Python基础:集合(Set)
  • Python字符串常用方法详解
  • Flink运维要点
  • C++(17):引用传参
  • 从关键字执行机制入手理解 Robot Framework 源码
  • 【Opencv】canny边缘检测提取中心坐标
  • 2025第三届盘古初赛(计算机部分)
  • 中天智能装备有限公司在柔性立库设备方面有哪些产品?
  • vue复杂数据类型多层嵌套的监听
  • Python之三大基本库——Matplotlib
  • 基于 React Hook 封装 Store 的三种方案
  • 嵌入式故障码管理系统设计实现
  • 问题 | 国内外软件定义卫星最新进展研究
  • MySQL 高可用
  • DevExpressWinForms-RichEditControl-基础应用
  • 若依框架SpringBoot从Mysql替换集成人大金仓(KingBase)数据库
  • 【linux unbind 设备驱动】
  • API 加速方案:如何使用 Redis 与 Memcached 进行高效缓存优化
  • SpringBoot常用注解详解
  • 【蓝桥杯省赛真题50】python字母比较 第十五届蓝桥杯青少组Python编程省赛真题解析
  • ubuntu22鼠键失灵恢复记录笔记chatgpt解决