




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译技术 班 级 网络 0802 学 号 3080610052姓 名 叶晨舟指导老师 朱 玉 全 2011年 7 月 4 日一、目的编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。二、任务及要求基本要求:1 词法分析器 产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表: 单词符号种别编码助记符内码值DIMIFDOSTOPEND标识符常数(整)=
2、+*,()1234567891011121314$DIM$IF$DO$STOP$END$ID$INT$ASSIGN$PLUS$STAR$POWER$COMMA$LPAR$RPAR-内部字符串标准二进形式-对于这个小语言,有几点重要的限制:首先,所有的关键字(如IFWHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识
3、符时,就去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为 IF i>0 i= 1;而绝对不要写成 IFi>0 i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。这个小语言的单词符号的状态转换图,如下图: 2 语法分析器 能识别由加+ 减- 乘* 除/ 乘方 括号()操作数所组成的算术表达式,其文法如下:EE+T|E-T|TTT*F|T/F|FFPF|Pp(E)|i 使用的算法可以是:预测分析法;递归下降分析法;算符优先分
4、析法;LR分析法等。3 中间代码生成器 产生上述算术表达式的中间代码(四元式序列)三、实现过程给出各题目的详细算法描述,数据结构和函数说明,流程图。1、词法分析器的流程图2、语法分析器主程序图3、中间代码生成器流程图:四、源程序词法分析器:#include<string.h>#include<malloc.h>#include<iostream>using namespace std;typedef struct table /分析表存储结构 char m100; table;table M100100; /定义分析表typedef struct stack
5、node /定义栈内元素节点 (带头结点(为空)的) char data; struct stacknode *next;stackk;void initlink(stackk *&s) /初始化新栈 s=(stackk *)malloc(sizeof(stackk); s->next=NULL;void poplink(stackk *&s) /顶元素出栈 stackk *p;char v; if(s->next!=NULL) p=s->next; v=p->data; s->next=p->next; free(p);void pushl
6、ink(stackk *&s,char x) /新 元 素 入 栈 stackk *p; p=(stackk *)malloc(sizeof(stackk); p->data=x; p->next=s->next; s->next=p;void display(stackk *s) /打印 现实显示 栈内元素 stackk *p; int i=0,j; char st100; p=s->next; while(p!=NULL) sti+=p->data; p=p->next; for(j=i-1;j>=0;j-) printf("
7、;%c",stj); for(j=0;j<16-i;j+) /打印 对齐格式 printf("%c",' '); char gettop(stackk *s) /返 回 栈 顶 元 素 值 if(s->next=NULL) return 0; else return s->next->data; int find(char c,char array) /查找函数,int i;int flag=0;for(i=0;i<100;i+)if(c=arrayi) flag=1;return flag;int location(
8、char c,char array) /定位函数,指出字符所在位置int i;for(i=0;i<100;i+)if(c=arrayi) return i;void error() /出错函数定义 printf("%15c出错!n",' ');void analyse(char Vn,char Vt) int i,j,m,p,q,length,t,h; char w,X; char str100;opt0: scanf("%s",str); for(i=0;i<strlen(str);i+) if(!find(stri,Vt)
9、 printf("输入字符串有误!请重新输入!"); goto opt0; break; stackk *st; initlink(st); pushlink(st,'#'); pushlink(st,Vn0); /#与识别符号入栈 j=0; h=1; w=str0; printf("步骤%-12c分析栈%-24c剩余输入串%-12c所用产生式n",' ',' ',' ');opt1: printf("%-16d",h); /显示步骤 h+; display(st); /
10、显示分析栈中内容 X=gettop(st); /上托栈顶符号放入X poplink(st); for(int k=0;k<14+j;k+) /打印对齐格式 printf("%c",' '); for(t=j;t<strlen(str);t+) printf("%c",strt); /显示剩余字符串 if(find(X,Vt)&& X!='#') /分析栈的栈顶元素和剩余输入串的第一个元素相比较 if(X=w) printf("%15c匹配n",X); j+; w=strj;
11、goto opt1; else error(); else if(X='#') if(X=w) printf("%8c是该文法的句子!n",' '); else error(); else p=location(X,Vn); q=location(w,Vt); char *S1="null",*S2="NULL" if(strcmp(Mpq.m,S1)=0|strcmp(Mpq.m,S2)=0) /查找产生式 error(); else char str0100; strcpy(str0,Mpq.m);
12、 printf("%15c->%sn",X,str0); /显示对应的产生式 if(strcmp(str0,"$")=0) goto opt1; else length=strlen(str0); /逆序进栈 for(m=length-1;m>=0;m-) pushlink(st,str0m); goto opt1; int main() int i,k,n,r; char Vn100,Vt100,select; printf("*n"); printf("对任意输入LL(1)文法的分析表,判断验证字符串是否为该
13、文法的句子 n"); printf("并能给出分析和演示过程。 n"); printf("*n");opt2: printf("请输入各终结符(#号表示结束 )Vti:n"); for(i=0;i<100;i+) scanf("%c",&Vti); if(Vti='#') r=i; break; printf("请输入非终结符个数:n"); scanf("%d",&n); getchar(); for (i=0;i<n;i
14、+) printf("请输入非终结符Vn%d:n",i); scanf("%c",&Vni); getchar(); printf("请输入此非终结符对应各终结符的产生式右部(null或NULL表示出错;$表示空串):n"); for(k=0;k<=r;k+) scanf("%s",Mik.m); getchar(); opt3: printf("请输入要分析的字符串,且以#结束:n"); analyse(Vn, Vt); printf("*请选择*n"); p
15、rintf(" 1: 输入字符串 n"); printf(" 2: 输入新分析表 n"); printf(" 0: 退 出 n"); printf("*n");opt4:cin>>select; switch(select) case '1': goto opt3;break; case '2': goto opt2; case '0': break; default: printf("输入错误!请重新选择:"); goto opt4;
16、 break; return 0;运行结果:语法分析器 源程序:#include<string.h>#include<iostream>using namespace std;char prog100,token10;char ch;int syn,p,m=0,n,row,sum=0;char *rwtab20="dim","if","do","stop","end" ,"and","begin","bool",
17、"case","char","false","for","int","not","or","set","then","true","until","while" void scaner()for(n=0;n<9;n+) tokenn=NULL;ch=progp+;while(ch=' ')ch=progp;p+;if(ch>=
18、39;a'&&ch<='z')|(ch>='A'&&ch<='Z')m=0;while(ch>='0'&&ch<='9')|(ch>='a'&&ch<='z')|(ch>='A'&&ch<='Z')tokenm+=ch;ch=progp+;tokenm+='0'p-;syn=21;for(n=0;
19、n<20;n+)if(strcmp(token,rwtabn)=0)syn=n+1;break;else if(ch>='0'&&ch<='9')sum=0;while(ch>='0'&&ch<='9')sum=sum*10+ch-'0'ch=progp+;p-;syn=7+15;if(sum>32767)syn=-1;else switch(ch) case'=':syn=8+15;token0=ch;break;case'
20、;+':syn=9+15;token0=ch;break;case'*':m=0;tokenm+=ch;ch=progp+;if(ch='*')syn=11+15; tokenm+=ch;elsesyn=10+15;p-; break;case',':syn=12+15;token0=ch;break;case'(':syn=13+15;token0=ch;break;case')':syn=14+15;token0=ch;break;case'#':syn=0;token0=ch;brea
21、k;case'<':m=0;tokenm+=ch;ch=progp+;if(ch='>')syn=17+15;tokenm+=ch;else if(ch='=')syn=16+15;tokenm+=ch;elsesyn=15+15;p-;break;case'>':m=0;tokenm+=ch;ch=progp+;if(ch='=')syn=19+15;tokenm+=ch;elsesyn=18+15;p-;break;case':':m=0;tokenm+=ch;ch=progp
22、+;if(ch='=')syn=21+15;tokenm+=ch;elsesyn=20+15;p-;break;case'/':syn=22+15;token0=ch;break;case'-':syn=23+15;token0=ch;break;case'':syn=24+15;token0=ch;break;default: syn=-1;break;void main()p=0;row=1;cout<<endl<<endl<<endl;cout<<"*小型词法分析器*
23、"<<endl<<endl;cout<<"请输入一段程序(以#结束):"docin.get(ch);progp+=ch;while(ch!='#');p=0;cout<<endl<<"*词法分析结果如下*"<<endl;cout<<" 种别编码 自身值"<<endl;doscaner();switch(syn)case 22 : cout<<" ("<<syn<&l
24、t;" , "<<sum<<")"<<endl; break; case -1: cout<< " Error in row"<<row<<"!"<<endl; break; default: cout<<" ("<<syn<<" , "<<token<<")"<<endl;break;while (s
25、yn!=0);运行结果:中间代码生成器源程序:表达式生成四元式递归子程序法#include<string>#include <iostream>using namespace std;#define DEFAULT_SIZE 100char EMachine(char w); /表达式E的自动机char TMachine(char w); /表达式T的自动机char FMachine(char w); /表达式F的自动机bool ZMachine(); /表达式Z的自动机string intToString(int a); /整形变成字符串形函数class stack/
26、栈类定义private: int top; string *stacka; int maxsize;public: stack(int size=DEFAULT_SIZE); stack() delete stacka; void push(const string &item); string pop(void); string gettop(void) const ; bool empty(void) const return (top=-1); bool full(void) const return (top=maxsize-1); void clear(void) top=-
27、1; ;stack:stack(int size) /栈类的构造函数 top=-1; maxsize=size; stacka=new stringmaxsize; if(!stacka) cerr<<"allocate memory failed."<<endl; exit(1); void stack:push(const string &item) /压栈操作 if(full() cerr<<"stack full, cannot push."<<endl; return; top+; sta
28、ckatop=item;string stack:pop(void) /出栈操作 if(empty() cerr<<"stack empty, cannot pop."<<endl; exit(1) ; string item=stackatop; top-; return item;string stack:gettop(void) const /取栈顶操作 if(empty() cerr<<"stack empty, cannot gettop."<<endl; exit(1) ; return sta
29、ckatop;static stack wordStack; /符号栈static int noOfQuet=0; /静态四元式个数记录static int noOfT = 1; /静态状态个数记录void main() /主函数char yesOrNo; /进行一个循环操作控制docout<<"请输入算术表达式:"<<endl;noOfT = 1; /每次结束询问ZMachine();cout<<endl<<"Continue?Yes or Not:" cin>>yesOrNo; /输入“Y”
30、则继续while(yesOrNo='y'); /否则程序结束bool ZMachine() /Z自动机char w;cin>>w;w = EMachine(w); /调用E自动机if(w='#') /遇到“#”则结束return true;elsereturn false;char EMachine(char w) /E自动机string operate,a,b,c;string state5;w = TMachine(w); /调用T自动机while(w='+'|w='-') /是加或减符号operate = w;c
31、in>>w; /读入下一字符w = TMachine(w); /调用T自动机b = wordStack.pop(); /字符栈弹出a = wordStack.pop(); /两个操作字符cout<<"(""<<operate<<"","<<a<<","<<b<<",t"<<noOfT<<")"<<endl;c = "t"+in
32、tToString(noOfT); /输出四元式wordStack.push(c); /新状态压栈noOfT+; /状态计数加一return w;char TMachine(char w)string operate,a,b,c;string state5;w = FMachine(w);/调用F自动机while(w='*'|w='/')/是乘除号operate = w;cin>>w; /读取下一字符w = FMachine(w); /调用F自动机b = wordStack.pop(); /符号栈弹出a = wordStack.pop(); /两个操作字符 cout<<"("&qu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 财务经理录用合同
- 芜湖高新区度展厅装修合同项目竞争性谈判公告
- 仪器设备租赁合同示范文本
- 销售合同书转让协议
- 透析中低血压休克紧急处理
- 小学道德与法治四年级上册 第一单元 与班级共成长 单元作业设计(无答案)
- 1家的意味表格式公开课一等奖创新教学设计 七年级上册道德与法治
- Brand KPIs for ready-made-food DAucy in Brazil-外文版培训课件(2025.2)
- 实验活动 1 氧气的实验室制取与性质教学设计-2024-2025学年九年级化学人教版(2024)上册
- 藏族民间舞蹈的动作组合
- 山东省济宁市邹城市2024-2025学年高一下学期4月期中考试政治试题(含答案)
- 2025年初级社会工作者职业资格考试题库含答案
- 化工企业安全演练计划
- 2025年03月国家粮食和物资储备局直属联系单位(60名)笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025年北师大版中考生物必背考点复习提纲
- 小学创建“五好”学校关工委实施方案
- 2022可调节负荷并网运行与控制技术规范+第4部分-数据模型与存储
- 《食品生产经营企业落实食品安全主体责任监督管理规定》解读与培训
- 2025-2030中国内联pH传感器行业市场发展趋势与前景展望战略研究报告
- 创伤现场急救课件
- T-BSRS 128-2024 核医学放射性废液快速处理技术要求
评论
0/150
提交评论