freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

編譯原理課程設計(編輯修改稿)

2025-07-13 03:07 本頁面
 

【文章內(nèi)容簡介】 都是自己一個一個敲的。但是記得那時的語法分析程序用的是遞歸下降分析法,而且只判斷輸入串是否是文法的句子(輸出只有簡單的 success 或者 error)。課設的要求呢?要加上語義分析,而且要輸出四元式。好像語義分析的部分,我一點印象也沒有了,老師那一部分上得有點快。運動會 3 天假,時間全用來啃課本了?!罢Z義分析與中間代碼生成”,我又一點一點的 看。 3 天時間,終于可以寫出語義程序了。 這是課設的第 1 個里程碑。采用遞歸下降的語法制導翻譯法,實現(xiàn)了對賦值表達式的語義分析,并生成四元式。 但是后來發(fā)現(xiàn),更難的東西在后邊。程序語句有 3 種:賦值語句,條件語句,循環(huán)語句。而賦值語句的翻譯,恰恰是最簡單的。對于賦值語句的翻譯,課本上有詳細的講解,有代碼的簡單舉例。而對于條件語句( if… else… )和循環(huán)語句( do… while… ),課本講解不那么詳細,沒有代碼舉例,上課時候我也沒太理解老師所講解的。特別是其中鏈 nChain 的概念,一直看不懂。因為這個困難,課設被我 擱置了 3 天。 再后來利用上機的時間,請教了一下老師和另外一個同學,發(fā)現(xiàn)課本后給的樣例程序是錯的,而且錯得一塌糊涂。只好自己寫,寫,寫。 然后就是課設的第 2 個里程碑。實現(xiàn)了對條件語句( if 語句)的分析,并生成四元式。 接下來又是開發(fā)停滯的一段時間,直到 11 月 18 日。熟悉了一下原先寫的代碼,然后開始繼續(xù)后邊的部分。 迎來了課設的第 3 個里程碑。實現(xiàn)了對循環(huán)語句( while 語句)的分析,并生成四元式。而且好像沒有預期中困難,可能是有條件語句的鋪墊吧。他們的處理方法其實很類似,也是emit+backpatch+merge。而且由于老師給的語法中沒有布爾表達式,所以很多 merge 的工作也可以省略了,嘿嘿。 最后一步就是整合,系統(tǒng)測試,書寫文檔了。 個人認為這次課設的機會非常寶貴,加深了我對編譯器處理語言的過程的理解。我想,作為學軟件的學生,不應該只會用 Java,或者 C++,或者 C。一門高級語言其實學起來是很容易的,而在校期間,這些計算機基礎課程一定要學好!才能為將來打好基礎。 源程序清單 //************編譯器 ********************** // //**************編譯原理 ****************** //************計算機科學系 **************** //*************大當家的 ******************* // //***************************************** include include include include char prog[80]。 //存放所有輸入字符 char token[8]。 //存放詞組 char ch。 //單個字符 int syn,p,m,n,i。 //syn:種別編碼 double sum。 int count。 int isSignal。 //是否帶正負號 (0 不帶, 1 負號,2 正號) int isError。 int isDecimal。 //是否是小數(shù) double decimal。 //小數(shù) int isExp。 //是否是指數(shù) int index。 //指數(shù)冪 int isNegative。 //是否帶負號 double temp。 int temp2。 int repeat。 //是否連續(xù)出現(xiàn) +, int nextq。 int kk。 //臨時變量的標號 int ntc,nfc,nnc,nnb,nna。 char *rwtab[9]={main,int,float,double,char,if,else,do,while}。 struct{ char result[10]。 //字符串(字符數(shù)組) char arg1[10]。 char opera[10]。 char arg2[10]。 }fourCom[20]。 //結(jié)構(gòu)體數(shù)組 void scanner()。 //掃描 void lrparser()。 void staBlock(int *nChain)。 //語句塊 void staString(int *nChain)。 //語句串 void sta(int *nChain)。 //語句 void fuzhi()。 //賦值語句 void tiaojian(int *nChain)。 //條件語句 void xunhuan()。 //循環(huán)語句 char* E()。 //Expresiion 表達式 char* T()。 //Term 項 char* F()。 //Factor 因子 char *newTemp()。 //自動生成臨時變量 void backpatch(int p,int t)。 //回填 int merge(int p1,int p2)。 //合并 p1 和 p2 void emit(char *res,char *num1,char *op,char *num2)。 //生成四元式 void main() { p=0。 count=0。 isDecimal=0。 index=0。 repeat=0。 kk=0。 printf(\nPlease input your source string:\n)。 do{ ch=getchar()。 prog[p++]=ch。 }while(ch!=39。39。)。 p=0。 isError=0。 scanner()。 lrparser()。 for(i=1。inextq。i++) //循環(huán)輸出四元式 { printf(\n%d\t,i)。 printf((%5s %5s %5s \t%5s )\n,fourCom[i].arg1,fourCom[i].opera,fourCom[i].arg2,fourCom[i].result)。 } } void lrparser() { int nChain。 nfc=ntc=1。 nextq=1。 if(syn==1) //main { scanner()。 if(syn==26) //( { scanner()。 if(syn==27) //) { scanner()。 staBlock(amp。nChain)。 } else printf(缺少右括號 \n)。 } else printf(缺少左括號 \n)。 } else printf(缺少 main\n)。 } //語句塊 ::= 39。{39。語句串 39。}39。 void staBlock(int *nChain) //語句塊 { if(syn==28) //{ { scanner()。 staString(nChain)。 //backpatch(*nChain,nextq)。 if(syn==29) //} scanner()。 //讀下一個 else printf(缺少 }號 \n)。 } else printf(缺少 {號 \n)。 } //語句串 ::=語句 {。語句 }。 void staString(int *nChain) //語句串 { sta(nChain)。 backpatch(*nChain,nextq)。 while(syn==31) //。 { scanner()。 sta(nChain)。 } //backpatch(*nChain,nextq1)。 } void sta(int *nChain) //語句 { if(syn==10) { fuzhi()。 //*nChain=0。 } else if(syn==6) //if { tiaojian(nChain)。 } else if(syn==8) //do xunhuan()。 } //條件語句 if(條件 )語句塊 void tiaojian(int *nChain) { char res[10],num1[10],num2[10],op[10]。 int nChainTemp。 //條件 表達式 關系運算符 表達式 if(syn==6) //if { scanner()。 //strcpy(num1,E())。 if(syn==26) //( { scanner()。 strcpy(num1,E())。 if((syn=37)amp。amp。(syn=32)) { switch(syn) { case 32: strcpy(op,)。 break。 case 33: strcpy(op,=)。 break。 case 34: strcpy(op,)。 break。 case 35: strcpy(op,=)。 break。 case 36: strcpy(op,==)。 break。 case 37: strcpy(op,!=)。 break。 default: printf(error)。 } } scanner()。 strcpy(num2,E())。 strcat(num1,op)。 strcat(num1,num2)。 //nfc=nextq+1。 ntc=nextq。 //記住 if 語句位置 emit(0,if,num1,goto)。 nfc=nextq。 //if 中表達式為假 emit(0,goto)。 //第一個 0 已回填 backpatch(ntc,nextq)。 //ntc 鏈接的所有四元式都回填 nextq } if(syn==27) //) scanner()。 staBlock(amp。nChainTemp)
點擊復制文檔內(nèi)容
畢業(yè)設計相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1