编译原理(九)——递归下降法

article/2025/10/15 6:24:37

背景:

  1. 自定向下的语法分析方法,LL(1)是一种非常直观的方法,它的分析过程是按照句子的定义来进行的,也就是说从开始符出发对要分析的串进行推导,如果推导成功就证明这个被分析的串是一个合法的句子,否则的话就有语法错误,但是在推导过程中,对文法进行了一些限定,保证推导过程是唯一的 。
  2. 总体上说,LL(1)就是在选择规则的时候加入了约束条件,考虑到输入流中的第一个符号,以及推导过程中的非终极符的规则选择,只有当头符属于当前Vn为左部的某条规则的Predict 集的时候,才使用该规则进行推导,否则即错。对规则的限定就是说规则要唯一,所以P集交集为空。
  3. 构造语法分析器的方法也很简单,分成输入流、分析栈、LL(1)分析表、驱动程序四个部分,构造表的目的是提高分析器的效率,驱动程序中的动作无非4个——替换、查找、成功、失败。这样就把结构用程序描述出来了,得到语法分析器。

递归下降法是另一种自顶向下的语法分析方法

一、递归下降法的基本原理

在这里插入图片描述
先不考虑左递归的问题,在定义语法分析程序的时候,每一个非终极符都定义成一个过程或者函数:

  1. 每棵子树都是以根节点的非终极符推导出来的短语
  2. 可以考虑每个非终极符构造一个函数,去匹配子树的叶节点
    从树中即可看出,加入每一个非终极符都定义成一个过程或者是函数,选择一个规则的时候就让它和规则的右边进行匹配,遇到终极符就可能直接匹配上了,遇到非终极符还是要调用该非终极符所对应的过程或者是函数

对文法的要求:在这里插入图片描述

实际上这里就是一个条件:交集为空,因为含有直接左递归的文法一定不满足第二个条件,间接左递归也不行。

二、语法分析程序的构造

在这里插入图片描述
程序中有一个全局变量token,用来存储输入流的第一个语法符号,分析的时候需要一个一个往里读,token保存当前字符串的第一个字符;遇到非终极符的时候有一个匹配的动作即Match(a),如果满足Match后面的函数的内容可以读取下一个语法符号了。

非终极符的过程或者函数的写法:

在这里插入图片描述

在这里插入图片描述


子程序构造方法:

在这里插入图片描述

  1. 同一个非终极符推导出来的规则写在一个函数中,每个规则的Predict集作为if条件判断中的布尔表达式的一部分(这里也体现了第二条规则的满足,即没有交集);
  2. 对于终极符,直接执行Match部分
  3. 如果当前的X属于空集,则当前执行的语句是空语句

