LR0分析法编译原理实验.docx
- 文档编号:9433375
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:20
- 大小:71.43KB
LR0分析法编译原理实验.docx
《LR0分析法编译原理实验.docx》由会员分享,可在线阅读,更多相关《LR0分析法编译原理实验.docx(20页珍藏版)》请在冰点文库上搜索。
LR0分析法编译原理实验
代码清单:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineMAX507
#defineDEBUG
usingnamespacestd;
classWF
{
public:
stringleft,right;
intback;
intid;
WF(chars1[],chars2[],intx,inty)
{
left=s1;
right=s2;
back=x;
id=y;
}
WF(conststring&s1,conststring&s2,intx,inty)
{
left=s1;
right=s2;
back=x;
id=y;
}
booloperator<(constWF&a)const
{
if(left==a.left)
returnright returnleft } booloperator==(constWF&a)const { return(left==a.left)&&(right==a.right); } voidprint() { printf("%s->%s\n",left.c_str(),right.c_str()); } }; classClosure { public: vector voidprint(stringstr) { printf("%-15s%-15s\n","",str.c_str()); for(inti=0;i element[i].print(); } booloperator==(constClosure&a)const { if(a.element.size()! =element.size())returnfalse; for(inti=0;i if(element[i]==a.element[i])continue; elsereturnfalse; returntrue; } }; structContent { inttype; intnum; stringout; Content(){type=-1;} Content(inta,intb) : type(a),num(b){} }; vector map stringstart="S"; vector vector charCH='$'; intgo[MAX][MAX]; intto[MAX]; vector boolused[MAX]; Contentaction[MAX][MAX]; intGoto[MAX][MAX]; voidmake_item() { memset(to,-1,sizeof(-1)); for(inti=0;i for(intj=0;j<=wf[i].right.length();j++) { stringtemp=wf[i].right; temp.insert(temp.begin()+j,CH); dic[wf[i].left].push_back(items.size()); if(j) to[items.size()-1]=items.size(); items.push_back(WF(wf[i].left,temp,i,items.size())); } #ifdefDEBUG puts("-------------------------项目表-------------------------"); for(inti=0;i printf("%s->%s\n",items[i].left.c_str(),items[i].right.c_str()); puts("--------------------------------------------------------"); #endif } voidmake_set() { boolhas[MAX]; for(inti=0;i if(items[i].left[0]=='S'&&items[i].right[0]==CH) { Closuretemp; string&str=items[i].right; vector element.push_back(items[i]); intx=0; for(x=0;x if(str[x]==CH) break; memset(has,0,sizeof(has)); has[i]=1; if(x! =str.length()-1) { queue q.push(str.substr(x+1,1)); while(! q.empty()) { stringu=q.front(); q.pop(); vector for(intj=0;j { inttx=id[j]; if(items[tx].right[0]==CH) { if(has[tx])continue; has[tx]=1; if(isupper(items[tx].right[1])) q.push(items[tx].right.substr(1,1)); element.push_back(items[tx]); } } } } collection.push_back(temp); } for(inti=0;i { map for(intj=0;j { stringstr=collection[i].element[j].right; intx=0; for(;x if(str[x]==CH)break; if(x==str.length()-1) continue; inty=str[x+1]; intii; str.erase(str.begin()+x); str.insert(str.begin()+x+1,CH); WFcmp=WF(collection[i].element[j].left,str,-1,-1); for(intk=0;k if(items[k]==cmp) { ii=k; break; } memset(has,0,sizeof(has)); vector element.push_back(items[ii]); has[ii]=1; x++; if(x! =str.length()-1) { queue q.push(str.substr(x+1,1)); while(! q.empty()) { stringu=q.front(); q.pop(); vector for(intj=0;j { inttx=id[j]; if(items[tx].right[0]==CH) { if(has[tx])continue; has[tx]=1; if(isupper(items[tx].right[1])) q.push(items[tx].right.substr(1,1)); element.push_back(items[tx]); } } } } } map : iteratorit=temp.begin(); for(;it! =temp.end();it++) collection.push_back(it->second); for(inti=0;i sort(collection[i].element.begin(),collection[i].element.end()); for(inti=0;i for(intj=i+1;j if(collection[i]==collection[j]) collection.erase(collection.begin()+j); } #ifdefDEBUG puts("-------------CLOSURE---------------------"); stringstreamsin; for(inti=0;i { sin.clear(); stringout; sin<<"closure-I"< sin>>out; collection[i].print(out); } puts(""); #endif } voidmake_V() { memset(used,0,sizeof(used)); for(inti=0;i { string&str=wf[i].left; for(intj=0;j { if(used[str[j]])continue; used[str[j]]=1; V.push_back(str[j]); } string&str1=wf[i].right; for(intj=0;j { if(used[str1[j]])continue; used[str1[j]]=1; V.push_back(str1[j]); } } sort(V.begin(),V.end()); V.push_back('#'); } voidmake_cmp(vector { for(intj=0;j { stringstr=collection[i].element[j].right; intk; for(k=0;k if(str[k]==CH) break; if(k! =str.length()-1&&str[k+1]==ch) { str.erase(str.begin()+k); str.insert(str.begin()+k+1,CH); cmp1.push_back(WF(collection[i].element[j].left,str,-1,-1)); } } sort(cmp1.begin(),cmp1.end()); } voidmake_go() { memset(go,-1,sizeof(go)); intm=collection.size(); for(intt=0;t { charch=V[t]; for(inti=0;i { vector make_cmp(cmp1,i,ch); cout< if(cmp1.size()==0)continue; for(intj=0;j { vector for(intk=0;k { string&str=collection[j].element[k].right; intx; for(x=0;x if(str[x]==CH) break; if(x&&str[x-1]==ch) cmp2.push_back(WF(collection[j].element[k].left,str,-1,-1)); } sort(cmp2.begin(),cmp2.end()); cout< boolflag=true; if(cmp2.size()! =cmp1.size())continue; cout< for(intk=0;k if(cmp1[k]==cmp2[k])continue; elseflag=false; cout<<"out"< if(flag) go[i][ch]=j; } } } #ifdefDEBUG puts("---------------EDGE----------------------"); stringstreamsin; stringout; for(inti=0;i for(intj=0;j for(intk=0;k if(go[i][k]==j) { sin.clear(); sin<<"I"< sin>>out; printf("%s\n",out.c_str()); } #endif } voidmake_table() { memset(Goto,-1,sizeof(Goto)); for(inti=0;i for(intj=0;j { charch=V[j]; intx=go[i][ch]; if(x==-1)continue; if(! isupper(ch)) action[i][ch]=Content(0,x); else Goto[i][ch]=x; } for(inti=0;i for(intj=0;j { WF&tt=collection[i].element[j]; if(tt.right[tt.right.length()-1]==CH) { if(tt.left[0]=='S') action[i]['#']=Content(2,-1); else for(intk=0;k { inty=V[k]; action[i][y]=Content(1,tt.back); } } } #ifdefDEBUG puts("------------------------------------------LR(0)分析表--------------------------------------------------------"); printf("%10s%5c%5s","|",V[0],"|"); for(inti=1;i printf("%5c%5s",V[i],"|"); puts(""); for(inti=0;i<(V.size()+1)*10;i++) printf("-"); puts(""); stringstreamsin; for(inti=0;i { printf("%5d%5s",i,"|"); for(intj=0;j { charch=V[j]; if(isupper(ch)) { if(Goto[i][ch]==-1) printf("%10s","|"); else printf("%5d%5s",Goto[i][ch],"|"); } else { sin.clear(); if(action[i][ch].type==-1) printf("%10s","|"); else { Content&temp=action[i][ch]; if(temp.type==0) sin<<"S"; if(temp.type==1) sin<<"R"; if(temp.type==2) sin<<"acc"; if(temp.num! =-1) sin< sin>>temp.out; printf("%7s%3s",temp.out.c_str(),"|"); } } } puts(""); } for(inti=0;i<(V.size()+1)*10;i++) printf("-"); puts(""); #endif } voidprint(strings1,strings2,strings3,strings4,strings5,strings6,strings7) { printf("%-15s|%-15s%-15s%-20s|%-15s%-15s%-15s\n",s1.c_str(),s2.c_str(),s3.c_str(),s4.c_str(),s5.c_str(), s6.c_str(),s7.c_str()); } stringget_steps(intx) { stringstreamsin; sin< stringret; sin>>ret; returnret; } template stringget_stk(vector { stringstreamsin; for(inti=0;i sin< stringret; sin>>ret; returnret; } stringget_shift(WF&temp) { stringstreamsin; sin<<"reduce("< stringout; sin>>out;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LR0 分析 编译 原理 实验