語法制導翻譯_第1頁
語法制導翻譯_第2頁
語法制導翻譯_第3頁
語法制導翻譯_第4頁
語法制導翻譯_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、for循環(huán)語句翻譯遞歸下降法輸出三地址碼/#define MAX 100#include#include#includechar strMAX;char ch;int turn;char strTokenMAX;int kind;int n=0;/存放strtoken元素的個數struct Word/結構體存放單詞(int sort;char wordMAX;/ 存放 strtoken的內容;/recordx=new Word;Word *record12;/放所有識別出來的單詞,分別存放他們的編號以及字符串,x是其下標/ 詞法分析 /int buffer()/載入(int0;cout輸入程序

2、,以“#”作為結束標志。endl;for(int n=0;n=MAX;n+)(for(;istri不可用,用C語言讀入字符。if(stri=#)break;/如果尾數為識別碼#,則表示程序讀完,跳出循環(huán).break;return(i); bool IsLetter(char ch)/ 判斷是否是字母(if(ch=65&ch=97&ch=48&ch=57)return(true);elsereturn(false);char GetChar(int i)/ 讀取字符(char ch;ch=stri;return(ch);char GetBC(char ch)/判斷是不是空格或者換行,如果是,直接

3、讀取下一個字符直道不再空白為止(if(ch=32|ch=10)(turn+;ch=GetChar(turn);ch=GetBC(ch);/ 遞歸實現return(ch);elsereturn(ch);void Concat()/連接,即為 strtoken賦值(strTokenn=ch;n+;int Reserve()/以單詞為單位查找保留字,是則返回編碼,不是則返回0,用來區(qū)分標志符和保留字 (if(strcmp(strToken, DIM0)=0)/調用 strcmp 函數實現,return(1);else if(strcmp(strToken,for0)=0)return(2);else

4、 if(strcmp(strToken,step0)=0)return(3);else if(strcmp(strToken,until0)=0)return(4);else if(strcmp(strToken,do0)=0)return(5);elsereturn(6);void clear()(n=0;/* 語法遞歸分析 */int A(int * c,int & q)(if(cq+=3)(if(cq=7)( q+;return 1;else (coutstep 右部出錯endl;return 0;else (couterror stependl;return 0;int B(int *

5、 b,int & o)(if(bo+=4)(if(bo=7)( o+;return 1;else (coutuntil 右部出錯endl;return 0;else (couterror untilendl;return 0;int S2(int * d,int & h)(if(dh+=6)(if(dh+=8)(if(dh=6|dh=7) h+; return 1;else cout賦值語句右部出錯endl;return 0;else cout賦值語句缺少賦值運算符”endl;return 0;else cout賦值語句左部出錯endl;return 0;int S1(int * m,int

6、& n)if(S2(m,n)if(A(m,n)if(B(m,n) return 1;else return 0;else return 0;else return 0;int S(int *a,int & z)if (az+=2)if (S1(a,z)if(az+=5)if(S2(a,z)(coutsucceed!endl;return 1;else return 0;else (couterror doendl; return 0;else return 0;else (couterror forendl; return 0;void main()(cout* 產生式 *endl;/ for

7、 step until do i j =coutfor S1 do S2endl; / 編號 2 3 4 5 6 7 8coutS2ABendl;couti=jendl;coutstepjendl;coutuntiljendl;int num;turn=0;num=buffer()-1;int x=0;/計識別的單詞的個數for(;turn=num;turn+)/總循環(huán),ch存放剛讀入的字符,strtoken存放巳識別的標志付或保留字,turn是數 組str的下標(ch=GetChar(turn);ch=GetBC(ch);if(IsLetter(ch)(while(IsLetter(ch)&

8、turn=num|IsDigit(ch)&turnsort=kind;/12345 或 6/coutkind; 測試cout(;for(int i=0;iwordi=strTokeni;coutwordi;/輸出識別的標志符或保留字cout”,kind”)”wordi=0;clear();x+;else if(IsDigit(ch)(while(IsDigit(ch)&turnsort=kind;/cout(;for(int i=0;iwordi=strTokeni;coutwordi;cout”,kind”)”wordi=0;clear();x+;else if(ch=)(kind=8;/r

9、ecordx=new Word;recordx-word0=;recordx+-sort=kind;cout”(=,kind”)”endl;elsecouterror input!endl;/* 語法分析 */int y;/*for(y=0;yx;y+)(coutsort ;/打印單詞的編號。coutendl;*/int anaMAX;/存放詞法分析得到的單詞序列的編號的序列 int m;for(m=0;msort;/將 sort 作為數組保存起來/語法分析/int j=0;/ 制導翻譯 /if(!S(ana,j) cout語法出錯!”endl;else cout三地址碼如下:endl;cou

10、twordi != 0)coutwordi+:coutword0;i=0;while (record 3-wordi != 0)coutwordi+;coutendl:cout101 goto 103”endl;coutwordi != 0)coutwordi+;cout:=”;i=0;while (record l-wordi != 0)coutwordi+;cout+”;i=0;while (record 5-wordi != 0)coutwordi+;coutendl:coutwordi != 0)coutwordi+;cout;i=0;while (record 7-wordi != 0)coutwordi+;cout go

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論