日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编译原理end

發(fā)布時(shí)間:2023/12/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译原理end 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include<bits/stdc++.h> using namespace std;const int max_word = 505; //關(guān)鍵字 const char keyWord[13][20] = {"main","if","else","do","while","for","switch", "case","int","double","float","long","void"};//單詞表 struct Word{char value[20];//單詞值 int type;//單詞種類int line;//行號(hào) }w[max_word]; //四元式 struct si_Yuan{string op;//運(yùn)算符string s1;string s2;string res;//結(jié)果 }sy[105]; //文件流 FILE *fin,*fout; int line = 1; char token[12];//存放單詞 int flag = 0;//判斷是否獲取字符 int flag1 = 0,flag2;//flag1判斷是否項(xiàng)已經(jīng)產(chǎn)生miss錯(cuò)誤; int e = 0;//錯(cuò)誤個(gè)數(shù) int sy_num = 0;//四元式的個(gè)數(shù) string op,s1,ss1,s2,res,res1,res2,op2,op1; int op_num = 0,op_num1 = 0;//運(yùn)算符的個(gè)數(shù) int sy_id;//四元式的序號(hào) string var[300];//已經(jīng)聲明的變量 int var_num = 0;//聲明變量的個(gè)數(shù) int sent_id;//判斷if,while語句 string equ[300];//= int a,b,c; int equ_num = 1; //=個(gè)數(shù) int cnt = 0,token_num = 0;//當(dāng)前字符 int row = 1;//當(dāng)前行數(shù) char ch; char ch1; int word_num = 0;//單詞的總個(gè)數(shù) int word_cnt = 0; string temp; char str_int[20]; stack<string>word_stack;//保存 stack<string>op_stack; //程序 void S(); void P();//(){分程序} void P1();//分程序 void A();//變量說明部分 void B();//語句部分 void B1(); int C();//變量說明 void D();//標(biāo)識(shí)符表 void D1(); void E();//標(biāo)識(shí)符 void F();//字母 void G();//數(shù)字 void H();//語句 void I();//賦值語句 void J();//條件語句 void K();//循環(huán)語句 int L();//關(guān)系運(yùn)算符 void M();//表達(dá)式 void M1(); void N();//項(xiàng) void N1(); int O();//加法運(yùn)算符 int Q();//乘法運(yùn)算符 void R();//常量 void S();//無符號(hào)整數(shù) void T();//數(shù)字序列 void W();//復(fù)合語句 void X();//條件 void Y();//語句1 void Z();//因子//構(gòu)造四元式 void siYuan(string op,string s1,string s2,string res) { sy[sy_num].op =op;sy[sy_num].s1=s1;sy[sy_num].s2=s2;sy[sy_num].res=res;sy_num++; }void printFour()//輸出四元式 {ofstream out("sy.txt");int i;for(i=0;i<sy_num;i++){cout<<i<<":\t("<<sy[i].op<<",\t"<<sy[i].s1<<",\t"<<sy[i].s2<<",\t"<<sy[i].res<<")"<<endl;out<<i<<":\t("<<sy[i].op<<",\t"<<sy[i].s1<<",\t"<<sy[i].s2<<",\t"<<sy[i].res<<")"<<endl;} } void error(string err)//報(bào)錯(cuò),定位到錯(cuò)誤行 {cout<<"第"<<w[word_cnt].line<<"行出錯(cuò)!\t";cout<<err<<"\n";e++; }//檢查變量是否被聲明 void is_say(string a) {int i;for(i=1;i<=var_num;i++){if(a.compare(var[i])==0){break;}}if(i>var_num) {cout<<"第 "<<w[word_cnt].line<<" 行出錯(cuò)!\t";cout<<w[word_cnt].value<<" 沒有被聲明 !"<<endl;e++;} }void init_token(){int i;for(i = 0;i < 12;i++){token[i] = NULL;} }int judge_token(){init_token();if(flag == 0){ch = getc(fin);}flag = 1;while(ch == ' ' || ch == '\t' || ch == '\n'){if(ch == '\n'){row++;}ch=getc(fin);}token_num = 0;if((ch>='a' && ch <= 'z') || (ch >= 'A' &&ch <= 'Z')){//可能為標(biāo)識(shí)符或者變量名 while((ch>='a' && ch <= 'z') || (ch >= 'A' &&ch <= 'Z') || (ch >= '0' && ch <= '9')){token[token_num++] = ch;ch = getc(fin);}token[token_num++] = '\0';for(int i = 0;i <13;i++){if(strcmp(token,keyWord[i]) == 0){//3為關(guān)鍵詞 return 3;}}//2為標(biāo)識(shí)符 return 2;}//是數(shù)字 else if(ch >= '0' && ch <= '9'){while((ch >= '0'&& ch <= '9') || ch == '.'){token[token_num++] = ch;ch = getc(fin);}return 1;}else{token[token_num++] = ch;switch(ch){case '(': ch = getc(fin); return 16;case ')': ch = getc(fin); return 17;case '{': ch = getc(fin); return 33;case '}': ch = getc(fin); return 34;case '+':ch = getc(fin);if(ch == '+'){token[token_num++] = ch;ch = getc(fin); return 29;}else{return 18;}case '-':ch = getc(fin);if(ch == '-'){token[token_num++] = ch;ch = getc(fin); return 30;}else{return 19;}case '*':ch = getc(fin);if(ch == '/'){token[token_num++] = ch;ch = getc(fin); return 32;}else{return 20;}case '/':ch = getc(fin);if(ch == '*'){token[token_num++] = ch;ch = getc(fin); return 31;}else{ return 21;}//這里要重新編碼 case '=':ch = getc(fin);if(ch == '='){token[token_num++] = ch;ch = getc(fin); return 23;}else{return 22;}case '>':ch = getc(fin);if(ch == '='){token[token_num++] = ch;ch = getc(fin); return 24;}else{return 23;}case '<':ch = getc(fin);if(ch == '='){token[token_num++] = ch;ch = getc(fin); return 26;}else{return 25;}case ';': ch = getc(fin); return 27;case '"': ch = getc(fin); return 28;case '!':ch = getc(fin);if(ch == '='){token[token_num++] = ch;ch = getc(fin); return 37;}else{return 36;}case '#': ch = getc(fin); return -2;case ',': ch = getc(fin); return 35;case EOF: return -1;default: ch = getc(fin); return -10;}} }void getWord(){int temp;while(1){temp = judge_token();if(temp==-1){break;}switch(temp){case -10://cout<<"第 "<<row<<" 行出現(xiàn)錯(cuò)誤."<<endl;error("word has a mistake");w[word_num].type = -1;strcat(w[word_num].value," ");word_num++;break;case -1:return;default:w[word_num].type = temp;w[word_num].line = row;strcpy(w[word_num].value,token);word_num++;//cout<<"<"<<temp<<","<<token<<">"<<endl;break;}} } //程序 void S(){if(strcmp("main",w[word_cnt].value)){error("miss main");word_cnt--;}word_cnt++;if(strcmp("(",w[word_cnt].value)){error("miss (");word_cnt--;}word_cnt++;if(strcmp(")",w[word_cnt].value)){error("miss )");word_cnt--;}word_cnt++;if(strcmp("{",w[word_cnt].value)){error("miss {");word_cnt--;}word_cnt++;P();if(strcmp("}",w[word_cnt].value)){error("miss }");word_cnt--;}op = "#";s1 = "";s2 = "";res = "";siYuan(op,s1,s2,res);cout<<"There are "<<e<<" mistakes in total."<<endl; } //分程序 void P(){A();//變量說明部分if(strcmp(";",w[word_cnt].value)){error("miss ;");word_cnt--;}word_cnt++;B();//語句部分 } //變量說明部分 void A(){if(C()){var[++var_num] = w[word_cnt].value;D();}else{D();} } //變量說明 int C(){if(strcmp(w[word_cnt].value,"int")){error("miss int");return 0;}word_cnt++;return 1; } //標(biāo)識(shí)符表 void D(){if(w[word_cnt].type != 2){error("denoter has a error");}word_cnt++;D1(); } //子標(biāo)識(shí)符表 void D1(){if(strcmp(w[word_cnt].value,";") == 0){return;}if(strcmp(w[word_cnt].value,",")){error("miss ,");word_cnt--;}word_cnt++;var[++var_num] = w[word_cnt].value;if(w[word_cnt].type!=2){error("denoter has a error");}word_cnt++;D1(); } //語句部分 void B(){H();B1(); } //子語句部分 void B1(){if(strcmp(w[word_cnt].value,";") == 0){word_cnt++;H();B1();}else if(strcmp(w[word_cnt].value,"}") == 0){return;}else{error("miss ;");} } //語句 void H(){cout<<"H()"<<endl;cout<<w[word_cnt].value<<endl;if(w[word_cnt].type == 2){op_num = 0;is_say(w[word_cnt].value);word_stack.push(w[word_cnt].value);word_cnt++;I();}else if(strcmp(w[word_cnt].value,"if") == 0){op_num = 0;J();}else if(strcmp(w[word_cnt].value,"while") == 0){op_num = 0;a = sy_num;K();op = "go";s1 = "";s2 = "";stringstream sss;//int 轉(zhuǎn) string sss<<a;sss>>res;siYuan(op,s1,s2,res);//修改while跳轉(zhuǎn)的序號(hào)stringstream sss2;sss2<<sy_num;sss2>>sy[sent_id].res;}else{error("extra fuhao"); } }//賦值語句 void I(){if(strcmp(w[word_cnt].value,"=") == 0){word_cnt++;//word_stack.push(w[word_cnt].value); M();if(e > 0){return;}if(op_stack.size() > 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop();s1 = word_stack.top();word_stack.pop();res = word_stack.top();word_stack.pop();siYuan(op,s1,s2,res);}else{s1 = word_stack.top();word_stack.pop();res = word_stack.top();word_stack.pop();siYuan("=",s1,"",res);}}else{error("miss = ");word_cnt--; } } //if語句 void J(){cout<<"J()"<<endl;if(strcmp(w[word_cnt].value,"if")){error("miss if");word_cnt--; }word_cnt++;if(strcmp(w[word_cnt].value,"(")){error("miss (");word_cnt--;}word_cnt++; //word_stack.push(w[word_cnt].value);X();//條件 sent_id = sy_num;if(op_stack.size() > 0 && e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop();s1 = word_stack.top();word_stack.pop();siYuan(op,s1,s2,res);}if(strcmp(w[word_cnt].value,")")){error("miss )");word_cnt--;}word_cnt++;//四元式置為空op = "";s1 = "";s2 = "";res = "";Y();//語句1stringstream ss;ss<<sy_num+1;ss>>sy[sent_id].res;sent_id = sy_num;op = "go";s1 = "";s2 = "";res = "";siYuan(op,s1,s2,res);if(strcmp(w[word_cnt].value,"else")){error("miss else");word_cnt--;}word_cnt++;Y();stringstream ss2;ss2<<sy_num;ss2>>sy[sent_id].res; }//while語句 void K(){cout<<"K()"<<endl;if(strcmp(w[word_cnt].value,"while")){error("miss while");word_cnt--;}word_cnt++;if(strcmp(w[word_cnt].value,"(")){error("miss (");word_cnt--;}word_cnt++;//word_stack.push(w[word_cnt].value);X();sent_id = sy_num;if(op_stack.size()>0 && e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop();s1 = word_stack.top();word_stack.pop();siYuan(op,s1,s2,res);}//cout<<w[word_cnt].value<<endl;if(strcmp(w[word_cnt].value,")")){error("miss )");word_cnt--;}word_cnt++;if(strcmp(w[word_cnt].value,"do")){error("miss do");word_cnt--;}word_cnt++;Y(); }void X(){cout<<"X()"<<endl;M();if(op_stack.size() > 0 && e == 0){op = op_stack.top();op_stack.pop(); s2 = word_stack.top();word_stack.pop(); s1 = word_stack.top();word_stack.pop();stringstream ss;ss << op_num;res = "t"+ss.str();word_stack.push(res);siYuan(op,s1,s2,res);}if(strcmp(w[word_cnt].value,">") == 0){op = "<=";}else if(strcmp(w[word_cnt].value,">=") == 0){op = "<";}else if(strcmp(w[word_cnt].value,"<") == 0){op = ">=";}else if(strcmp(w[word_cnt].value,"<=") == 0){op = ">";}else if(strcmp(w[word_cnt].value,"==") == 0){op = "!=";}else if(strcmp(w[word_cnt].value,"!=") == 0){op = "==";}//cout<<w.value<<" "<<w.type<<endl;if(!L()){error("miss relation operator");word_cnt--;}op_stack.push(op);word_cnt++;//word_stack.push(w[word_cnt].value);//sent_id = sy_num;M(); } //表達(dá)式 void M(){cout<<"M()"<<endl;N();M1(); } //子表達(dá)式 void M1(){cout<<"M1()"<<endl;cout<<w[word_cnt].value<<endl;if(strcmp(w[word_cnt].value,";") == 0 || strcmp(w[word_cnt].value,")") == 0 || L() || strcmp(w[word_cnt].value,"}") == 0 || strcmp(w[word_cnt].value,"else") == 0){return;}else if(!O()){error("miss + or -");//word_cnt--;}else{op_stack.push(w[word_cnt].value);word_cnt++;//word_stack.push(w[word_cnt].value);op_num++; //getWord();//strcpy(b[b_num++].bds,new_w.value);N();M1();if(op_stack.size() > 1 && e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop(); s1 = word_stack.top();word_stack.pop();stringstream ss;ss << op_num;res = "t"+ss.str();word_stack.push(res);siYuan(op,s1,s2,res);}} }//項(xiàng) ,消除左遞歸 void N(){cout<<"N()"<<endl;Z();N1(); } void N1(){cout<<"N1()"<<endl;cout<<w[word_cnt].value<<endl;//后根符號(hào)集,關(guān)系運(yùn)算符 ; ) if(strcmp(w[word_cnt].value,";") == 0 || strcmp(w[word_cnt].value,")") == 0 || strcmp(w[word_cnt].value,"}") == 0 || strcmp(w[word_cnt].value,"else") == 0 || L() || O()){return;}else if(!Q()){error("miss * or /");//分號(hào)出錯(cuò)轉(zhuǎn)到語句 //word_cnt--;}//word_cnt++;else{op_num++;op_stack.push(w[word_cnt].value);word_cnt++;//word_stack.push(w[word_cnt].value);Z();N1();if(op_stack.size() > 1 && e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop(); s1 = word_stack.top();word_stack.pop();stringstream ss;ss << op_num;res = "t"+ss.str();word_stack.push(res);siYuan(op,s1,s2,res);}} } //因子 void Z(){//cout<<w.value<<" "<<w.type<<endl;//非數(shù)字或標(biāo)識(shí)符 cout<<"Z()"<<endl;if(w[word_cnt].type!=1 && w[word_cnt].type!=2 &&strcmp(w[word_cnt].value,"(")){error("expression has a error");return;}//標(biāo)識(shí)符if(w[word_cnt].type == 1||w[word_cnt].type == 2){if(w[word_cnt].type == 2){is_say(w[word_cnt].value);}word_stack.push(w[word_cnt].value);word_cnt++;//equ[equ_num++] = w.value;return;}else if(strcmp(w[word_cnt].value,"(") == 0){word_cnt++;//word_stack.push(w[word_cnt].value);M();if(e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop(); s1 = word_stack.top();word_stack.pop();stringstream ss;ss << op_num;res = "t"+ss.str();word_stack.push(res);siYuan(op,s1,s2,res);}if(strcmp(w[word_cnt].value,")") == 0){word_cnt++;return;}else{error("miss )");}}return; }//語句1 void Y(){cout<<"Y()"<<endl; if(strcmp(w[word_cnt].value,"{") == 0){word_cnt++;B();//cout<<w.value<<endl;if(strcmp(w[word_cnt].value,"}")){error("miss }");}word_cnt++;return; }else{H();//語句return; } }//關(guān)系運(yùn)算符 int L(){if(((w[word_cnt].type > 22 && w[word_cnt].type <= 26) || w[word_cnt].type == 37)){return 1;}return 0; } //加法運(yùn)算符 int O(){if(w[word_cnt].type == 18 || w[word_cnt].type == 19){return 1;}return 0; } //乘法運(yùn)算符 int Q(){if(w[word_cnt].type == 20 || w[word_cnt].type == 21){return 1;}return 0; }int main(){fin = fopen("compiler.txt","r");getWord();S();if(e==0){printFour();}else{cout<<"\nSorry,can not generate siYuan."<<endl;}return 0; } /**/

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的编译原理end的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。