FOR循环语句的翻译程序设计(递归下降法、输出四元式表示)
python for的循环语句
循环语句在编程中扮演着非常重要的角色,它使得程序可以重复执行一段特定的代码。
Python是一种流行的编程语言,它提供了多种循环语句来满足不同的需求。
本文将介绍Python中的for循环语句,包括其基本语法、常见应用场景以及一些注意事项。
一、基本语法在Python中,for循环用于遍历可迭代对象(例如列表、元组、字符串等)中的元素。
其基本语法如下所示:```pythonfor 变量 in 可迭代对象:执行语句```其中,"变量"用于存储可迭代对象中的每一个元素,而"可迭代对象"则是要进行遍历的数据集合。
在每一次循环中,程序都会将可迭代对象中的下一个元素赋值给变量,并执行所需的代码。
二、常见应用场景1. 遍历列表元素```pythonfruits = ["apple", "banana", "cherry"] for fruit in fruits:print(fruit)```2. 遍历字符串中的字符```pythonfor char in "Python":print(char)```3. 遍历指定范围的数字```pythonfor i in range(1, 5):print(i)```4. 遍历字典的键值对```pythonperson = {"name": "Alice", "age": 25, "gender": "female"}for key, value in person.items():print(f"{key}: {value}")```5. 嵌套循环```pythonfor i in range(3):for j in range(2):print(f"({i}, {j})")```三、注意事项1. 注意缩进:在Python中,循环体内的代码块必须缩进,通常为4个空格或一个制表符。
编译原理报告for循环语句的翻译程序
学号:0120810680326课程设计题目f or循环语句的翻译程序学院计算机学院专业软件工程班级0803姓名徐泽前指导教师何九周2011 年 6 月日目录1设计目的 (4)2设计环境与工具 (4)3设计任务要求与说明 (4)4设计时间 (4)5设计地点 (4)6系统描述 (4)7文法及属性文法的描述 (5)7.1文法描述 (5)7.1.1 FOR语句相关的产生式: (5)7.1.2 布尔表达式: (5)7.1.3 赋值表达式: (5)7.2属性文法的描述 (5)8 语法分析方法描述及语法分析表设计 (7)8.1语法分析方法描述 (7)8.2系统中使用的action和goto表(见附录1) (9)9 给出中间代码形式的描述及中间代码序列的结构设计 (9)10简要的分析与概要设计 (10)11 详细的算法描述 (11)11.1词法分析的数据结构设计与详细的流程图 (11)11.2词法分析流程图 (11)11.3语法制导翻译的数据结构与详细的设计图 (12)11.3.1数据结构的设计 (12)11.3.2算法描述 (13)11.3.3程序流程图 (13)12给出软件的测试方法和测试结果 (14)12.1 FOR循环语句的测试 (14)12.2词法分析出错处理 (15)12.3语法分析出错处理 (16)13收获与体会 (16)14 参考文献 (17)课程设计任务书学生姓名:徐泽前专业班级:软件0803班指导教师:何九周工作单位:计算机学院题目: for循环语句的翻译程序初始条件:程序设计语言:主要使用C语言的开发工具,或者采用LEX、YACC等工具,也可利用其他熟悉的开发工具。
算法:可以根据《编译原理》课程所讲授的算法进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,说明书撰写等具体要求)1.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
控制语句的翻译四元式例题及答案
控制语句的翻译四元式例题及答案
1. 例题:if语句
高级语言代码:
python
if x > 5:
y = x + 10
else:
y = x - 10
翻译四元式:
1: if x > 5 goto 4
2: y = x + 10
3: goto 5
4: y = x - 10
5: (end if)
答案解析:
- 第1行表示条件判断,如果x大于5,则跳转到第4行执行。
- 第2行为if语句为真时的语句,将x加10赋值给y。
- 第3行为跳转到if语句结束位置的标记。
- 第4行为if语句为假时的语句,将x减10赋值给y。
- 第5行为if语句结束位置的标记。
2. 例题:while循环语句
高级语言代码:
python
while x > 0:
y = y + x
x = x - 1
翻译四元式:
1: (start while)
2: if x > 0 goto 4
3: goto 5
4: y = y + x
5: x = x - 1
6: goto 2
7: (end while)
答案解析:
- 第1行为while循环的起始位置。
- 第2行为条件判断,如果x大于0,则跳转到第4行执行循环体内的语句。
- 第3行为否则跳转到while循环结束位置的标记。
- 第4行为循环体内的语句,将y加上x的值。
- 第5行为循环体内的语句,将x减1。
- 第6行为跳转回while循环起始位置的标记。
- 第7行为while循环结束位置的标记。
编译原理语义分析实验报告
实验3 语义分析实验报告一、实验目的二、通过上机实习, 加深对语法制导翻译原理的理解, 掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。
三、实验要求四、采用递归下降语法制导翻译法, 对算术表达式、赋值语句进行语义分析并生成四元式序列。
五、算法思想1.设置语义过程。
(1)emit(char *result,char *ag1,char *op,char *ag2)该函数的功能是生成一个三地址语句送到四元式表中。
四元式表的结构如下:struct{ char result[8];char ag1[8];char op[8];char ag2[8];}quad[20];(2) char *newtemp()该函数回送一个新的临时变量名, 临时变量名产生的顺序为T1, T2, …char *newtemp(void){ char *p;char m[8];p=(char *)malloc(8);k++;itoa(k,m,10);strcpy(p+1,m);p[0]=’t’;return(p);}六、 2.函数lrparser 在原来语法分析的基础上插入相应的语义动作: 将输入串翻译成四元式序列。
在实验中我们只对表达式、赋值语句进行翻译。
源程序代码:#include<stdio.h>#include<string.h>#include<iostream.h>#include<stdlib.h>struct{char result[12];char ag1[12];char op[12];char ag2[12];}quad;char prog[80],token[12];char ch;int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针, m是token的指针char *rwtab[6]={"begin","if","then","while","do","end"};void scaner();char *factor(void);char *term(void);char *expression(void);int yucu();void emit(char *result,char *ag1,char *op,char *ag2);char *newtemp();int statement();int k=0;void emit(char *result,char *ag1,char *op,char *ag2){strcpy(quad.result,result);strcpy(quad.ag1,ag1);strcpy(quad.op,op);strcpy(quad.ag2,ag2);cout<<quad.result<<"="<<quad.ag1<<quad.op<<quad.ag2<<endl;}char *newtemp(){char *p;char m[12];p=(char *)malloc(12);k++;itoa(k,m,10);strcpy(p+1,m);p[0]='t';return (p);}void scaner(){for(n=0;n<8;n++) token[n]=NULL;ch=prog[p++];while(ch==' '){ch=prog[p];p++;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){m=0;while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){token[m++]=ch;ch=prog[p++];}token[m++]='\0';p--;syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>='0'&&ch<='9')){{sum=0;while((ch>='0'&&ch<='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}else switch(ch){case'<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='>'){syn=21;token[m++]=ch;}else if(ch=='='){syn=22;token[m++]=ch;}else{syn=23;p--;}break;case'>':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=24;token[m++]=ch;}else{syn=20;p--;}break;case':':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=18;token[m++]=ch;}else{syn=17;p--;}break;case'*':syn=13;token[0]=ch;break; case'/':syn=14;token[0]=ch;break; case'+':syn=15;token[0]=ch;break; case'-':syn=16;token[0]=ch;break; case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; default: syn=-1;break;}}int lrparser(){//cout<<"调用lrparser"<<endl;int schain=0;kk=0;if(syn==1){scaner();schain=yucu();if(syn==6){scaner();if(syn==0 && (kk==0))cout<<"success!"<<endl;}else{if(kk!=1)cout<<"缺end!"<<endl;kk=1;}}else{cout<<"缺begin!"<<endl;kk=1;}return(schain);}int yucu(){// cout<<"调用yucu"<<endl;int schain=0;schain=statement();while(syn==26){scaner();schain=statement();}return(schain);}int statement(){//cout<<"调用statement"<<endl;char *eplace,*tt;eplace=(char *)malloc(12);tt=(char *)malloc(12);int schain=0;switch(syn){case 10:strcpy(tt,token);scaner();if(syn==18){scaner();strcpy(eplace,expression());emit(tt,eplace,"","");schain=0;}else{cout<<"缺少赋值符!"<<endl;kk=1;}return(schain);break;}return(schain);}char *expression(void){char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt =(char *)malloc(12);strcpy(eplace,term ()); //调用term分析产生表达式计算的第一项eplacewhile((syn==15)||(syn==16)){if(syn==15)strcpy(tt,"+");else strcpy(tt,"-");scaner();strcpy(ep2,term()); //调用term分析产生表达式计算的第二项ep2strcpy(tp,newtemp()); //调用newtemp产生临时变量tp存储计算结果emit(tp,eplace,tt,ep2); //生成四元式送入四元式表strcpy(eplace,tp);}return(eplace);}char *term(void){// cout<<"调用term"<<endl;char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)malloc(12);strcpy(eplace,factor());while((syn==13)||(syn==14)){if(syn==13)strcpy(tt,"*");else strcpy(tt,"/");scaner();strcpy(ep2,factor()); //调用factor分析产生表达式计算的第二项ep2strcpy(tp,newtemp()); //调用newtemp产生临时变量tp存储计算结果emit(tp,eplace,tt,ep2); //生成四元式送入四元式表strcpy(eplace,tp);}return(eplace);}char *factor(void){char *fplace;fplace=(char *)malloc(12);strcpy(fplace,"");if(syn==10){strcpy(fplace,token); //将标识符token的值赋给fplacescaner();}else if(syn==11){itoa(sum,fplace,10);scaner();}else if(syn==27){scaner();fplace=expression(); //调用expression分析返回表达式的值if(syn==28)scaner();else{cout<<"缺)错误!"<<endl;kk=1;}}else{cout<<"缺(错误!"<<endl;kk=1;}return(fplace);}void main(){p=0;cout<<"**********语义分析程序**********"<<endl;cout<<"Please input string:"<<endl;do{cin.get(ch);prog[p++]=ch;}while(ch!='#');p=0;scaner();lrparser();}七、结果验证1、给定源程序begin a:=2+3*4; x:=(a+b)/c end#输出结果2、源程序begin a:=9; x:=2*3-1; b:=(a+x)/2 end#输出结果八、收获(体会)与建议通过此次实验, 让我了解到如何设计、编制并调试语义分析程序, 加深了对语法制导翻译原理的理解, 掌握了将语法分析所识别的语法成分变换为中间代码的语义翻译方法。
2021年WHILE循环语句的翻译程序设计(递归下降法,输出四元式)之令狐采学创编
课内实践报告课程名称编译原理设计题目WHILE循环语句的翻译程序设计(递归下降法,输出四元式)学院计算机科学与技术专业班级计算机1203班姓名闵丹枫指导教师林泓*欧阳光明*创编 2021.03.07课程设计任务书学生姓名:闵丹枫专业班级:计算机1203班指导教师:林泓工作单位:计算机科学与技术学院题目: WHILE循环语句的翻译程序设计(递归下降法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。
时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 9月 1日系主任(或责任教师)签名:月日WHILE循环语句的翻译程序设计(递归下降法、输出四元式)一.系统描述1.1问题描述设计一个WHILE〈布尔表达式〉DO〈赋值语句〉循环语句的词法﹑语法及语义分析程序,语法分析选择递归下降法,采用用语法制导翻译输出中间代码四元式。
编译原理课后习题答案
第一章1.典型的编译程序在逻辑功能上由哪几部分组成答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。
2. 实现编译程序的主要方法有哪些答:主要有:转换法、移植法、自展法、自动生成法。
3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式答:编译法、解释法。
4. 编译方式和解释方式的根本区别是什么答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快;解释方式:在执行时,必须源程序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。
、第二章1.乔姆斯基文法体系中将文法分为哪几类文法的分类同程序设计语言的设计与实现关系如何答:1)0型文法、1型文法、2型文法、3型文法。
2)2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。
答:Z SME | B{S1|2|3|4|5|6|7|8|9M | D | MDD0|SB2|4|6|8E0|B3. 设文法G为:N D|NDD 0|1|2|3|4|5|6|7|8|9请给出句子123、301和75431的最右推导和最左推导。
答:N ND N3ND3N23D23123%N ND NDD DDD1DD12D123N ND N1ND1N01D01301N ND NDD DDD3DD30D301N ND N1ND1N31ND31N431ND431N5431D543175431N ND NDD NDDD NDDDD DDDDD7DDDD75DDD754DD7543D75431 4. 证明文法S iSeS|iS| i是二义性文法。
答:对于句型iiSeS存在两个不同的最左推导:S iSeS iiSesS iS iiSeS所以该文法是二义性文法。
…5. 给出描述下面语言的上下文无关文法。
FOR循环语句的翻译程序设计
目录1 系统描述(问题域描述) (2)1.1目的 (2)1.2设计步骤 (2)1.3系统体系结构描述 (2)2 文法及属性文法的描述 (3)2.1文法 (3)2.2属性文法 (3)3 语法分析方法描述及语法分析表设计 (5)3.1语法分析方法 (5)3.2语法分析表设计 (6)4中间代码形式的描述及中间代码序列的结构设计 (6)4.1中间代码形式描述 (6)4.2中间代码序列的结构设计 (7)5 编译系统的概要设计 (7)5.1系统分析 (7)5.1.1词法分析 (7)5.1.2语法分析 (8)5.1.3中间代码生成 (8)5.2概要设计 (9)5.2.1系统总体设计图 (9)5.2.2数据结构 (9)6 详细的算法描述(流程图或伪代码) (10)6.1词法分析 (10)6.2语法分析 (11)7 软件的测试方法和测试结果 (12)7.1软件测试方法 (12)7.2测试结果 (12)7.2.1简单for循环语句(无嵌套) (12)7.2.2 for循环嵌套语句 (14)8 研制报告 (16)8.1研制过程 (16)8.2对本设计特点和不足的评价 (16)8.3收获与体会 (17)9 参考文献(按公开发表的规范书写) (17)FOR循环语句的翻译程序设计(递归下降法、输出四元式)1 系统描述(问题域描述)1.1目的通过设计、编辑、调试和运行一个对for 循环语句进行词法分析、语法及语义分析的编译程序,并通过对实验用例的测试来更加深刻的理解语言编译的过程和原理。
从而达到在理论学习的基础上,对本课程有一个更深的掌握。
1.2设计步骤对循环语句:for〈表达式;循环条件;表达式〉赋值语句(赋值语句中可以嵌套更多的for循环语句)(1)设计符合自身语法分析方法要求的文法和属性文法。
(2)设计对for循环语句进行词法分析的函数,输出单词序列。
(3)设计递归下降法对文法进行语法分析。
(4)对源文件进行语法分析同时对源文件进行语义处理。
编译原理报告for循环语句的翻译程序文件
学号:26课程设计题目f or循环语句的翻译程序学院计算机学院专业软件工程班级0803姓名徐泽前指导教师何九周2011 年 6 月日目录1设计目的 (4)2设计环境与工具 (4)3设计任务要求与说明 (4)4设计时间 (4)5设计地点 (4)6系统描述 (4)7文法及属性文法的描述 (5)7.1文法描述 (5)7.1.1 FOR语句相关的产生式: (5)7.1.2 布尔表达式: (5)7.1.3 赋值表达式: (5)7.2属性文法的描述 (5)8 语法分析方法描述及语法分析表设计 (7)8.1语法分析方法描述 (7)8.2系统中使用的action和goto表(见附录1) (9)9 给出中间代码形式的描述及中间代码序列的结构设计 (9)10简要的分析与概要设计 (10)11 详细的算法描述 (11)11.1词法分析的数据结构设计与详细的流程图 (11)11.2词法分析流程图 (11)11.3语法制导翻译的数据结构与详细的设计图 (12)11.3.1数据结构的设计 (12)11.3.2算法描述 (13)11.3.3程序流程图 (13)12给出软件的测试方法和测试结果 (14)12.1 FOR循环语句的测试 (14)12.2词法分析出错处理 (15)12.3语法分析出错处理 (16)13收获与体会 (16)14 参考文献 (17)课程设计任务书学生:徐泽前专业班级:软件0803班指导教师:何九周工作单位:计算机学院题目: for循环语句的翻译程序初始条件:程序设计语言:主要使用C语言的开发工具,或者采用LEX、YACC等工具,也可利用其他熟悉的开发工具。
算法:可以根据《编译原理》课程所讲授的算法进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,说明书撰写等具体要求)1.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
编译原理课程设计_算术表达式、for、while语句转换为四元式
计算机与信息学院《操作系统与编译原理联合课程设计报告》专题:编译原理部分学生姓名:学号:专业班级:指导教师:2014 年 7 月一、设计目标设计一个语法制导翻译器,将算术表达式、for语句、while语句翻译成四元式。
要求先确定一个定义算术表达式、for语句、while语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。
对用户输入的任意一个正确的表达式,程序将其转换成四元式输出。
二、设计思路开发平台:Visual C++ MFC解决这个问题的方案分为以下几个步骤:1.将算数表达式、for语句、while语句转换为四元式的第一步为对读入的表达式进行处理,即删除不必要的空格、回车、换行等,保证之后的步骤能够顺利进行。
2.分析算术表达式、for语句、while语句的文法。
3.通过词法分析判断语句中的每个字符的类型,如:数字、字母、符号等。
4.建立每种文法的LR(0)分析表,通过每个文法的LR(0)分析表对相应的表达式进行语法分析。
5.在语法分析正确的情况下,通过语法分析的中间过程的符号栈输出四元式,四元式的形式为:(op arg1 arg2 result)。
(一)算术表达式转换为四元式将算术表达式转换为四元式首先考虑了括号的问题,对于不同的算术表达式第一步进行词法分析,即确定各种符号的位置。
而括号中的式子是优先级最高的,应该最先进行处理。
我使用了一个数组记录算术表达式中括号的位置,并且定义了first_cc和first_jj函数对括号的乘除法和加减法分别进行处理。
后将括号的式子以四元式的形式输出。
通过以上转换,已将原算术表达式中的括号中的容使用大写字母’A’、’B’……等代替(其中定义声明了change函数,用来将括号部分替换为大写字母)。
新的式子中,只含有加减乘除以及赋值这四种运算,后根据优先级的不同,逐步生成四元式。
其算法流程图如右图所示。
FOR循环语句的翻译程序设计LL(1)法、输出四元式(含代码和实验报告册)毕业设计(论文)
FOR循环语句的翻译程序设计——LL(1)法、输出四元式1.系统描述1.1问题描述用LL(1)法设计、编制、调试一个FOR(表达式1;表达式2;表达式3)〈赋值语句〉的语法及语义分析程序,输出四元式。
1.2功能描述(1)能够识别出单词、单词类型、单词位置(2)能够用LL(1)方法识别单词序列是否符合FOR循环文法(3)能够完成对FOR循环中3个表达式的翻译(4)能够完成对FOR循环中赋值语句(含复杂表达式)的翻译(5)能够对FOR循环3个表达式中有表达式1或3缺少时翻译(6)能够用标准化的四元式进行翻译结果输出(7)能够用四元式清晰、正确地反映FOR循环的执行流程(8)能够用文本输入FOR语句循环,再用txt文本输出分析结果2 文法及属性文法的描述2.1文法的语言描述A->for(条件){赋值语句}条件->语句1 语句2 语句3语句1->i = 表达式; //i表示标识符语句1->;语句2->i > 表达式;语句2->i < 表达式;语句3->i = 表达式;语句3->ε赋值语句->m = 表达式 //m表示标识符,作为左值出现赋值语句->ε表达式->表达式+表达式表达式->表达式-表达式表达式->表达式*表达式表达式->表达式/表达式表达式->(表达式)表达式->i //i 表示标识符、常数、字符、或字符串2.2属性文法描述2.2.1 FOR 语句FOR(C D G)n Cn+1 if D==true goto Y.startn+2 goto Y.end+3Y.start ...................//赋值语句的开始...... ...................Y.end ...................//赋值语句结束Y.end+1 GY.end+2 goto n+1Y.end+3 //跳出循环体后第一条语句2.2.2 赋值语句Y->m=E; { m.value=E.Value }E->E1 op E2 (op: +,-,*,/,>或<){E.place = newtemp; //生成新的变量E.value =E1.value op E2.value}N->(E) { N.value=E.value }N->i { N.value=i.value }3.语法分析方法描述及语法分析表设计3.1 对LL(1)分析的描述LL(1):第1个L表明自顶向下分析是从左向右扫描输入串,第2个L表明分析过程中将用最左推导,1表明只需向右看一个符号便可决定如何推导即选择哪个产生式(规则)进行推导。
编译原理E课内实践报告:WHILE循环语句的翻译程序设计与实现,递归下降法,输出四元式
文法及属性文法的描述 ............................................................................................... 2 2.1 2.2 文法描述 ............................................................................................................. 2 属性文法描述 ..................................................................................................... 3
2.2 属性文法描述
形式上讲,属性文法是一个三元组 :A=(G,V,F), 其中: ➢ G:是一个上下文无关文法; ➢ V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连 ,这些属性代表与 文法符号相关信息; ➢ F:关于属性的属性断言或一组属性的计算规则(称为语义规则) 。 断言或语义规则 与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。 属性文法中的属性分成两类:继承属性和综合属性。 ➢ 综合属性(synthesized attribute) :如果 b 是 A 的属性,c1 , c2 , …, ck 是产生式右 部文法符号的属性或 A 的其它属性,则称 b 是文法符号 A 的综合属性。 ➢ 继承属性(inherited attribute):如果 b 是产生式右部某个文法符号 X 的属性,并且 c1,c2,…,ck 是 A 或产生式右部文法符号的属性, 则称 b 是文法符号 X 的继承属性。
3
FOR循环语句的翻译程序设计(递归下降法、输出四元式表示)
1、系统描述 (2)1.1、实验思想 (2)1.2、设计内容 (2)1.3、翻译过程 (2)1.3.1、词法分析: (2)1.3.2、语法分析: (3)1.3.3、中间代码生成: (4)1.3.4、属性文法: (4)2、递归下降法 (4)2.1、递归下降法的主要思想: (4)2.2、用程序表示递归子程序的内部结构: (4)2.3、递归下降法对文法的限制: (5)3、语法制导翻译 (5)3.1、翻译任务的处理过程 (5)3.2、语法制导翻译: (5)3.3、基于属性文法的处理方法 (6)4、中间代码形式的描述及中间代码序列的结构设计 (6)5、简要的分析与概要设计 (6)5.1、词法分析: (6)5.2源代码 (8)5.3 运行结果 (9)6、测试方法和测试结果 (15)6.1测试过程 (15)6.2测试结论 (17)7、课程设计总结 (18)8、参考文献 (19)1、系统描述1.1、实验思想通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。
1.2、设计内容本设计按照要求设计出for语句的简单文法,并使用递归下降分析法对用户输入的程序进行分析和翻译。
对下列正确的程序输入:for i=1 step 1 until 10 do k=j #结果程序要对该输入进行词法分析,然后利用递归下降的分析法对词法分析得到的单词序列进行语法分析,经过语法制导翻译显示出等价的三地址表示的中间代码。
对于错误的程序输入,如:For i=1 step 1 until 10 k=j#结果程序要指出程序出错。
1.3、翻译过程1.3.1、词法分析:词法分析是计算机科学中将字符序列转换为单词(Token)序列的过程。
进行语法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。
Get清风ifelse语句递归下降法输出四元式
if--else-语句-递归下降法-输出四元式学号:0121课程设计课程名称编译原理课程设计题目IF-ELSE条件语句的翻译程序设计〔递归下降法、输出四元式〕学院计算机科学与技术专业计算机科学与技术班级计算机1001班姓名指导教师陈天煌2021 年 1 月7 日课程设计任务书学生姓名专业班级:计算机1001班指导教师:陈天煌工作单位:计算机科学与技术学院题目: IF-ELSE条件语句的翻译程序设计〔递归下降法、输出四元式表示〕初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:〔包括课程设计工作量及其技术要求,以及说明书撰写等具体要求〕(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计假设干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:1 系统描述〔问题域描述〕;2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述〔流程图或伪代码〕;7 软件的测试方法和测试结果;8 研制报告〔研制过程,本设计的评价、特点、缺乏、收获与体会等〕;9 参考文献〔按公开发表的标准书写〕。
时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名:年月日IF-ELSE条件语句的翻译程序设计〔递归下降法、输出四元式〕1.系统描述〔问题域描述〕本次实验使用windows XP的visual C++软件,利用递归下降法实现IF-ELSE的条件语句的翻译程序设计,输出四元式表示,程序只能处理简单的布尔表达式和最简单的赋值语句,布尔表达式能够实现大于和小于的识别,也能处理关系运算符>=和<=的布尔表达式。
(完整word版)FOR循环语句的翻译程序设计(LL(1)法、输出三地址)
课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: FOR循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码三地址表示的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。
时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名:年月日系主任(或责任教师)签名:年月日FOR循环语句的翻译程序设计——LL(1)法、输出三地址1.系统描述1.1问题描述用LL(1)法设计、编制、调试一个FOR(表达式1;表达式2;表达式3)〈赋值语句〉的语法及语义分析程序,输出三地址代码。
1.2功能描述(1)能对for循环语句做词法分析,并将其中的某些语句做预处理,如i++转换为i=i+1等。
(2)能依据给定的LL(1)文法判断输入串是否符合LL(1)文法(3)给出输入串的LL(1)分析过程(4)完成对语句中控制变量赋值语句,控制条件语句以及控制变量变换语句的翻译(5)完成对赋值语句包括复杂语句的翻译(6)能够对三个表达式缺少一个或多个的情况下进行翻译(7)用翻译后的语句以三地址代码的中间代码形式正确的表达for循环的执行流程。
for、while、range的使用方法
一、介绍在学习编程语言时,掌握常用的控制流语句是非常重要的。
其中,for、while和range是Python语言中常用的控制流语句,本文将详细介绍它们的使用方法。
二、for循环1. for循环的基本语法for循环是一种遍历数据的方法,它的基本语法如下:```pythonfor 变量 in 可迭代对象:循环体```2. for循环的示例下面是一个简单的for循环示例:```pythonfruits = ['apple', 'banana', 'orange']for fruit in fruits:print(fruit)```运行上面的代码,将会依次输出'apple'、'banana'和'orange'。
3. for循环的嵌套使用for循环还可以嵌套使用,例如:```pythonfor i in range(3):for j in range(3):print(i, j)```上面的代码将会输出(0, 0)、(0, 1)、(0, 2)、(1, 0)、(1, 1)、(1, 2)、(2, 0)、(2, 1)、(2, 2)。
4. 使用enumerate函数获取索引和值有时候我们需要同时获取列表中元素的索引和值,可以使用enumerate函数:```pythonfruits = ['apple', 'banana', 'orange']for index, fruit in enumerate(fruits):print(index, fruit)```上面的代码将输出0 apple、1 banana、2 orange。
5. 使用zip函数并行遍历多个列表如果我们有多个列表,希望并行遍历它们,可以使用zip函数:```pythonfruits = ['apple', 'banana', 'orange']prices = [5, 3, 2]for fruit, price in zip(fruits, prices):print(fruit, price)```zip函数将以最短的列表长度为准进行并行遍历,输出结果为'apple 5'、'banana 3'和'orange 2'。
Python中的循环语句详解
Python中的循环语句详解循环是编程中非常重要的概念之一,它允许我们重复执行一段代码。
在Python中,循环语句主要有两种形式:for循环和while循环。
本文将详细介绍这两种循环语句的使用方法和注意事项。
一、for循环for循环是一种遍历可迭代对象的循环结构。
可以理解为"对于可迭代对象中的每个元素,都执行一次循环体内的代码"。
下面是for循环的基本语法:```pythonfor 变量 in 可迭代对象:循环体内的代码```其中,变量是用来存储每个元素的临时变量,可迭代对象是指可以被遍历的对象,如列表、元组、字符串等。
在每次循环中,变量会被赋值为可迭代对象中的一个元素,然后执行循环体内的代码。
例子1:遍历列表中的元素```pythonfruits = ["apple", "banana", "cherry"]for fruit in fruits:print(fruit)```输出结果:```applebananacherry```例子2:计算列表中所有元素的和```pythonnumbers = [1, 2, 3, 4, 5]sum = 0for num in numbers:sum += numprint("列表中所有元素的和为:" + str(sum)) ```输出结果:```列表中所有元素的和为:15```二、while循环while循环是一种根据条件表达式的真假来控制循环执行的结构。
可以理解为"只要条件为真,就一直执行循环体内的代码"。
下面是while循环的基本语法:```pythonwhile 条件表达式:循环体内的代码```其中,条件表达式是一个返回布尔值的表达式,只有在条件为真时,循环才会继续执行。
在每次循环中,都会先判断条件表达式的值,如果为真,则执行循环体内的代码。
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)1 需求说明或问题描述1.1 问题描述对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。
1.2 需求说明1 写出符合给定的语法分析方法的文法及属性文法2 完成题目要求的中间代码四元式的描述3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计4 设计若干用例,上机通过测试2 文法及语法设计2.1文法及属性文法:文法G=(V N ,V T ,P ,S)其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;}P={S -> w(B){E}E -> CC -> CAC -> AA -> iPAA -> i;P -> +|-|*|/B -> iTiB-> iT -> >|<|>=|<=|==}2.2 语法分析方法描述及语法分析表设计2.2.1 语法分析方法描述:简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。
基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将文法的产生式保存,设置符号栈S,步骤如下:(1)将输入符号串a1a2…a n#依次逐个存入符号栈S中,直到遇到栈顶符号a i的优先性>下一个待输入符号a j为止。
(2)栈顶当前符号a i为句柄尾,由此向左在栈中找句柄的头符号a k,即找到a k-1<a k为止。
(3)由句柄a k...a i在文法的产生式中查找右部为a k…a i的产生式,若找到则用相应左部代替句柄,若找不到则为出错,这时可断定输入串不是该文法的句子。
(4)重复上述(1)、(2)、(3)步骤直到规约完输入符号串,栈中只剩文法的开始符号为止。
IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)
目录1 系统描述(问题域描述) (2)2 文法及属性文法的描述 (2)2.1文法 (2)2.2 属性文法 (2)3 语法分析方法描述及语法分析表设计 (3)3.1语法分析方法描述 (3)3.1.1 LR方法的基本思想 (3)3.1.2 LR分析器模型 (4)3.2语法分析表设计 (5)4中间代码形式的描述及中间代码序列的结构设计 (6)4.1中间代码形式的描述 (6)4.2中间代码序列的结构设计 (6)5 编译系统的概要设计 (6)6 详细的算法描述 (7)6.1系统流程图 (7)6.2算法描述 (7)7 软件的测试方法和测试结果 (18)7.1软件的测试方法 (18)7.2测试结果 (18)8设计的特点、不足、收获与体会 (21)8.1特点与不足 (21)8.2收获与体会 (21)9 参考文献 (21)10本科生课程设计成绩评定表 (22)IF-ELSE条件语句的翻译程序设计(LR方法、输出四元式)1 系统描述(问题域描述)对条件语句: if 〈布尔表达式〉then〈赋值语句〉 else 〈赋值语句〉,进行词法,LR(1)语法分析,并根据语法制导翻译方法将条件语句翻译成四元式中间代码形式,最后输出翻译后的四元式代码。
2 文法及属性文法的描述2.1文法G[S]: S->CSS->TSS->AC->if E thenT->CS elseT->else其中,E代表布尔表达式,可由界符()括起来,A代表赋值表达式。
在这里E、A都代表终结符,具体的表达式在程序会判断其类型。
2.2 属性文法S->C S{S.clain:=merge(C.clain,S.clain)}S->T S{S.clain:=merge(T.clain,S.clain)}S->A{S.clain:0/* 空链*/}C->if E then{backpatch(E.true,nextstat) C.clain:=E.false}T->C S else{ q:=nextstatEmit(‘GOTO’—)Backpatch(C.clain,nextstat)T.clain:=merge(S.clain,q)}3 语法分析方法描述及语法分析表设计3.1语法分析方法描述3.1.1 LR方法的基本思想一个LR分析器实质上是一个带先进后出存储器的确定有限状态自动机。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、系统描述 (2)1.1、实验思想 (2)1.2、设计内容 (2)1.3、翻译过程 (2)1.3.1、词法分析: (2)1.3.2、语法分析: (3)1.3.3、中间代码生成: (4)1.3.4、属性文法: (4)2、递归下降法 (4)2.1、递归下降法的主要思想: (4)2.2、用程序表示递归子程序的内部结构: (4)2.3、递归下降法对文法的限制: (5)3、语法制导翻译 (5)3.1、翻译任务的处理过程 (5)3.2、语法制导翻译: (5)3.3、基于属性文法的处理方法 (6)4、中间代码形式的描述及中间代码序列的结构设计 (6)5、简要的分析与概要设计 (6)5.1、词法分析: (6)5.2源代码 (8)5.3 运行结果 (9)6、测试方法和测试结果 (15)6.1测试过程 (15)6.2测试结论 (17)7、课程设计总结 (18)8、参考文献 (19)1、系统描述1.1、实验思想通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。
1.2、设计内容本设计按照要求设计出for语句的简单文法,并使用递归下降分析法对用户输入的程序进行分析和翻译。
对下列正确的程序输入:for i=1 step 1 until 10 do k=j #结果程序要对该输入进行词法分析,然后利用递归下降的分析法对词法分析得到的单词序列进行语法分析,经过语法制导翻译显示出等价的三地址表示的中间代码。
对于错误的程序输入,如:For i=1 step 1 until 10 k=j#结果程序要指出程序出错。
1.3、翻译过程1.3.1、词法分析:词法分析是计算机科学中将字符序列转换为单词(Token)序列的过程。
进行语法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。
词法分析器一般以函数的形式存在,供语法分析器调用。
词法分析是编译过程中的第一个阶段,在语法分析前进行。
也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。
简化设计、改进编译效率、增加编译系统的可移植性。
词法分析是编制一个读单词的过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
单词的分类主要分为五类:1. 关键字:由程序语言定义的具有固定意义的标识符。
也称为保留字或基本字。
2. 标识符:用来表示程序中各种名字的字符串。
3. 常数:常数的类型一般有整型、实型、布尔型、文字型。
4. 运算符:如+、-、*、/ 等。
5. 界限符:如逗号、分号、括号等。
词法分析器输出的单词符号常表示成如下的二元式:(单词种别,单词符号的属性值)1.3.2、语法分析:语法分析是编译过程的一个逻辑阶段。
语法分析的任务是在的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。
语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。
语法分析的主要工作:是识别由词法分析给出的单词序列是否是给定的正确句子(程序)。
语法分析常用的方法:自顶向下的语法分析和自底向上的语法分析两大类。
此次设计中语法分析中主要通过递归下降分析法对语法分析处理过程进行控制,使输出的三地址表示的翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。
递归下降法主要采用自顶向下方法,即从文法的开始符号开始进行分析,逐渐推导的往下构造语法树,使其树叶正好构造出所给定的源程序串。
自顶向下方法的关键是确定在推导过程中选择候选式的问题。
当进行推导时,一个非终结符可能对应多个产生式,这样我们就无法事先知道应该用哪个产生式,因此实用都作了一些限制。
以便在任何情况下都能确定应该用的产生式。
自顶向下的主要思想是从开始符出发导出句型并一个符号一个符号地与给定终结符串进行匹配。
如果全部匹配成功,则表示开始符号可推导出给定的终结符串。
因此判定给定终结符号串是正确句子。
词法分析程序和语法分析程序的关系:1.3.3、中间代码生成:中间代码,也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。
为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工作明显的分开来时,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言。
中间代码(语言)是一种特殊结构的语言,编译程序所使用的中间代码有多种形式。
按其结构分常见的有逆波兰式(后缀式)、三地址代码(三元式、四元式)和树形表示(抽象语法树)、DAG表示。
本次课程设计要实现的是三地址表示。
1.3.4、属性文法:对于文法的每个产生式都配备了一组属性的计算规则,称为语义规则。
所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作,从而实现语义处理。
一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。
形式上讲,属性文法是一个三元组 :A=(G,V,F),其中:G:是一个上下文无关文法;V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连,这些属性代表与文法符号相关信息;F:关于属性的属性断言或一组属性的计算规则(称为语义规则) 。
断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。
2、递归下降法递归下降法又称递归子程序法。
在程序语言的语法定义中有许多采用递归定义。
我们在对它进行语法分析时,编制的处理程序也采取递归的方式,可使其结构简单易读。
但由于频繁地调用子程序大大地降低了分析速度。
2.1、递归下降法的主要思想:对每个非终结符按其产生式结构写出相应语法分析子程序。
因为文法递归相应子程序也递归,子程序的结构与产生式结构几乎一致。
所以称此种方法称为递归子程序法或递归下降法。
2.2、用程序表示递归子程序的内部结构:设A是一个非终结符:A→β1A→β2┊A→βn则写ζ(A) ⇔ if char∈first(β1 ) thenζ(β1 )else if char∈first(β2 ) then ζ(β2 )else…if char∈first(βn ) then ζ(βn)else ERROR其中ζ(βi)表示调用处理符号串βi的子程序。
对A的任一右部i 设为:βi = y1 y2 … yn则定义ζ( βi) ⇔ beginζ(y1);ζ(y2);…;ζ(yn) end其中yj可分为下列两种情况(j=1,…,n):1) yj∈VT,则ζ( yj) ⇔if char≠ yj then ERROR else READ(char)2) yj∈VN,则ζ(yj)表示调用关于yj的递归子程序。
2.3、递归下降法对文法的限制:1、任一非终结符B都不是左递归的,否则会产生死循环。
2、对A的任意两个右部βi , βj ,有:first(βi)∩first(βj)=φ。
First(βi)表示βi所能导出串的第一个符号的集合。
显然,每个βi的first(βi)是互不相同的,否则则无法判断应执行哪个ζ(βi )。
3、语法制导翻译3.1、翻译任务的处理过程编译程序的整个任务就是把源程序翻译为目标程序。
实际上可以把每个编译阶段都看作是完成一定翻译任务的处理过程:词法分析阶段把字符流翻译为单词流,语法分析阶段把单词流翻译为语法树,目标代码生成阶段把语法树翻译为汇编语言等等。
3.2、语法制导翻译:在语法分析过程中,随着分析的步步进展,每当进行推导或归约时,同步的去执行每个产生式所附带的语义规则描述的语义动作(或语义子程序),这样进行翻译的办法称作语法制导翻译。
所谓属性依赖图是一个有向图,用于描述分析树中的属性和属性间的相互依赖关系。
3.3、基于属性文法的处理方法输入串→语法树→依赖图→计算语义规则顺序→语法分析树遍历→执行语义规则语义规则的计算可能产生代码,在符号表中存取信息,给出出错信息或执行其它动作。
对输入串的翻译也就是根据语义规则进行计算的结果。
4、中间代码形式的描述及中间代码序列的结构设计本次设计,使用的中间代码为四元式四元式有四个组成成分:算符op,第一和第二运算对象ARG1和ARG2,运算结果RESULT。
例如:有中缀式a:=b*-c+b*-c,求其等价的四元式。
四元元式编号算符左对象右对象中间结果op arg1 arg2 result(1) minus c t1(2) * b t1 t2(3) minus c t3(4) * b (3) t4(5) + (4) (2) t5(6) assign a设计并生成的结果程序,最终需要将用户输入的程序经过词法分析和语法分析,生成如上所述的式表示的中间代码形式。
5、简要的分析与概要设计程序由词法分析和语法分析两部分构成:5.1、词法分析:int buffer()//载入{int i=0;cout<<"输入程序,以#作为结束标志。
"<<endl;for(int n=0;n<=MAX;n++){for(;i<=MAX;i++){scanf("%c",&str[i]);if(str[i]=='#')break; //如果尾数为识别码#,则表示程序读完,跳出循环.}break;}return(i);}bool IsLetter(char ch)//判断是否是字母{if(ch>=65&&ch<=90||ch>=97&&ch<=1 22)return(true);elsereturn(false);}bool IsDigit(char ch)//判断是否是数字{if(ch>=48&&ch<=57)return(true);elsereturn(false);}char GetChar(int i)//读取字符{char ch;ch=str[i];return(ch);}char GetBC(char ch)//判断是不是空格或者换行,如果是,直接读取下一个字符直道不再空白为止{if(ch==32||ch==10){turn++;ch=GetChar(turn);ch=GetBC(ch);//递归实现return(ch);}elsereturn(ch);}void Concat()//连接,即为strtoken[]赋值{strToken[n]=ch;n++;}int Reserve()//以单词为单位查找保留字,是则返回编码,不是则返回0,用来区分标志符和保留字{if(strcmp(strToken," DIM\0")==0)//调用strcmp函数实现,return(1);else if(strcmp(strToken,"for\0")==0)return(2);else if(strcmp(strToken,"step\0")==0)return(3);elseif(strcmp(strToken,"until\0")==0)return(4);elseif(strcmp(strToken,"do\0")==0)return(5);elsereturn(6);}void clear(){n=0;}ch=GetChar(++turn);}ch=NULL;turn=turn-1;kind=7;cout<<"(";for(int i=0;i<n;i++){record[x]->word[i]=strToken[i]; cout<<record[x]->word[i];}cout<<","<<kind<<")"<<endl; record[x]->word[i]='\0';clear();x++;}else if(ch=='='){kind=8;record[x]->word[0]='=';record[x++]->sort=kind;cout<<"(=,"<<kind<<")"<<endl; }elsecout<<"error input!"<<endl;5.2源代码#include <stdio.h>#include<dos.h>#include<stdlib.h>#include<string.h>char a[50] ,b[50],d[200],e[10];char ch;int n1,i1=0,flag=1,n=5;int total=0;/*步骤计数器*/int E();int E1();int T();int G();/*E’*/int S();/*T’*/int F();void input();void input1();void output();void main() /*递归分析*/{int f,p,j=0;char x;d[0]='E';d[1]='=';d[2]='>';d[3]='T';d[4]='G';d[5]='#';printf("请输入字符串(长度<50,以#号结束)\n");do{scanf("%c",&ch);a[j]=ch;j++;}while(ch!='#');n1=j;ch=b[0]=a[0];printf("步骤\t文法\t分析串\t\t分析字符\t剩余串\n");f=E1();if (f==0) return;if (ch=='#'){printf("accept\n");p=0;x=d[p];while(x!='#') {printf("%c",x);p=p+1;x=d[p]; /*输出推导式*/ }}else {printf("error\n");printf("回车返回\n");getchar();getchar();return;}printf("\n");printf("回车返回\n");getchar();getchar();}int E1(){int f,t;printf("%d\tE-->TG\t",total);total++;flag=1;input();input1();f=T();if (f==0) return(0);t=G();if (t==0) return(0);else return(1);}int E(){int f,t;printf("%d\tE-->TG\t",total);total++;e[0]='E';e[1]='=';e[2]='>';e[3]='T';e[4]='G';e[5]='#';output();flag=1;input();f=T();if (f==0) return(0);t=G();if (t==0) return(0);else return(1);}int T(){int f,t;printf("%d\tT-->FS\t",total);total++;e[0]='T';e[1]='=';e[2]='>';e[3]='F';e[4]='S';e[5]='#';output();flag=1;input();input1();f=F();if (f==0) return(0);t=S();if (t==0) return(0);else return(1);}int G(){int f;if(ch=='+') {b[i1]=ch;printf("%d\tG-->+TG\t",total);total++;e[0]='G';e[1]='=';e[2]='>';e[3]='+';e[4]='T';e[5]='G';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=T();if (f==0) return(0);G();return(1);}printf("%d\tG-->^\t",total);total++;e[0]='G';e[1]='=';e[2]='>';e[3]='^';e[4]='#';output();input();input1();return(1);}int S(){int f,t;if(ch=='*') {b[i1]=ch;printf("%d\tS-->*FS\t",total);total++;e[0]='S';e[1]='=';e[2]='>';e[3]='*';e[4]='F';e[5]='S';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=F();if (f==0) return(0);t=S();if (t==0) return(0);else return(1);}printf("%d\tS-->^\t",total);total++;e[0]='S';e[1]='=';e[2]='>';e[3]='^';e[4]='#';output();flag=1;a[i1]=ch;input();input1();return(1);}int F(){int f;if(ch=='(') {b[i1]=ch;printf("%d\tF-->(E)\t",total);total++;e[0]='F';e[1]='=';e[2]='>';e[3]='(';e[4]='E';e[5]=')';e[6]='#';output();flag=0;input();input1();ch=a[++i1];f=E();if (f==0) return(0);if(ch==')') {b[i1]=ch;printf("%d\tF-->(E)\t",total);total++;flag=0;input();input1();ch=a[++i1];}else {printf("error\n");return(0);}}else if(ch=='i') {b[i1]=ch;printf("%d\tF-->i\t",total);total++;e[0]='F';e[1]='=';e[2]='>';e[3]='i';e[4]='#';output();flag=0;input();input1();ch=a[++i1];}else {printf("error\n");return(0);}return(1);}void input(){int j=0;for (;j<=i1-flag;j++)printf("%c",b[j]); /*输出分析串*/printf("\t\t");printf("%c\t\t",ch); /*输出分析字符*/}void input1(){int j;for (j=i1+1-flag;j<n1;j++)printf("%c",a[j]); /*输出剩余字符*/ printf("\n");}void output(){ /*推导式计算*/ int m,k,j,q;int i=0;m=0;k=0;q=0;i=n;d[n]='=';d[n+1]='>';d[n+2]='#';n=n+2;i=n;i=i-2;while(d[i]!='>'&&i!=0) i=i-1;i=i+1;while(d[i]!=e[0]) i=i+1;q=i;m=q;k=q;while(d[m]!='>') m=m-1;m=m+1;while(m!=q) {d[n]=d[m];m=m+1;n=n+1;}d[n]='#';for(j=3;e[j]!='#';j++){d[n]=e[j];n=n+1;}k=k+1;while(d[k]!='=') {d[n]=d[k];n=n+1;k=k+1;}d[n]='#';system("pause");}5.3 运行结果1)在文件中输入:i+i*i# 运行结果如下图所示:2)在文件中输入:i+i-# 运行结果如下图所示:6、测试方法和测试结果6.1测试过程针对所设计的关于 for循环语句的翻译程序,分别用正确的程序和有错误的程序进行测试,测试出结果程序的可用性和健壮性。