编译原理递归下降语法分析器C++实现

article/2025/10/15 6:10:38

编译原理递归下降语法分析器C++简单实现

        1.递归下降分析法的功能

语法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。

        2.递归下降分析法的前提

改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法。

        3.递归下降分析法实验设计思想及算法

为G的每个非终结符号U构造一个递归过程,不妨命名为U。U的产生式的右边指出这个过程的代码结构:

(1)若是终结符号,则和向前看符号对照,若匹配则向前进一个符号;否则出错。

(2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现, 具体为:(1)对于每个非终结符号U->u1|u2|…|un处理的方法如下

                U( )

                {

                  ch=当前符号;

                                    if(ch可能是u1字的开头) 处理u1的程序部分;

                  else if(ch可能是u2字的开头)处理u2的程序部分;

                  …..

                  else error();

}

(2)对于每个右部u1->x1x2…xn的处理架构如下:

   处理x1的程序;

   处理x2的程序;

   ……

   处理xn的程序;

(3)如果非终结符U有空产生式:Uàε ,则还需考虑ch属于Follow(U)的情况。

引入对空串的非特殊分析

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
char str[10];
int index = 0;void E();  // E->TX;
void X();  // X->+TX|-TX|^
void T();  // T->FY
void Y();  // Y->*FY|/FY|^
void F();  // F->(E) | i
int count;
int m ,n;
int len;
void rank1(){printf("%d\t",count);count++;
}void analyze(){if(m<0)cout<<' ';else{for(int i = 0;i <= m;i++)cout<<str[i];}cout<<'\t'<<'\t'<<'\t';
}void latter(){printf("%c",str[index]);cout<<'\t'<<'\t'<<'\t';
}void remain(){for(int j = n+1;j <= len;j++)cout<<str[j];cout<<'\n';
}/*
文法G[E]:
E→E+T|E-T|T
T→T*F|T/F|F
F→(E)|i消除左递归后:
E→TX
X→+TX|-TX|^
T→FY
Y→*FY| /FY|^
F→(E)|i
*/int main() {count = 0;m = -1,n = -1;index = 0;printf("请输入算数表达式:");scanf("%s", str);len = strlen(str);str[len] = '#';printf("步骤\t 文法\t\t 分析串\t\t\t分析字符\t\t剩余串\n");E();if (str[index] == '#')printf("正确\n");elseprintf("分析失败\n");return 0;
}void E() {rank1();printf("E -> TX\t\t");analyze();latter();remain();T();X();
}void X() {if (str[index] == '+') {rank1(); printf("X ->+TX\t\t");m++;n++;analyze();latter();remain();index++;T();X();}else if (str[index] == '-') {rank1(); printf("X ->-TX\t\t");m++;n++;analyze();latter();remain();index++;T();X();}else{rank1();printf("X -> ^\t\t");analyze();latter();remain();}
}
void T() {rank1();printf("T -> FY\t\t");analyze();latter();remain();F();Y();
}
void Y() {if (str[index] == '*') {rank1();printf("Y ->*FY\t\t");m++;n++;analyze();latter();remain();index++;F();Y();}else if (str[index] == '/') {rank1();printf("Y ->/FY\t\t");m++;n++;analyze();latter();remain();index++;F();Y();}else{rank1();printf("Y -> ^\t\t");analyze();latter();remain();}
}
void F() {if (str[index] == 'i'){rank1();printf("F ->i\t\t");m++;n++;analyze();latter();remain();index++;}else if (str[index] == '('){rank1();printf("F ->(E)\t\t"); m++;n++;analyze();latter();remain();index++;E();if (str[index] == ')') {rank1();printf("F ->(E)\t\t");m++;n++;analyze();latter();remain();index++;}else {printf("分析失败\n");exit(0);}}else{printf("分析失败\n");exit(0);}
}

/*
文法G[E]:
E→E+T|E-T|T
T→T*F|T/F|F
F→(E)|i

消除左递归后:
E→TX
X→+TX|-TX|^
T→FY
Y→*FY| /FY|^
F→(E)|i
*/

 

 


http://chatgpt.dhexx.cn/article/T0ZZGYr6.shtml

相关文章

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

背景&#xff1a; 自定向下的语法分析方法&#xff0c;LL(1)是一种非常直观的方法&#xff0c;它的分析过程是按照句子的定义来进行的&#xff0c;也就是说从开始符出发对要分析的串进行推导&#xff0c;如果推导成功就证明这个被分析的串是一个合法的句子&#xff0c;否则的话…

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

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

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

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

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

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

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

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

java 贪吃蛇 源码+图片

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

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贪吃蛇小游戏源代码系列

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

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

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

java贪吃蛇源码

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

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

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

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

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

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

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

Java贪吃蛇全代码

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

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

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

Java贪吃蛇大作战

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

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

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

JAVA实现贪吃蛇游戏

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

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

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

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

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