主程序构造方法:

  1. 执行ReadToken();把字符串读入
  2. 执行开始符对应的子程序
  3. 进行终止判断(就是#部分的判断)

在这里插入图片描述


整体的问题解决方法

在这里插入图片描述

相关例题:

在这里插入图片描述
函数部分:

E(){
if token ∈ {i,(}
then{T();E'();
}
}E'(){
if token ∈ {+}
then{match(+);T();E'();
}
if token ∈ {#,)}
then skip;
}T(){
if token ∈ {i,(}
then {
F();
T'();
}
}T'(){
if token ∈ {*}
then {
match(*);
F();
T'();
}
if token ∈ {+,#,)}
then skip;
}F(){
if token ∈ {(}
then{
match('(');
E();
match(')');
}
if token ∈ {i}
then match(i);
}main(){
ReadToken();
E();
if(token=='#')return true;
elsereturn false;
}

相应语法🌲分析部分:

在这里插入图片描述

在这里插入图片描述
子函数部分:

Predict(Z->aBa) :{a}
Predict(B->bB) :{b}
Predict(B->c) :{c}
B没有交集 👌Z(){
if token ∈ {a}
then{
match(a);
B();
match(a);
}B(){
if token ∈ {b}
then{
match(b);
B();
}
if token ∈ {c}
then{
match(c);
}
}main(){ReadToken();Z();if token == '#'then return true;else return false;
}

在这里插入图片描述

三、编译程序的自动生成

在这里插入图片描述
每个函数的写法规则是唯一的 ,但是文法规则是灵活的,使用固定的规则实现可变的文法。


http://chatgpt.dhexx.cn/article/8Uwmj0cr.shtml

相关文章

【编译原理】【C语言】实验三:递归下降分析法

C语言 实验环境:Visual Studio 2019 author:zoxiii 递归下降分析法 1、实验内容2、前期准备2.1 递归下降分析法原理2.2 要实现的文法2.3 需要的函数 3、分析过程3.1 递归下降分析法设计思想及算法3.2 分析栈的分析过程3.3 流程图3.4 源代码3.5 运行结果 …

JAVA游戏开发-超炫酷贪吃蛇游戏源码及教程

一.前言 某日,看见隔壁家的小朋友在玩一款网络爆款贪吃蛇游戏,感觉很好玩。自己刚好正在学习JAVA编程,也想实现一个类似功能的游戏Demo练手,在网上查看了不少源码案例,全都是很古老的方块式贪吃蛇游戏案例…

Java实现贪吃蛇游戏【代码】

Java实现贪吃蛇游戏【代码】 花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了。作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣。世间万物斗转星移,诺基亚曾经作为手…

JavaSE项目 | 纯Java实现贪吃蛇小游戏

目录 一:贪吃蛇游戏的实现步骤 1. 画出窗口 2. 在窗口上添加画布 3. 在画布上添加黑色游戏区 4. 放静态蛇 5. 定义蛇的数据结构 6. 控制蛇头方向 7. 放上开始提示信息 8. 按空格键开始游戏 9. 让蛇动起来 10. 实现暂停 11. 实现转向功能 12. 添加食物 …

java 贪吃蛇 源码+图片

本人也是个初学者,有什么不对的地方,请大佬指点!!! 一、涉及到的知识点如下: 循环,分支方法的抽取数组的使用面向对象继承,子类方法的重写接口,接口的实现 二、游戏图形…

JAVA贪吃蛇代码(带注释)

贪吃蛇 这是游戏效果图片是代码里面的素材游戏数据类 package com.tang.retor_snaker;import javax.swing.*; import java.net.URL;public class Data {private static URL bodyURL Data.class.getResource("/com/tang/retor_snaker/statics/body.png");private st…

JAVA贪吃蛇小游戏源代码系列

欢迎关注公众号: 获取贪吃蛇小游戏的源代码。 贪吃蛇小游戏运行结果如下: 启动界面: 运行界面: 重启界面: 源代码框架如下: 注:在运行程序的时候,得重新设计窗体的大小&#x…

JAVA 实现《贪吃蛇大作战》游戏|CSDN创作打卡

前言 贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃东西,从而使得蛇变得越来越长。 本程序是通过java的swing来实现《贪吃蛇大作战》这款游戏。 主要需求 1…

java贪吃蛇源码

欢迎访问我的个人博客 https://jialaner.cn/​​​​​​​ java是一种面向对象的语言,有着其中不用质疑的优点。学习java将近三个月了,一直在琢磨着“万物皆对象”的意义,却总是只知其表不知其意,做完这个java贪吃蛇后才有了那么…

贪吃蛇 java实现超简单的贪吃蛇(附源代码)

贪吃蛇游戏 贪吃蛇是个非常经典的游戏,希望对初学Java的小伙伴有一定帮助。希望大家喜欢,因为写得简单,希望大家都能看得懂。 游戏界面(游戏背景素材不喜欢的话可以自己换,就别在乎我选的素材(&#x1f9…

java实现贪吃蛇小游戏(源码+注释)

一.工程文件 二.Main.java package com.company;import javax.swing.*;public class Main {public static void main(String[] args) {//创建窗体对象JFrame frame new JFrame();//创建窗体参数()frame.setBounds(10,10,900,720);//设置不允许更改大小…

使用Java实现一个简单的贪吃蛇小游戏

基于java实现贪吃蛇小游戏,主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 开发工具:eclipse java工具包:jdk1.8 一、创建新项目 创建一个新的项目,并命名。创建一个名为images的文件夹用来存放游戏相关图片…

Java贪吃蛇全代码

用Java编写精典小游戏——贪吃蛇! 前言 我想贪吃蛇应该是不少90后和00后的童年(我本人是01年的),回想起从前偷偷拿着我爹的诺基亚在被窝里玩贪吃蛇,不禁感慨万分,时间飞逝,没想到10年后的我也可…

JAVA小项目(四)—— 贪吃蛇【轻松入门,附源码】

目录 (一)效果图 (二)代码实现 (1)将图片加载到程序中 (2)创建窗体 (3)创建面板 (4)绘制静态的小蛇 (5) 加入监…

Java贪吃蛇大作战

作为Java新手小白,渴望学习一些好玩有趣的java程序 废话不多说,接下来我会一步一步实现java小程序:贪吃蛇大作战哦! 实现 Java贪吃蛇一共分四个步骤: 1、画出窗体对象 2、绘制静态ui 3、使用鼠标监听器事件和定时器事…

Java简易小游戏贪吃蛇(Java实战)

这个版本的贪吃蛇我是跟着“黑马程序员”写的。小伙伴们可以跟着视频试着做一下,同时视频也会更详细。 B站学习链接:【黑马】两个小时带你用Java语言写一个贪吃蛇游戏【配套源码笔记】_哔哩哔哩_bilibili 相对于新手而言,贪吃蛇应该算是一个…

JAVA实现贪吃蛇游戏

本文实现的功能有: 1.绘制静态窗口 2.绘制游戏面板 3.绘制静态小蛇 4.通过键盘控制小蛇移动 5.吃食物 6.积分系统和失败判定 最近在学GUI,然后又有读者希望我写一下相关的实战。刚好博主在b站漫无目的的寻找着题材的时候看到了一个写贪吃蛇游戏的视频,于…

Java实现贪吃蛇大作战小游戏(完整版)

大家好,今天尝试用swing技术写一个贪吃蛇大作战小游戏,供大家参考。 效果展示 目录 效果展示 一、游戏界面 二、得分情况 项目介绍 项目背景 总体需求 实现过程 代码展示 主类 :Demo类 MyPanel类 ①构造方法 ②初始化方法 ③绘制方法…

用java写一个贪吃蛇小游戏(源码在最后)

一、引入 涉及技能: 循环、分支方法的抽取数组的使用面向对象继承,子类方法的重写接口,接口的实现GUI(图像化界面编程) GUI中的组件: 7.1 窗口 7.2 弹窗 7.3 面板 7.4 文本框 7.5 列表框 7.6 按钮 7.7 图…

安卓蓝牙开发总结(一)—蓝牙开启与关闭

蓝牙开启与关闭 1、引言2、布局文件3、蓝牙打开与关闭  3.1 通过对按钮监听方法  3.2 通过设置点击事件 4、结果展示及总结5、参考链接 1、引言 最近在学习如何在安卓手机上对蓝牙进行操控,作为初学者发现大多数博客对安卓开发的初学者极为不友好,特…