您好,欢迎访问三七文档
#includeiostream.h#includestdlib.h#includefstream.H#definerow50#definecol50#defineSIZE50//FIRSTVT±í»òLASTVT±íÖÐÒ»¸ö±íÏA£¬a£©½á¹¹ÌåµÄ³õʼ»¯typedefstruct{charnonterm;//·ÇÖÕ½á·ûcharterm;//ÖÕ½á·û}StackElement;//´æ·Å£¨A£¬a£©µÄÕ»µÄ³õʼ»¯typedefstruct{StackElement*top;StackElement*bottom;intstacksize;}stack;//³õʼ»¯£¨A£¬a£©Õ»voidInitStack(stack&S){S.bottom=newStackElement[SIZE];if(!S.bottom)cout´æ´¢¿Õ¼ä·ÖÅäʧ°Ü!endl;S.top=S.bottom;S.stacksize=SIZE;}Åжϣ¨A£¬a£©Õ»ÊÇ·ñΪ¿ÕboolifEmpty(stackS){if(S.top==S.bottom)returntrue;elsereturnfalse;}//²åÈëÕ»¶¥£¨A,a£©ÔªËØvoidInsert(stack&S.StackElemente){if(S.top-S.bottom=S.stacksize)coutÕ»ÒÑÂú£¬ÎÞ·¨²åÈë!endl;else{S.top-nonterm=e.nonterm;S.top-term=e.term;S.top++;}}//µ¯³öÕ»¶¥£¨A£¬a£©ÔªËØStackElementPop(stack&S){StackElemente;e.nonterm='\0';e.term='\0';if(S.top==S.bottom){coutÕ»ÒÑ¿Õ£¬ÎÞ·¨½øÐÐɾ³ý²Ù×÷!endl;returne;}else{S.top--;e.nonterm=S.top-nonterm;e.term=S.top-term;returne;}}//ÖÕ½á·ûÓë·ÇÖÕ½á·ûµÄÅжϺ¯Êý£¨²¼¶ûÀàÐÍ£©boolTerminalJud(charc){if(c='A'&&c='Z')returnfalse;elsereturntrue;}//ÅжϷÇÖÕ½á·ûÔÚfirst±íÖÐÊÇ·ñÒÑ´æÔÚboolItemJud(charfirst[][cool],intfrist_len,charC){for(inti=0;ifrist_len;i++)if(first[i][0]==C)returntrue;}returnfalse;}//¶ÁÎļþº¯Êýintreadfile(charsen[][col]){charaddr[50];coutÇåÊäÈëÒª¶ÁÎļþµÄµØÖ·(\\ÓÃ\\\\±íʾ):endl;cinaddr;ifstreamfin;fin.open(addr,ios::in);if(!fin){coutCannotopenfile!\nendl;}for(inti=0;!fin.eof();i++){finsen[i];coutsen[i]endl;}for(inti=0;!fin.eof();i++){finsen[i];coutsen[i]endl;}returni;}//FIRSTVT±íºÍLASTVT±íÖбíÏ·ÇÖÕ½á·û£©µÄ³õʼ»¯voidItemInit(charsen[][col],charfirst[][col],charlast[][col],intsen_len,int&frist_len){inti;frist_len=1;first[0][0]=sen[0][0];last[0][0]==sen[0][0];for(i=1;isen_len;i++){if(TerminalJud(sen[i][0])==false&&ItemJud(first_len,sen[i][0])==false){first[frist_len[0]=sen[i][0];last[frist_len[0]=sen[i][0];frist_len++;}}}voidFirstVt(charsen[][col],charfirst[][clo],intsen_len,intfrist_len){StackElementDFS,record[SIZE[;stackOperator;InitStack(Operator);inti,j,r=0;for(i=0;isen_len;i++){for(j=3;sen[i][j]!='\0';j++){if(TerminalJud(sen[i][j])==true){intexist=0;DFS.nonterm=sen[i][0];DFS.term=sen[i][j];for(inti1=0;ir;i++){if(record[i1].nonterm==sen[i][0]&&record[i].term==sen[i][j]){exist=1;break;}}record[r].nonterm=sen[i][0];record[r].term=sen[i][j];if(exist==0){Insert(Operator,DFS);record[r].nonterm=sen[i][0];record[r].term=sen[i][j];r++;}break;}}}intlocation[col];for(i=0;ifrist_len;i++)location[i]=1;while(!ifEmpty(Operator){intexist=0;StackElementIDElement,DElement;DElement=Pop(Operator);for(i=0;ifrist_len;i++){if(first[i][0]==DElement.nonterm){intn=location[i];first[i][n]=DElement,term;location[i]++;break;}}for(j=0;jsen_len;j++){if(sen[j][3]==DElement.nonterm){IDElement.nonterm=sen[j][0];IDElement.term=DElement.term;for(intr0=0;r0r;r0++){if(record[r0].nonterm==IDElement.nonterm&&record[r0].term==IDElement.term){exist=1;break;}}if(exist==0){Insert(Operator,IDElement);record[r].nonterm=IDElement.nonterm;record[r].term=IDElement.term;r++;}}}}}voidLastVt(charsen[][col],charlast[][col],intsen_len,intfrist_len){inti,j,i1,j1;charc,record[row][col]={'\0'};for(i=0;isen_len;i++){for(j=0;sen[i][j]!='\0';j++){record[i][j]=sen[i][j];}j=j-1;for(i1=3,j1=j;i1j1;i1++,j1--){c=record[i][i1];record[i][i1]=record[i][j1];record[i][j1]=c;}}FirstVt(record,last,sen_len,frist_len);}boolTermTableJud(charterm[col],intterm_len,charC){for(inti=0;iterm_len,i++){if(term[i]==C)returntrue;}returnfalse;}//¹¹ÔìËã·ûÓÅÏȹØϵ±íboolOpPriotable(charsen[][col],charfirst[][col],charlast[][col],charopTable[][col],intsen_len,intfirst_len,int&opTable_len){inti,j,term_len=0;inti2,i3,opr,opc;charc1,c2,c3;charterm[SIZE]={'\0'};for(i=0;isen_len;i++){for(j=3;sen[i][j]!='\0';j++){if(TerminalJud(sen[i][j])==true)if(TermTableJud(term,term_len,sen[i][j])==false){term[term_len]=sen[i][j];term_len++;}}}for(i=0;iterm_len+1;i++)for(j=0;jterm_len+1;j++)opTable[i][j]='';for(i=1;iterm_len+1;i++){opTable[i][0]=term[i-1];opTable[0][i]=term[i-1];}for(i=0;isen_len;i++){for(j=5;sen[i][j]!='\0';j++){if(TerminalJud(sen[i][j-2])==true&&TerminalJud(sen[i][j-1])==false&&TerminalJud(sen[i][j])==true){c1=sen[i][j-2];c2=sen[i][j];for(opr=1;oprterm_len+1;opr++){if(opTable[opr][0]==c1)break;}for(opc=1;opcterm_len+1;opc++){if(opTable[0][opc]==c2)break;}if(opTable[opr][opc]!=''){cout²»ÊÇËã·ûÓÅÏÈÎÄ·¨!endl;returnfalse;}else{opTable[opr][opc]='=';}}for(j=4;sen[i][j]!='\0';j++){if(TerminalJud(sen[i][j-1])==true&&TerminalJud(sen[i][j])==true){c1=sen[i][j-1];c2=sen[i][j];for(opr=1;oprterm_len+1;opr++){if(opTable[opr][0]==c1)break;}for(opc=1;opcterm_len+1;opc++){if(opTable[0][opc]==c2)break;}if(optable[opr][opc]!=''){cout²»ÊÇËã·ûÓÅÏÈÎÄ·¨!endl;returnfalse;}else{opTable[opr][opc]='=')}}}}for(i=0;isen_len;i++){for(j=3;sen[i][j]!='\0';j++){if(TerminalJud(sen[i][j])==true&&TerminalJud(sen[i][j+1])==false){c1=sen[i][j];c2=sen[i][j+1];for(opr=1;oprterm_len+1;opr++){if(opTable[opr][0]==c1)break;}for(opc=0;opcfirst_len;opc++){if(first[opc][0]==c2)
本文标题:算符优先文法代码
链接地址:https://www.777doc.com/doc-5407368 .html