预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共18页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

编译原理语法分析递归下降子程序实验报告-- 编译原理语法分析递归下降子程序实验 报告 编译课程设计-递归下降语法分析 课程名称编译原理 设计题目递归下降语法分析 一、设计目的 通过设计、编制、调试一个具体的 语法分析程序,加深对 语法分析原理的理解,加深对语法 及语义分析原理的理解,并实现对文法 的判断,是算符优先文法的对其进行 FirstVT集及LastVT集的分析,并对输入 的字符串进行规约输出规约结果成功或 失败。 二、设计内容及步骤 内容:在C++6.0中编写程序代码实 现语法分析功能,调试得到相应文法的 判断结果:是算符优先或不是。若是, 则输出各非终结符的FirstVT与LastVT集 的结果,还可进行字符串的规约,输出 详细的规约步骤,程序自动判别规约成 功与失败。 步骤:1.看书,找资料,了解语法分 编译原理语法分析递归下降子程序实验报告-- 编译原理语法分析递归下降子程序实验报告-- 析器的工作过程与原理 2.分析题目,列出基本的设计思路 1定义栈,进栈,出栈函数○ 2栈为空时的处理○ 3构造函数判断文法是否是算符文 法,算符优先文法○ 4构造FirstVT和LastVT函数对文法 的非终结符进行分析○ 5是算符优先文法时,构造函数对其 可以进行输入待规约○ 串,输出规约结果 ○6构造主函数,对过程进行分析 3.上机实践编码,将设计的思路转换 成C++语言编码,编译运 行 4.测试,输入不同的文法,观察运行 结果 详细的算法描述 详细设计伪代码如下: 首先要声明变量,然后定义各个函 数 1.voidInitstack(charstack&s) {//定义栈 s.base=newcharLode[20]; s.top=-1;} 编译原理语法分析递归下降子程序实验报告-- 编译原理语法分析递归下降子程序实验报告-- 2.voidpush(charstack &s,charLodew) {//字符进栈 s.top++; s.base[s.top].E=w.E; s.base[s.top].e=w.e; } 3.voidpop(charstack &s,charLode&w) {//字符出栈 w.E=s.base[s.top].E;三、 w.e=s.base[s.top].e; s.top--; } 4.intIsEmpty(charstacks) {//判断栈是否为空 if(s.top==-1) return1; elsereturn0; } 5.intIsLetter(charch) {//判断是否为非终结符 if(ch='A'&&ch= 'Z') return1; 编译原理语法分析递归下降子程序实验报告-- 编译原理语法分析递归下降子程序实验报告-- elsereturn0; } 6.intjudge1(intn) {//judge1是判断是否是算符文法: 若产生式中含有两个相继的 非终结符则不是算符文法 } 7.voidjudge2(intn) {//judge2是判断文法G是否为算符 优先文法:若不是算符文法或 若文法中含空字或终结符的优先级 不唯一则不是算符优先文法 8.intsearch1(charr[],intkk,chara) {//search1是查看存放终结符的数 组r中是否含有重复的终结符} 9.voidcreateF(intn) {//createF函数是用F数组存放每个 终结符与非终结符和组合, 并且值每队的标志位为0;F数组是 一个结构体} 10.voidsearch(charLodew) {//search函数是将在F数组中寻找 到的终结符与非终结符对的 标志位值为1} 分情况讨论://产生式的后选式的第 编译原理语法分析递归下降子程序实验报告-- 编译原理语法分析递归下降子程序实验报告-- 一个字符就是终结符的情况 //产生式的后选式的第一个字符是 非终结符的情况 11.voidLastVT(intn) {//求LastVT } 12.voidFirstVT(intn) {//求FirstVT } 13.voidcreateYXB(intn) {//构造优先表 分情况讨论://优先级等于的情况, 用1值表示等于} //优先级小于的情况,用2值表示小 于 //优先级大于的情况,用3值表示大 于 } 14.intjudge3(chars,chara) {//judge3是用来返回在归约过程中 两个非终结符相比较的值 } 15.voidprint(chars[],char STR[][20],intq,intu,intii,intk) {//打印归约的过程