词法分析程序源代码C++版本编译原理实验.docx
- 文档编号:3165920
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:16
- 大小:17.09KB
词法分析程序源代码C++版本编译原理实验.docx
《词法分析程序源代码C++版本编译原理实验.docx》由会员分享,可在线阅读,更多相关《词法分析程序源代码C++版本编译原理实验.docx(16页珍藏版)》请在冰点文库上搜索。
词法分析程序源代码C++版本编译原理实验
/*实验1词法分析源码已经通过VS2010调试,亲测可用,有打开文件操作(在工程文件夹里建一个program.txt,输入程序串即可)。
也可从键盘直接输入源码,后面的语法分析也能用的上,欢迎使用。
*/
#include
#include
#include
usingnamespacestd;
voidKeyFunction();
voidReadTxt();
voidmain()
{
intchoose;
cout<<"(1,2)"< cin>>choose; if(choose==1) { cout<<"请输入程序段: 以#结束: "< KeyFunction(); } if(choose==2) { ReadTxt(); } } voidKeyFunction() { inti=0,j,k=0,state=1,f=0,linenum=1; chara[12][10]={"const","var","call","begin","if","while","do","odd","end","then","procedure","int"}; charb,d[40]={"\0"}; b=getchar(); while(b! ='#')/*判断所输入字符是否为结束符*/ { if(b==''||b=='\n'||b=='\t')/*滤过空格、换行等分隔符号*/ { if(b='\n')linenum++; b=getchar(); } elseif((b>='a'&&b<='z')||(b>='A'&&b<='Z'))/*识别标识符以及保留字*/ { d[i++]=b; b=getchar(); while((b>='a'&&b<='z')||(b>='A'&&b<='Z')||(b>='0'&&b<='9')) { d[i++]=b; b=getchar(); } for(j=0;j<12;j++)/*查询保留字表确定该单词是否是保留字*/ { if(strcmp(d,a[j])==0) { cout<<"关键字"< k=1; break; } } if(k==0)/*在保留字表中没有查到该单词,是标识符*/ cout<<"标识符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; k=0; } elseif(b>='0'&&b<='9')/*识别常数*/ { d[i++]=b; b=getchar(); while(f! =1) { switch(state){ case1: if(b>='0'&&b<='9') { state=1; d[i++]=b; b=getchar(); } elseif(b=='.'){state=2;d[i++]=b;b=getchar();} elseif(b=='E'){state=4;d[i++]=b;b=getchar();} elsestate=7; break; case2: if(b>='0'&&b<='9') { state=3; d[i++]=b; b=getchar(); } elsestate=8; break; case3: if(b>='0'&&b<='9'){ state=3; d[i++]=b; b=getchar();} elseif(b=='#'){state=4;d[i++]=b;b=getchar();} elsestate=7; break; case4: if(b=='+'||b=='-'){state=5;d[i++]=b;b=getchar();} elseif(b>='0'&&b<='9'){state=6;d[i++]=b;b=getchar();} elsestate=8; break; case5: if(b>='0'&&b<='9'){state=6;d[i++]=b;b=getchar();} elsestate=8; break; case6: if(b>='0'&&b<='9'){state=6;d[i++]=b;b=getchar();} elsestate=7; break; case7: f=1;break; case8: f=1;break; } } if(state==7&&(b<'a'||b>'z')&&(b<'A'||b>'Z')) cout<<"数字"< elseif(state==7&&(b>='a'&&b<='z')||(b>='A'&&b<='Z'))/*数字后接字母的出错控制*/ { while((b>='a'&&b<='z')||(b>='A'&&b<='Z')) { d[i++]=b; b=getchar(); } cout<<"errorline! "< } elsecout<<"errorline! "< for(j=0;j<=i;j++) d[j]='\0'; i=0; f=0; state=1; } elseif(b=='<')/*识别'<'、'<='和'<>'*/ { d[i++]=b; b=getchar(); if(b=='='||b=='>') { d[i++]=b; b=getchar(); cout<<"运算符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; } else { cout<<"运算符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; } } elseif(b=='>')/*识别'>'和'>='*/ { d[i++]=b; b=getchar(); if(b=='=') { d[i++]=b; b=getchar(); cout<<"运算符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; } else { cout<<"运算符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; } } elseif(b==': ')/*识别': ='*/ { d[i++]=b; b=getchar(); if(b=='=') { d[i++]=b; b=getchar(); cout<<"符号"< } elsecout<<"errorline! "< for(j=0;j<=i;j++) d[j]='\0'; i=0; } elseif(b=='*'||b=='+'||b=='-'||b=='/'||b=='=')/*识别运算符*/ { cout<<"运算符"< b=getchar(); } elseif(b=='('||b==')'||b==','||b==';'||b=='.')/*识别分隔符*/ { cout<<"分隔符"< b=getchar(); } else { cout<<"errorline! "< b=getchar(); } } } voidReadTxt() { ifstreamout; out.open("program.txt"); inti=0,j,k=0,state=1,f=0,linenum=1; chara[12][10]={"const","var","call","begin","if","while","do","odd","end","then","procedure","int"}; charb,d[40]={"\0"}; b=out.get(); while(b! ='#')/*判断所输入字符是否为结束符*/ { if(b==''||b=='\n'||b=='\t')/*滤过空格、换行等分隔符号*/ { if(b='\n')linenum++; b=out.get(); } elseif((b>='a'&&b<='z')||(b>='A'&&b<='Z'))/*识别标识符以及保留字*/ { d[i++]=b; b=out.get(); while((b>='a'&&b<='z')||(b>='A'&&b<='Z')||(b>='0'&&b<='9')) { d[i++]=b; b=out.get(); } for(j=0;j<12;j++)/*查询保留字表确定该单词是否是保留字*/ { if(strcmp(d,a[j])==0) { cout<<"关键字"< k=1; break; } } if(k==0)/*在保留字表中没有查到该单词,是标识符*/ cout<<"标识符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; k=0; } elseif(b>='0'&&b<='9')/*识别常数*/ { d[i++]=b; b=out.get(); while(f! =1) { switch(state){ case1: if(b>='0'&&b<='9') { state=1; d[i++]=b; b=out.get(); } elseif(b=='.'){state=2;d[i++]=b;b=getchar();} elseif(b=='E'){state=4;d[i++]=b;b=getchar();} elsestate=7; break; case2: if(b>='0'&&b<='9') { state=3; d[i++]=b; b=out.get(); } elsestate=8; break; case3: if(b>='0'&&b<='9'){ state=3; d[i++]=b; b=out.get(); } elseif(b=='#'){state=4;d[i++]=b;b=out.get();} elsestate=7; break; case4: if(b=='+'||b=='-'){state=5;d[i++]=b;b=out.get();} elseif(b>='0'&&b<='9'){state=6;d[i++]=b;b=out.get();} elsestate=8; break; case5: if(b>='0'&&b<='9'){state=6;d[i++]=b;b=out.get();} elsestate=8; break; case6: if(b>='0'&&b<='9'){state=6;d[i++]=b;b=out.get();} elsestate=7; break; case7: f=1;break; case8: f=1;break; } } if(state==7&&(b<'a'||b>'z')&&(b<'A'||b>'Z')) cout<<"数字"< elseif(state==7&&(b>='a'&&b<='z')||(b>='A'&&b<='Z'))/*数字后接字母的出错控制*/ { while((b>='a'&&b<='z')||(b>='A'&&b<='Z')) { d[i++]=b; b=out.get(); } cout<<"errorline! "< } elsecout<<"errorline! "< for(j=0;j<=i;j++) d[j]='\0'; i=0; f=0; state=1; } elseif(b=='<')/*识别'<'、'<='和'<>'*/ { d[i++]=b; b=out.get(); if(b=='='||b=='>') { d[i++]=b; b=out.get(); cout<<"运算符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; } else { cout<<"运算符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; } } elseif(b=='>')/*识别'>'和'>='*/ { d[i++]=b; b=out.get(); if(b=='=') { d[i++]=b; b=out.get(); cout<<"运算符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; } else { cout<<"运算符"< for(j=0;j<=i;j++) d[j]='\0'; i=0; } } elseif(b==': ')/*识别': ='*/ { d[i++]=b; b=out.get(); if(b=='=') { d[i++]=b; b=out.get(); cout<<"符号"< } else cout<<"errorline! "< for(j=0;j<=i;j++) d[j]='\0'; i=0; } elseif(b=='*'||b=='+'||b=='-'||b=='/'||b=='=')/*识别运算符*/ { cout<<"运算符"< b=out.get(); } elseif(b=='('||b==')'||b==','||b==';'||b=='.')/*识别分隔符*/ { cout<<"分隔符"< b=out.get(); } else { cout<<"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"< cout<<"errorline! "< b=out.get(); } } out.close(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析 程序 源代码 C+ 版本 编译 原理 实验