编译原理课程设计源代码.docx
- 文档编号:9260475
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:21
- 大小:16.05KB
编译原理课程设计源代码.docx
《编译原理课程设计源代码.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计源代码.docx(21页珍藏版)》请在冰点文库上搜索。
编译原理课程设计源代码
#include
#include
usingnamespacestd;
#include
#include
#include
inti,j,k,flag,number,status,m=0,n=0;
/*statuswhichisusetojudgethestringiskeywordsornot!
*/
charch;
charwords[10]={""};
charprogram[500];
intflags[500];//存储输入句子
stringcnt[500];//标识符
inttemp=0;//数组下标
intis_right;//判断输出信息
//-----------------------词法分析-----------------------------
intScan(charprogram[])
{
char*keywords[9]={"int","char","float","if","else","do","while","printf","main"};//关键字
number=0;
status=0;
j=0;
ch=program[i++];
//遍历
while(ch==''||ch=='\n')//跳过空字符(无效输入)
ch=program[i++];
if((ch>='a')&&(ch<='z'))//字母
{
while((ch>='a')&&(ch<='z'))
{
words[j++]=ch;
ch=program[i++];
}
i--;
words[j++]='\0';
for(k=0;k<9;k++)
if(strcmp(words,keywords[k])==0)//判断是否为关键字
switch(k)
{
case0:
{
flag=1;
status=1;
break;
}
case1:
{
flag=2;
status=1;
break;
}
case2:
{
flag=3;
status=1;
break;
}
case3:
{
flag=4;
status=1;
break;
}
case4:
{
flag=5;
status=1;
break;
}
case5:
{
flag=6;
status=1;
break;
}
case6:
{
flag=7;
status=1;
break;
}
case7:
{
flag=8;
status=1;
break;
}
case8:
{
flag=9;
status=1;
break;
}
}
if(status==0)
{
flag=100;//标识符()
}
}
elseif((ch>='0')&&(ch<='9'))//数字()
{
number=0;
while((ch>='0')&&(ch<='9'))
{
number=number*10+(ch-'0');
ch=program[i++];
}
flag=200;
i--;
}
elseswitch(ch)//运算符和标点符号
{
case'=':
{
if(ch=='=')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=401;
}
else
{
i--;
flag=402;
}
break;
}
case'>':
{
if(ch=='>')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=403;
}
else
{
i--;
flag=404;
}
break;
}
case'<':
{
if(ch=='<')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=405;
}
else
{
i--;
flag=406;
}
break;
}
case'!
':
{
if(ch=='!
')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=407;
}
else
{
i--;
flag=408;
}
break;
}
case'+':
{
if(ch=='+')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=409;
}
elseif(ch=='+')
{
words[j++]=ch;
words[j]='\0';
flag=410;
}
else
{
i--;
flag=411;
}
break;
}
case'-':
{
if(ch=='-')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=412;
}
elseif(ch=='-')
{
words[j++]=ch;
words[j]='\0';
flag=413;
}
else
{
i--;
flag=414;
}
break;
}
case'*':
{
if(ch=='*')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=415;
}
else
{
i--;
flag=416;
}
break;
}
case'/':
{
if(ch=='/')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=417;
}
else
{
i--;
flag=418;
}
break;
}
case'^':
{
words[j]=ch;
words[j+1]='\0';
flag=419;
break;
}
case';':
{
words[j]=ch;
words[j+1]='\0';
flag=501;
break;
}
case'(':
{
words[j]=ch;
words[j+1]='\0';
flag=502;
break;
}
case')':
{
words[j]=ch;
words[j+1]='\0';
flag=503;
break;
}
case'[':
{
words[j]=ch;
words[j+1]='\0';
flag=504;
break;
}
case']':
{
words[j]=ch;
words[j+1]='\0';
flag=505;
break;
}
case'{':
{
words[j]=ch;
words[j+1]='\0';
flag=506;
break;
}
case'}':
{
words[j]=ch;
words[j+1]='\0';
flag=507;
break;
}
case':
':
{
words[j]=ch;
words[j+1]='\0';
flag=508;
break;
}
case'"':
{
words[j]=ch;
words[j+1]='\0';
flag=509;
break;
}
case'%':
{
if(ch=='%')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=510;
}
else
{
i--;
flag=511;
}
break;
}
case',':
{
words[j]=ch;
words[j+1]='\0';
flag=512;
break;
}
case'#':
{
words[j]=ch;
words[j+1]='\0';
flag=513;
break;
}
case'@':
{
words[j]=ch;
words[j+1]='\0';
flag=514;
break;
}
case'':
//空格
{
words[j]='_';
words[j+1]='\0';
flag=515;
break;
}
case'$':
{
words[j]='#';
words[j+1]='\0';
flag=0;
break;
}
default:
{
flag=-1;
break;
}
}
returnflag;
}
//------------------语法分析(递归下降)---------------------------
voids();
voids1();
voide();
voide1();
voidt();
voidt1();
voidf();
voids()
{
cout<<"S->ES'"< e(); s1(); } voids1() { if(flags[temp]==404) { cout<<"S'->>E"< temp++; e(); } elseif(flags[temp]==406) { cout<<"S'-> temp++; e(); } elseif(flags[temp]! =0||flags[temp]! =503) { cout<<"S'->^"< temp++; return; } else is_right=0; } voide() { cout<<"E->TE'"< t(); e1(); } voide1() { if(flags[temp]==411) { cout<<"E'->+T"< temp++; t(); } elseif(flags[temp]==414) { cout<<"E'->-T"< temp++; t(); } elseif(flags[temp]! =0||flags[temp]! =503) { cout<<"E'->^"< temp++; return; } else is_right=0; } voidt() { cout<<"T->FT'"< f(); t1(); } voidt1() { if(flags[temp]==416) { cout<<"T'->*F"< temp++; f(); } elseif(flags[temp]==418) { cout<<"T'->/F"< temp++; f(); } elseif(flags[temp]! =0||flags[temp]! =503) { cout<<"T'->^"< temp++; return; } elseis_right=0; } voidf() { if(flags[temp]==100||flags[temp]==200) { cout<<"F->i"< temp++; if(flags[temp]==402) { cout<<"F->=E"< temp++; e(); } } else if(flags[temp]==502) { cout<<"P->(E)"< temp++; e(); if(flags[temp]==503) { cout<<"P->(E)"< temp++; } else is_right=0; } elseis_right=0; } voidmain() { inti=0,num=0; cout<<"请输入测试程序或者表达式,以$结束"< do { ch=getchar(); program[i++]=ch; }while(ch! ='$'); i=0; cout<<"词法分析: "< do{ flag=Scan(program);//词法分析 if(flag==200) { cout<<"("< flags[num]=flag; stringstreamstream; stream< stream>>cnt[num]; stream.clear(); num++; } elseif(flag==-1) { cout<<"error! "< } else { cout<<"("< if(flag! =515) { flags[num]=flag; cnt[num]=words; num++; } } }while(flag! =0); flags[num]=0; is_right=1; cout<<"语法分析: "< s(); if((flags[temp]==0)&&is_right) { cout<<"分析成功"< temp=0; } else cout<<"分析失败"< system("pause"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程设计 源代码