递归下降分析程序的设计和实现

article/2025/10/15 2:22:59

递归下降分析程序的设计和实现

一、实验的目的和要求
1、了解语法分析的主要任务。
2、实现基本的递归下降分析器,能够分析任意的符号串是否为该文法所定义的合法算术表达式。
二、实验环境
Windows7 + Dev-C++
三、实验准备
先将递归下降分析程序的生成认真的学习一遍,理解递归下降分析程序的构成过程。已知文法G[S]:S → aB | bDB → bCC → aS | bD | εD → aB | bD | ε
  1. 经观察此文法不含左公因式,也不含左递归,求出此文法的FIRST、FOLLOW以及SELECT集。
产生式FIRSTFOLLOWSELECT
S → aB{a}{#}{a}
S → bD{b}{b}
B → bC{b}{#}{b}
C → aS{a}{#}{a}
C → bD{b}{#}{b}
C → ε{ε}{#}
D → aB{a}{#}{a}
D → bD{b}{b}
D → ε{ε}{#}
  1. 因为S、B、C、D的SELECT集有交集且为空,所以此文法为LL(1)文法。

  2. 测试用例如下(文法推导所得,推导过程略):

    ab
    abb
    abaab
    ababbbbbbbbb
    bbbbbbbbbbbbbbbbbbbbbbbbbbb
    baaaaabbbb(错误用例)
    a##b#(错误用例)
    abcdefg(错误用例)
    ABCDEFG(错误用例)
    
四、实验内容及步骤

1. 用递归下降分析程序测试自己写的文法

#include<stdio.h>// 函数声明
void S(void);
void B(void);
void C(void);
void D(void);
// 定义一个长度为100的字符数组
char s[100];
// 用来作数组索引,当每次匹配成功存入数据时index自增1
int i;
//  用来标记语句是否正确
int SIGN;int main()
{printf("please input a yuju ends with #\n");// 一个死循环while( 1 ){SIGN = 0;//语句是否正确用SIGNi=0;// 类似Java中的Scanner,读取输入的字符串scanf("%s",&s[0]);// 当输入的第一个字符为#时,程序直接结束if( s[0] == '#')return 0;S();// 如果最后的字符以#结束则输出下面if(s[i] == '#' && SIGN == 0){printf("This is a right yuju!\n");}else{printf("This a wrong yuju\n");}printf("please input a yuju ends with #\n");}return 1;
}void S()
{if(SIGN==0){// 当输入的字符串中首字母为a时if(s[i]=='a'){++i;    // 自增操作B();}else if(s[i]=='b'){++i;D();}else{SIGN=1;}}
}void B()
{if(SIGN==0){if(s[i]=='b'){++i;C();}else if(s[i] == '#'){SIGN=1;}}
}void C()
{if(SIGN==0){if(s[i]=='a'){++i;S();}else if(s[i]=='b'){++i;D();}else if(s[i]!='#'){SIGN=1;}}
}void D()
{if(SIGN==0){if(s[i]=='a'){++i;B();}else if(s[i]=='b'){++i;D();}else if(s[i]!='#'){SIGN=1;}}
}

注: 此代码正好100行,不过可以看出代码质量很差(冗余代码很多),每个函数中的功能都是一样的,应该抽取一下,代码应该可以简洁很多。

2. 测试用例测试如下
在这里插入图片描述

五、实验小结

1. 遇到的主要问题
答:
刚开始测试测试用例时,根据文法推导的句子在程序中一直报错,首先我确定自己推导没有问题,又看了程序代码好像也没有问题,找了好久没有找到,最后使用Xcode(Mac平台下由apple公司维护用来开发iPhone程序和Mac程序的一款集成开发环境)打断点通过单步调试把问题找了出来,因为我把s[i] = ‘p’ 写成了s[i] = ‘P’ 将小写字母写成了大写。这就表现出调试程序的重要性,通过调试可以看计算机如何一步步来执行程序的,对程序有更好的理解。(附上一张调试图)
在这里插入图片描述
这是S函数,当我从控制台录入pba时,第一个字符p和s[i]相同,但是当程序执行直接从39行调到了45行,没有执行if(s[i] == ‘P’)语句,我才找到上面所说的错误!

3. 得到的经验
答:
①:C语言函数声明,这和Java以及其他编程语言不相同,当在main()函数中调用其他函数时,编译器会在main()函数上面找这些函数,如果函数没有声明就会编译报错(找不到),若将函数写在main()函数上,就不会报错。
②:首先更加清晰的理解了语法分析的主要任务,它是在词法分析的基础上将单词组合起来,组成一些语句,比如说在Java中,public static void main(String[]args);方法中,如果void写在public前面编译器就会报错,那是因为编译器已经做好了语法分析的工作,说白了对源代码在结构是否正确这就是语法分析的任务。
③:理解了递归下降分析法,它是一种自顶向下的分析,根据文法来构造C函数,遇到终结符时通过和自己在屏幕中录入的数据作比较,若相同修改数组索引,这个终结符后面若是一个非终结符则调用这个非终结符的函数。一层一层的向下分析,有时会在函数体中调用自己,这就形成了递归。


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

相关文章

利用递归下降分析方法完成语法分析

一、 程序设计题目与说明 利用递归下降分析方法完成语法分析。 递归下降分析法是一种自顶向下的分析方法&#xff0c;文法的每个非终结符对应一个递归过程&#xff08;函数&#xff09;。分析过程就是从文法开始符出发执行一组递归过程&#xff08;函数&#xff09;&#xff…

编译原理 --- 递归下降分析器

第一部分 --- 构造递归下降分析器 1.在上面这个例子中则是子程序序A先调用子程序B&#xff0c;本程序结束完调用之后再返回来继续调用下一个符号 如果下一个符号是终结符的话那就直接进行匹配&#xff0c;不进行调用&#xff0c;匹配完后继续调用下一个符号 如果不是的话则调…

递归下降分析法实现强化计算器

一. 实验概述 1.使用bison 和 flex 实现扩展版计算器 该计算器支持实型的两种表达,分别是小数和科学计数法. 该计算器支持 加, 减, 乘 除 四种运算 和括号()运算符. 该计算器支持整形,实型混合运算 2.通过递归下降分析法自行编写的语法分析和使用flex进行的词法分析的计算器.…

编译原理研究性学习专题 2——递归下降语法分析设计原理与实现

1 实验内容 完成以下描述赋值语句的 LL(1)文法的递归下降分析程序 G[S]: S→ VE E→ TE’ E’→ ATE’ | e T→ FT’ T’→ MFT’ | E F→ (E) | i A→ | - M→ * | / V→ i 设计说明&#xff1a;终结符号 i 为用户定义的简单变量&#xff0c;即标识符的定义。 2 实验要求 …

Python技法之简单递归下降Parser的实现方法

文章目录 一. 算术运算表达式求值二. 生成表达式树三、左递归和运算符优先级陷阱四. 相关包 一. 算术运算表达式求值 对于简单的算术运算表达式&#xff0c;假定我们已经用分词技术将其转化为输入的tokens流&#xff0c;如NUMNUM*NUM。 在此基础上&#xff0c;我们定义BNF规则…

编译实验 . 递归下降分析器

实验目的&#xff1a; 1.1掌握语法分析方法。 1.2掌握使用算符优先分析法。 1.3完成语法分析程序的设计和实现。 1.4程序能完成对指定语言的语法分析。 2. 递归下降分析器 在不含左递归和每个非终结符的所有候选终结首符集都两两不相交的条件下&#xff0c;我们就可能构造…

用c语言编译递归下降翻译器,Java实现C语言语义分析(递归下降)

说起这次的语义分析&#xff0c;不得不说的是我的重大的改变。上一次的语法分析是利用了预测分析法来实现的&#xff0c;经过多方考证&#xff0c;发现用预测分析法的语法分析器基础来实现语义分析的困难重重&#xff0c;例如在语法指导翻译的时候那个栈的变化和各种属性的传递…

递归下降分析法

介绍&#xff1a; 递归下降分析法是针对LL(1)文法的一种语法分析方法&#xff1b; 通过对文法的消除左递归&#xff0c;提取左公因子&#xff0c;对各个产生式和非终结符求first()和follow()集&#xff0c;通过first()和follow()集构造该文法的预测分析表&#xff0c;当这个预…

编译原理实验-递归下降语法分析

具体代码已放至Github&#xff08;仅供参考&#xff09;&#xff1a; qxpBlog/Compiler_UESTC: 电子科技大学编译原理实验 (github.com) 具体实验过程如下&#xff1a; 一、实验目的、原理、内容及步骤&#xff1a; &#xff08;1&#xff09;目的&#xff1a;通过本实验加深…

编译原理实验--实验二 递归下降法判断算术表达式的正确性--Python实现

目录 一、实验目的和要求 二、实验内容 三、实验环境 四、实验步骤 1、语法分析所依据的文法&#xff1b; 2、给出消除左递归及提取左公因子的文法&#xff1b; 五、测试要求 六、实验步骤 1、语法分析所依据的文法 2、给出消除左递归及提取左公因子的文法&#xff1…

递归下降语法分析

一、实验目的 递归下降语法分析 二、实验题目 三、分析与设计 四、源代码 #include <iostream> #include <fstream> #include <cstring> #include <string> #include <conio.h> #define digit 1 // 1数字 #define op 2 // -*/()# #define Hh …

Java递归下降分析器_递归下降语法分析器

用java语言编写的递归下降语法分析器&#xff0c;是一种适合手写语法编译器的方法&#xff0c;且非常简单。递归下降法对语言所用的文法有一些限制&#xff0c;但递归下降是现阶段主流的语法分析方法&#xff0c;因为它可以由开发人员高度控制&#xff0c;在提供错误信息方面也…

递归下降算法

递归下降算法 算法模型&#xff1a; Term Term Expr ExprExprFactor Factor 单个元素。最小单位。 实现原理&#xff1a; 一个程式进入算法及被看作是一个项&#xff0c;分解成项加表达式的形式&#xff0c;表达式被分解成 表达式加因子的形式&#xff0c;因子是这个算法…

实验二:递归下降语法分析

文章目录 一、实验目的二、实验原理与要求 1、原理 2、要求 三、实验设备四、实验内容五、实验步骤 1. 单词内码表 2. 定义语言文法 3. 语法分析器的实现&#xff08;编码&#xff09; 4. 测试 六、配套资源 一、实验目的 理解自顶向下语法分析的基本模式&#xff0c;熟悉…

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

编译原理递归下降语法分析器C简单实现 1.递归下降分析法的功能 语法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2.递归下降分析法的前提 改造文法&#xff1a;消除二义性、消除左递归、提取左因子&#xff0c;判断是否为LL&#xff08;1&#xff0…

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

背景&#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. 添加食物 …