欢迎来到天天文库
浏览记录
ID:14420327
大小:410.50 KB
页数:21页
时间:2018-07-28
《编译原理词法分析器语法分析器实验报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译技术班级网络0802学号3080610052姓名叶晨舟指导老师朱玉全2011年7月4日一、目的编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求基本要求:1.词法分析器产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表:单词符号种别编码助记符内码
2、值DIMIFDOSTOPEND标识符常数(整)=+***,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$PLUS$STAR$POWER$COMMA$LPAR$RPAR------内部字符串标准二进形式------对于这个小语言,有几点重要的限制:首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的:IF(5)=x其次,由于把关键字作为保留字,故可以把关键
3、字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为 IFi>0i=1;而绝对不要写成 IFi>0i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。这个小语言的单词符
4、号的状态转换图,如下图:1.语法分析器能识别由加+减-乘*除/乘方^括号()操作数所组成的算术表达式,其文法如下:E→E+T
5、E-T
6、TT→T*F
7、T/F
8、FF→P^F
9、Pp→(E)
10、i使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。2.中间代码生成器产生上述算术表达式的中间代码(四元式序列)三、实现过程给出各题目的详细算法描述,数据结构和函数说明,流程图。1、词法分析器的流程图2、语法分析器主程序图3、中间代码生成器流程图:四、源程序词法分析器:#include11、>#include#includeusingnamespacestd;typedefstructtable//分析表存储结构{charm[100];}table;tableM[100][100];//定义分析表typedefstructstacknode//定义栈内元素节点(带头结点(为空)的){chardata;structstacknode*next;}stackk;voidinitlink(stackk*&s)//初始化新栈{s=(stackk*)malloc(s12、izeof(stackk));s->next=NULL;}voidpoplink(stackk*&s)//顶元素出栈{stackk*p;charv;if(s->next!=NULL){p=s->next;v=p->data;s->next=p->next;}free(p);}voidpushlink(stackk*&s,charx)//新元素入栈{stackk*p;p=(stackk*)malloc(sizeof(stackk));p->data=x;p->next=s->next;s->next=p;}vo13、iddisplay(stackk*s)//打印现实显示栈内元素{stackk*p;inti=0,j;charst[100];p=s->next;while(p!=NULL){st[i++]=p->data;p=p->next;}for(j=i-1;j>=0;j--)printf("%c",st[j]);for(j=0;j<16-i;j++)//打印对齐格式printf("%c",'');}chargettop(stackk*s)//返回栈顶元素值{if(s->next==NULL)return0;elsere14、turns->next->data;}intfind(charc,chararray[])//查找函数,{inti;intflag=0;for(i=0;i<100;i++){if(c==array[i])flag=1;}returnflag;}intlocation(charc,chararray[])//定位函数,指出字符所在位置{inti;for(i=0;i<100;i++){if(c==arr
11、>#include#includeusingnamespacestd;typedefstructtable//分析表存储结构{charm[100];}table;tableM[100][100];//定义分析表typedefstructstacknode//定义栈内元素节点(带头结点(为空)的){chardata;structstacknode*next;}stackk;voidinitlink(stackk*&s)//初始化新栈{s=(stackk*)malloc(s
12、izeof(stackk));s->next=NULL;}voidpoplink(stackk*&s)//顶元素出栈{stackk*p;charv;if(s->next!=NULL){p=s->next;v=p->data;s->next=p->next;}free(p);}voidpushlink(stackk*&s,charx)//新元素入栈{stackk*p;p=(stackk*)malloc(sizeof(stackk));p->data=x;p->next=s->next;s->next=p;}vo
13、iddisplay(stackk*s)//打印现实显示栈内元素{stackk*p;inti=0,j;charst[100];p=s->next;while(p!=NULL){st[i++]=p->data;p=p->next;}for(j=i-1;j>=0;j--)printf("%c",st[j]);for(j=0;j<16-i;j++)//打印对齐格式printf("%c",'');}chargettop(stackk*s)//返回栈顶元素值{if(s->next==NULL)return0;elsere
14、turns->next->data;}intfind(charc,chararray[])//查找函数,{inti;intflag=0;for(i=0;i<100;i++){if(c==array[i])flag=1;}returnflag;}intlocation(charc,chararray[])//定位函数,指出字符所在位置{inti;for(i=0;i<100;i++){if(c==arr
此文档下载收益归作者所有