编译原理实验词法分析语法分析.docx
- 文档编号:29307313
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:35
- 大小:19.83KB
编译原理实验词法分析语法分析.docx
《编译原理实验词法分析语法分析.docx》由会员分享,可在线阅读,更多相关《编译原理实验词法分析语法分析.docx(35页珍藏版)》请在冰豆网上搜索。
编译原理实验词法分析语法分析
本代码只供学习参考:
词法分析源代码:
#include
#include
#include
usingnamespacestd;
stringkey[8]={"do","end","for","if","printf","scanf","then","while"};
stringoptr[4]={"+","-","*","/"};
stringseparator[6]={",",";","{","}","(",")"};
charch;
//判断是否为保留字
boolIsKey(stringss){
inti;
for(i=0;i<8;i++)
if(!
strcmp(key[i].c_str(),ss.c_str()))
returntrue;
returnfalse;
}
//字母判断函数
boolIsLetter(charc){
if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z')))
returntrue;
returnfalse;
}
//数字判断函数
boolIsDigit(charc){
if(c>='0'&&c<='9')
returntrue;
returnfalse;
}
//运算符判断函数
boolIsOptr(stringss){
inti;
for(i=0;i<4;i++)
if(!
strcmp(optr[i].c_str(),ss.c_str()))
returntrue;
returnfalse;
}
//分界符判断函数
boolIsSeparator(stringss){
inti;
for(i=0;i<6;i++)
if(!
strcmp(separator[i].c_str(),ss.c_str()))
returntrue;
returnfalse;
}
voidanalyse(ifstream&in){
stringst="";
charch;
intline=1,row=0;
while((in.get(ch))){
st="";
if((ch=='')||(ch=='\t')){}//空格,tab健
else
if(ch=='\n'){line++;row=0;}//换行行数加一处理
else
if(IsLetter(ch))//关键字、标识符的处理
{
row++;
while(IsLetter(ch)||IsDigit(ch))
{
st+=ch;
in.get(ch);
}
in.seekg(-1,ios:
:
cur);//文件指针(光标)后退一个字节
if(IsKey(st))//判断是否为关键字查询关键字表;
cout< else//否则为标示符 cout< } else if(IsDigit(ch))//无符号整数处理 { row++; while(IsDigit(ch)) {st+=ch; ch=in.get(); } in.seekg(-1,ios: : cur); cout< //break; } else {st=""; st+=ch; if(IsOptr(st))//运算符处理 { row++; cout< } else if(IsSeparator(st))//分隔符处理 {row++; cout< } else{ switch(ch){row++; case'=': {row++;cout<<"="<<"\t("<<"="<<","<<"6"<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("< case'>': {row++;ch=in.get(); if(ch=='=')cout<<">="<<'\t'<<"("<<">="<<","<<"6"<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("< else{cout<<">"<<"\t("<<">"<<","<<"6"<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("< in.seekg(-1,ios: : cur);} }break; case'<': {row++;ch=in.get(); if(ch=='=')cout<<"<="<<'\t'<<"("<<"="<<","<<"6"<<")"<<"\t关系运算符"<<'\t'<<"("< elseif(ch=='>')cout<<"<>"<<'\t'<<"("<<"<>"<<","<<"6"<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("< else{cout<<"<"<<"\t("<<"<"<<","<<"6"<<")"<<"\t"<<"\t关系运算符"<<'\t'<<"("< in.seekg(-1,ios: : cur);} }break; default: {row++;cout< } }} } } intmain() { ifstreamin; in.open("test.txt",ios: : in); cout<<"关键字-》1标识符-》2常数-》3运算符-》4分隔符-》5"< if(in.is_open()) { analyse(in); in.close(); system("pause"); } else cout<<"文件操作出错"< } 语法分析实验源代码LL #include usingnamespacestd; constintMaxLen=20;//初始化栈的长度 constintLength=20;//初始化数组长度 charVn[5]={'E','G','T','S','F'};//非终结符数组 charVt[8]={'i','(',')','+','-','*','/','#'};//终结符数组 charch,X;//ch读当前字符,X获取栈顶元素 charstrToken[Length];//存储规约表达式 structLL//ll (1)分析表的构造字初始化 { char*c; }; LLE[8]={"TG","TG","error","error","error","error","error","error"}; LLG[8]={"error","error","null","+TG","-TG","error","error","null"}; LLT[8]={"FS","FS","error","error","error","error","error","error"}; LLS[8]={"error","error","null","null","null","*FS","/FS","null"}; LLF[8]={"i","(E)","error","error","error","error","error","error"}; classstack//栈的构造及初始化 { public: stack();//初始化 boolempty()const;//是否为空 boolfull()const;//是否已满 boolget_top(char&c)const;//取栈顶元素 boolpush(constcharc);//入栈 boolpop();//删除栈顶元素 voidout();//输出栈中元素 ~stack(){}//析构 private: intcount;//栈长度 chardata[MaxLen];//栈中元素 }; stack: : stack() { count=0; } boolstack: : empty()const { if(count==0) returntrue; returnfalse; } boolstack: : full()const { if(count==MaxLen) returntrue; returnfalse; } boolstack: : get_top(char&c)const { if(empty()) returnfalse; else { c=data[count-1]; returntrue; } } boolstack: : push(constcharc) { if(full()) returnfalse; data[count++]=c; returntrue; } boolstack: : pop() { if(empty()) returnfalse; count--; returntrue; } voidstack: : out() { for(inti=0;i cout< cout<<'\t'; } intlength(char*c) { intl=0; for(inti=0;c[i]! ='\0';i++) l++; returnl; } voidprint(inti,char*c)//剩余输入串的输出 { for(intj=i;j cout< cout<<'\t'; } voidrun() { boolflag=true;//循环条件 intstep=0,point=0;//步骤、指针 intlen;//长度 cout<<"输入规约的字符串: "< cin>>strToken; ch=strToken[point++];//读取第一个字符 stacks; s.push('#');//栈中数据初始化 s.push('E'); s.get_top(X);//取栈顶元素 cout<<"步骤\t"<<"分析栈\t"<<"剩余输入串\t\t"<<"所用产生式\t"<<"动作"< cout< s.out(); print(point-1,strToken); cout<<'\t'<<"初始化"< while(flag) { if((X==Vt[0])||(X==Vt[1])||(X==Vt[2])||(X==Vt[3])||(X==Vt[4])||(X==Vt[5])||(X==Vt[6]))//判断是否为终结符(不包括#) { if(X==ch)//终结符,识别,进行下一字符规约 { s.pop(); s.get_top(X); ch=strToken[point++]; cout< s.out(); print(point-1,strToken); cout<<'\t'<<"GETNEXT(I)"< } else { flag=false; } } elseif(X=='#')//规约结束 { if(X==ch) { cout< s.out(); print(point-1,strToken); cout< s.pop(); flag=false; } else { flag=false; } } elseif(X==Vn[0])//非终结符E { for(inti=0;i<8;i++)//查分析表 if(ch==Vt[i]) { if(strcmp(E[i].c,"error")==0)//出错 { flag=false; } else{//对形如X->X1X2的产生式进行入栈操作 s.pop(); len=length(E[i].c)-1; for(intj=len;j>=0;j--) s.push(E[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intj=len;j>=0;j--) cout< cout<<")"< s.get_top(X); } } } elseif(X==Vn[1])//同上,处理G { for(inti=0;i<8;i++) if(ch==Vt[i]) { if(strcmp(G[i].c,"null")==0) { s.pop(); cout< s.out(); print(point-1,strToken); cout< s.get_top(X); } elseif(strcmp(G[i].c,"error")==0) { flag=false; } else{ s.pop(); len=length(G[i].c)-1; for(intj=len;j>=0;j--) s.push(G[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intj=len;j>=0;j--) cout< cout<<")"< s.get_top(X); } } } elseif(X==Vn[2])//同上处理T { for(inti=0;i<8;i++) if(ch==Vt[i]) { if(strcmp(T[i].c,"error")==0) { flag=false; } else{ s.pop(); len=length(T[i].c)-1; for(intj=len;j>=0;j--) s.push(T[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intj=len;j>=0;j--) cout< cout<<")"< s.get_top(X); } } } elseif(X==Vn[3])//同上处理S { for(inti=0;i<8;i++) if(ch==Vt[i]) { if(strcmp(S[i].c,"null")==0) { s.pop(); cout< s.out(); print(point-1,strToken); cout< s.get_top(X); } elseif(strcmp(S[i].c,"error")==0) { flag=false; } else{ s.pop(); len=length(S[i].c)-1; for(intj=len;j>=0;j--) s.push(S[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intj=len;j>=0;j--) cout< cout<<")"< s.get_top(X); } } } elseif(X==Vn[4])//同上处理F { for(inti=0;i<7;i++) if(ch==Vt[i]) { if(strcmp(F[i].c,"error")==0) { flag=false; } else{ s.pop(); len=length(F[i].c)-1; for(intj=len;j>=0;j--) s.push(F[i].c[j]); cout< s.out(); print(point-1,strToken); cout< for(intj=len;j>=0;j--) cout< cout<<")"< s.get_top(X); } } } else//出错处理 { flag=false; } } } intmain() { cout<<"实验二"< run(); system("pause"); return0; } 语法实验源代码LR #include usingnamespacestd; constintMaxLen=20;//初始化栈的长度 constintLength=20;//初始化数组长度 charch,Y;//全局变量,ch用于读当前字符,Y用于获取栈顶元素 charstrToken[Length];//存储规约表达式 boolflag=true;//循环条件 intpoint=0,step=1;//步骤、指针 classstack//栈的构造及初始化 { public: stack();//初始化 boolempty()const;//是否为空 boolfull()const;//是否已满 boolget_top(char&c)const;//取栈顶元素 boolpush(constcharc);//入栈 boolpop(); voidout();//输出栈中元素 voidout1(); ~stack(){}//析构 private: intcount;//栈长度 chardata[MaxLen];//栈中元素 }; stackl,r;//l代表符号栈,r代表状态栈 stack: : stack() { count=0; } boolstack: : empty()const { if(count==0) returntrue; returnfalse; } boolstack: : full()const { if(count==MaxLen) returntrue; returnfalse; } boolstack: : get_top(char&c)const { if(empty()) returnfalse; else { c=data[count-1]; returntrue; } } boolstack: : push(constcharc) { if(full()) returnfalse; data[count++]=c; returntrue; } boolstack: : pop() { if(empty()) returnfalse; count--; returntrue; } voidstack: : out() { for(inti=0;i cout< cout<<'\t'; } voidstack: : out1() { for(inti=0;i cout< cout<<'\t'; } voidprint(inti,char*c)//剩余输入串的输出 { for(intj=i;j cout< cout<<'\t'; } voidGoto(inti,charc)//状态转换函数,对应于表中GOTO { if(i==0) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 词法 分析 语法分析