编译原理课程设计词法分析语法分析语义分析代码生成.docx
- 文档编号:28680815
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:44
- 大小:34.83KB
编译原理课程设计词法分析语法分析语义分析代码生成.docx
《编译原理课程设计词法分析语法分析语义分析代码生成.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计词法分析语法分析语义分析代码生成.docx(44页珍藏版)》请在冰豆网上搜索。
编译原理课程设计词法分析语法分析语义分析代码生成
#include
#include
#include
#include
#include
#include
usingnamespacestd;
/*********************下面是一些重要数据结构的声明***************************/
structtoken//词法token结构体
{
intcode;//编码
intnum;//递增编号
token*next;
};
token*token_head,*token_tail;//token队列
structstr//词法string结构体
{
intnum;//编号
stringword;//字符串内容
str*next;
};
str*string_head,*string_tail;//string队列
structivan//语法产生式结构体
{
charleft;//产生式的左部
stringright;//产生式的右部
intlen;//产生式右部的长度
};
ivancss[20];//语法20个产生式
structpank//语法action表结构体
{
charsr;//移进或归约
intstate;//转到的状态编号
};
pankaction[46][18];//action表
intgo_to[46][11];//语法go_to表
structike//语法分析栈结构体,双链
{
ike*pre;
intnum;//状态
intword;//符号编码
ike*next;
};
ike*stack_head,*stack_tail;//分析栈首尾指针
structL//语义四元式的数据结构
{
intk;
stringop;//操作符
stringop1;//操作数
stringop2;//操作数
stringresult;//结果
L*next;//语义四元式向后指针
L*Ltrue;//回填true链向前指针
L*Lfalse;//回填false链向前指针
};
L*L_four_head,*L_four_tail,*L_true_head,*L_false_head;//四元式链,true链,false链
structsymb//语义输入时符号表
{
stringword;//变量名称
intaddr;//变量地址
symb*next;
};
symb*symb_head,*symb_tail;//语义符号链表
/*********************下面是与词法分析相关的一些函数的声明***************************/
voidscan();//按字符读取源文件
voidcifa_main();//词法分析主程序
intjudge(charch);//判断输入字符的类型
voidout1(charch);//写入token.txt
voidout3(charch,stringword);//写入string.txt
voidinput1(token*temp);//插入结点到队列token
voidinput3(str*temp);//插入结点到队列string
voidoutput();//输出三个队列的内容
voidoutfile();//输出三个队列的内容到相应文件中
/*********************下面是与语法分析相关的一些函数的声明***************************/
voidyufa_main();//语法分析主程序
voidyufa_initialize();//初始化语法分析数据结构
intyufa_SLR1(inta);//语法分析主体部分
intID1(inta);//给输入字符编号,转化成action表列编号
stringID10(inti);//给输入字符反编号
intID2(charch);//给非终结状态编号,转化成go_to表列编号
intID20(charch);//给非终结状态编号
charID21(intj);//给非终结状态反编号
voidadd(ike*temp);//给ike分析栈链表增加一个结点
voiddel();//给ike分析栈链表删除一个结点
/*********************下面是与语义分析相关的一些函数的声明***************************/
voidyuyi_main(intm);//语义分析主程序
voidadd_L_four(L*temp);//向四元式链中加一个结点
voidadd_L_true(L*temp);//向true链中加一个结点
voidadd_L_false(L*temp);//向false链中加一个结点
voidadd_symb(symb*temp);//向语义符号表链中加一个结点
voidoutput_yuyi();//输出中间代码四元式和最后符号表
stringnewop(intm);//把数字变成字符串
stringid_numtoname(intnum);//把编号转换成相应的变量名
intlookup(stringm);//变量声明检查
/*********************下面是一些全局变量的声明***************************/
FILE*fp;//文件指针
intwordcount;//标志符计数
interr;//标志词法分析结果正确或错误
intnl;//读取行数
intyuyi_linshi;//语义临时变量
stringE_name,T_name,F_name,M_name,id_name,id1_name,id2_name,errword;//用于归约时名称传递和未声明变量的输出
intid_num,id1_num,id2_num,id_left,id_while,id_then,id_do;//用于记录一些特殊的字符位置信息
/****************************主程序开始**************************/
intmain()
{
cout<<"************************"< cout<<"*说明: *"< cout<<"*第一部分: 词法分析*"< cout<<"*第二部分: 语法分析*"< cout<<"*第三部分: 语义分析*"< cout<<"************************"< cifa_main();//词法 yufa_main();//语法 output_yuyi();//语义 cout< system("pause"); return(0); } /****************************以上是主程序,以下是词法**************************/ voidcifa_main() { token_head=newtoken; token_head->next=NULL; token_tail=newtoken; token_tail->next=NULL; string_head=newstr; string_head->next=NULL; string_tail=newstr; string_tail->next=NULL;//初始化三个队列的首尾指针 L_four_head=newL; L_four_head->next=NULL; L_four_tail=newL; L_four_tail->k=0; L_four_tail->next=NULL; L_true_head=newL; L_true_head->Ltrue=NULL; L_false_head=newL; L_false_head->Lfalse=NULL; symb_head=newsymb; symb_head->next=NULL; symb_tail=newsymb; symb_tail->next=NULL; yuyi_linshi=-1; id_num=0; wordcount=0;//初始化字符计数器 err=0;//初始化词法分析错误标志 nl=1;//初始化读取行数 scan(); if(err==0) { charm; output(); cout<<"词法分析正确完成! "< "; cin>>m; cout< if(m=='y') { outfile(); cout<<"结果成功保存在token.txt和sting.txt两个文件中,请打开查看"< cout< } } } voidscan() { cout< system("pause"); cout< charch; stringword; chardocument[50]; intflag=0; cout<<"请输入源文件路径及名称: "; cin>>document; cout< cout<<"************************"< cout<<"*第一部分: 词法分析*"< cout<<"************************"< if((fp=fopen(document,"rt"))==NULL) { err=1; cout<<"无法找到该文件! "< return; } while(! feof(fp)) { word=""; ch=fgetc(fp); flag=judge(ch); if(flag==1) out1(ch); elseif(flag==3) out3(ch,word); elseif(flag==4||flag==5||flag==6) continue; else { cout< 非法字符! "< err=1; } } fclose(fp); } intjudge(charch) { intflag=0; if(ch=='='||ch=='+'||ch=='*'||ch=='>'||ch==': '||ch==';'||ch=='{'||ch=='}'||ch=='('||ch==')') flag=1;//界符 elseif(('a'<=ch&&ch<='z')||('A'<=ch&&ch<='Z')) flag=3;//字母 elseif(ch=='') flag=4;//空格 elseif(feof(fp)) flag=5;//结束 elseif(ch=='\n') { flag=6;//换行 nl++; } else flag=0;//非法字符 return(flag); } voidout1(charch) { intid; switch(ch) { case'=': id=1;break; case'+': id=2;break; case'*': id=3;break; case'>': id=4;break; case': ': id=5;break; case';': id=6;break; case'{': id=7;break; case'}': id=8;break; case'(': id=9;break; case')': id=10;break;//界符编码 default: id=0; } token*temp; temp=newtoken; temp->code=id; temp->num=-1; temp->next=NULL; input1(temp); return; } voidout3(charch,stringword) { token*temp; temp=newtoken; temp->code=-1; temp->num=-1; temp->next=NULL; str*temp1; temp1=newstr; temp1->num=-1; temp1->word=""; temp1->next=NULL; intflag=0; word=word+ch; ch=fgetc(fp); flag=judge(ch); if(flag==1||flag==4||flag==5||flag==6) { if(word=="and"||word=="if"||word=="then"||word=="while"||word=="do"||word=="int") { if(word=="and") temp->code=31; elseif(word=="if") temp->code=32; elseif(word=="then") temp->code=33; elseif(word=="while") temp->code=35; elseif(word=="do") temp->code=36; elseif(word=="int") temp->code=37;//关键字编码 input1(temp); if(flag==1) out1(ch); elseif(flag==4||flag==5||flag==6) return; } elseif(flag==1) { wordcount++; temp->code=25; temp->num=wordcount; input1(temp); temp1->num=wordcount; temp1->word=word; input3(temp1); out1(ch); } elseif(flag==4||flag==5||flag==6) { wordcount++; temp->code=25; temp->num=wordcount; input1(temp); temp1->num=wordcount; temp1->word=word; input3(temp1); } return; } elseif(flag==2||flag==3) out3(ch,word);//形成字符串 else { err=1; cout< 非法字符! "< return; } } voidinput1(token*temp) { if(token_head->next==NULL) { token_head->next=temp; token_tail->next=temp; } else { token_tail->next->next=temp; token_tail->next=temp; } } voidinput3(str*temp) { if(string_head->next==NULL) { string_head->next=temp; string_tail->next=temp; } else { string_tail->next->next=temp; string_tail->next=temp; } } voidoutput() { cout<<"token表内容如下: "< token*temp1; temp1=newtoken; temp1=token_head->next; while(temp1! =NULL) { cout< if(temp1->num==-1) { cout< } else { cout<<""< } temp1=temp1->next; } cout<<"符号表内容如下: "< str*temp3; temp3=newstr; temp3=string_head->next; while(temp3! =NULL) { cout< temp3=temp3->next; } } voidoutfile() { ofstreamfout1("token.txt");//写文件 ofstreamfout3("string.txt"); token*temp1; temp1=newtoken; temp1=token_head->next; while(temp1! =NULL) { fout1< if(temp1->num==-1) fout1< else fout1<<""< temp1=temp1->next; } str*temp3; temp3=newstr; temp3=string_head->next; while(temp3! =NULL) { fout3< temp3=temp3->next; } } /****************************以上是词法,以下是语法**************************/ voidyufa_main() { if(err==0) { system("pause"); cout< cout<<"************************"< cout<<"*第二部分: 语法分析*"< cout<<"************************"< yufa_initialize();//初始化语法分析数据结构 token*temp; temp=newtoken; temp=token_head->next; intp,q; p=0; q=0; cout<<"语法分析过程如下: "< while(temp! =NULL) { intw; w=ID1(temp->code); p=yufa_SLR1(w); if(p==1)break; if(p==0) temp=temp->next; if(temp==NULL)q=1; }//语法分析 if(q==1) while (1) { p=yufa_SLR1(17); if(p==3)break; }//最后输入$来完成语法分析 } } voidyufa_initialize() { stack_head=newike; stack_tail=newike; stack_head->pre=NULL; stack_head->next=stack_tail; stack_head->num=0; stack_head->word='! '; stack_tail->pre=stack_head; stack_tail->next=NULL;//初始化栈分析链表 css[0].left='Q'; css[0].right="P"; css[1].left='P'; css[1].right="id()L;R"; css[2].left='L'; css[2].right="L;D"; css[3].left='L'; css[3].right="D"; css[4].left='D'; css[4].right="id: int"; css[5].left='E'; css[5].right="E+T"; css[6].left='E'; css[6].right="T"; css[7].left='T'; css[7].right="T*F"; css[8].left='T'; css[8].right="F"; css[9].left='F'; css[9].right="(E)"; css[10].left='F'; css[10].right="id"; css[11].left='B'; css[11].right="BandB"; css[12].left='B'; css[12].right="id>id"; css[13].left='M'; css[13].right="id=E"; css[14].left='S'; css[14].right="ifBthenM"; css[15].left='S'; css[15].right="whileBdoM"; css[16].left='S'; css[16].right="M"; css[17].left='N'; css[17].right="N;S"; css[18].left='N'; css[18].right="S"; css[19].left='R'; css[19].right="{N}"; inti,j; for(i=0;i<20;i++) { char*css_len; css_len=&css[i].right[0]; css[i].len=strlen(css_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 词法 分析 语法 语义 代码 生成
![提示](https://static.bdocx.com/images/bang_tan.gif)