已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
詞法分析器說(shuō)明文檔指數(shù)E|e都可,考慮過(guò)/的注釋 詞法規(guī)則 關(guān)鍵字: 本程序識(shí)別的關(guān)鍵字為int real if then else while,僅當(dāng)單獨(dú)出現(xiàn) 以上標(biāo)識(shí)符時(shí)識(shí)別為關(guān)鍵字,對(duì)于inta,ifb等識(shí)別為標(biāo)識(shí)符。 標(biāo)識(shí)符: 一個(gè)標(biāo)識(shí)符必須以字母開頭,后面接上字母和數(shù)字,否則產(chǎn)生報(bào)錯(cuò)信息,程 序停止詞法分析,輸出相關(guān)錯(cuò)誤信息 如: 正確:abc, abc123, 等 錯(cuò)誤:123abc 操作符: 本程序識(shí)別的操作符為: + - / * = = = != 當(dāng) !后跟其它字符時(shí)產(chǎn)生出錯(cuò)信息。 分隔符: 本程序識(shí)別的分隔符為: ( ) ; 數(shù)字: 識(shí)別的數(shù)字遵循以下文法規(guī)則: digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 intnumber digit+ exponent (E|e) ( + | - | e ) digit+ fraction . digit+ realnumber digit+ exponent | digit+ fraction ( exponent | e ) 例如:正確: 123, 123E2, 123.3123.3E4 錯(cuò)誤: 123A,123E, 123.A . 123.3A, 123.3E 注釋符: 注釋部分以 / 本程序?qū)ζ洳贿M(jìn)行識(shí)別. 引入文件 為 #include形式,其他做出錯(cuò)處理設(shè)計(jì)思路本程序采用字符流形式讀入文件,識(shí)別其中的關(guān)鍵字,標(biāo)識(shí)符,分隔符,注釋符,引入文件聲明等.設(shè)計(jì)了一個(gè)靈活的讀取字符的自動(dòng)機(jī)為如下圖所顯示讀入文件的第一個(gè)字符回車空格操作符+ - * 直接識(shí)別為操作符. 操作符號(hào) ! = 進(jìn)行跳轉(zhuǎn)看是否是=; !=; = = ;操作符/ 進(jìn)行跳轉(zhuǎn)看是否是/ ( ); 直接識(shí)別為分隔符根據(jù)isletter()函數(shù)判斷是否讀到字符,若是,進(jìn)行跳轉(zhuǎn),以此識(shí)別出標(biāo)識(shí)符串和關(guān)鍵字根據(jù)isdigit()函數(shù)判斷是否讀到數(shù)字,若是,進(jìn)行跳轉(zhuǎn),以此識(shí)別出整個(gè)數(shù)字狀態(tài)0 判斷讀入字符類型,進(jìn)行狀態(tài)跳轉(zhuǎn),并對(duì)行號(hào)和列號(hào)做相應(yīng)調(diào)整轉(zhuǎn)入相應(yīng)狀態(tài),進(jìn)行相關(guān)操作根據(jù)install()函數(shù)按格式將符號(hào)表輸出。根據(jù)nextChar()函數(shù)讀取下一個(gè)將要讀取的字符。根據(jù)iskey()函數(shù)判斷是否讀到規(guī)定的關(guān)鍵字。據(jù)analyzer()函數(shù)判斷各個(gè)字符各屬各家。 詞法分析部分的Lexical類如下:public class Lexical private int rnum;/行號(hào)private int rpos;/列號(hào) private static ArrayList symbolTable;private StreamReader br;private char c;private char bC;private int state;private String str;public Lexical(StreamReader br)symbolTable = new ArrayList();this.br=br;c= ;bC= ;state = 0;rnum=1;rpos=0;str=;public ArrayList getSymbolTable()c = nextChar();state = 0;analyzer();return symbolTable;private void analyzer()bool isRunning=true;while(isRunning)switch (state)case 0:if(c= ) /空格 else if(c=t) /tabrpos+=3;else if(int)c=13) /空格 else if(int)c=10) /回車rpos = 0;rnum+;else if(c=) /結(jié)束符return;else if(c=+) /操作符+install(操作符,+,rpos,rnum); else if(c=-) /操作符-install(操作符,-,rpos,rnum);else if(c=/) /操作符/state = 1;else if(c=*) /操作符*install(操作符,*,rpos,rnum);else if(c=) /操作符= state = 2;else if(c=) /操作符) /操作符state = 4;else if(c=!) /操作符!state = 5;else if(c=) /分隔符install(分隔符,rpos,rnum);else if(c=) /分隔符install(分隔符,rpos,rnum);else if(c=() /分隔符(install(分隔符,(,rpos,rnum);else if(c=) /分隔符)install(分隔符,),rpos,rnum);else if(c=;) /分隔符;install(分隔符,;,rpos,rnum);else if(int)c=65535)isRunning=false;else if(isLetter(c) /讀到了字符bC = c;state = 6;else if(isDigit(c) /讀到了數(shù)字符bC = c;str=;state = 7;else if(c=#) state=13;else state=0;isRunning=false;fail(0); c = nextChar();break;case 1:if(c=/) /表示注釋后面的東西,不讀它while(int)c!=10)c = nextChar();rpos=0; /從下一行開始rnum+;c = nextChar();state = 0;else state = 0; / 下一個(gè)不是/, 后退一步到state=0install(操作符,/,rpos-1,rnum);break;case 2: if(c=) /表示操作符=state = 0;install(操作符,=,rpos-1,rnum);c = nextChar();else state = 0;install(操作符,=,rpos-1,rnum);break;case 3:if(c=) /表示操作符=state = 0;install(操作符,=,rpos-1,rnum);c = nextChar();else state = 0;install(操作符,=state = 0;install(操作符,=,rpos-1,rnum);c = nextChar();else state = 0;install(操作符,rpos-1,rnum);break;case 5:if(c=) / 表示操作符!=state = 0;install(操作符,!=,rpos-1,rnum);c = nextChar();else state = 0;isRunning=false;fail(2);break; /*/讀入標(biāo)識(shí)符,后面是 數(shù)字符和字母才是對(duì)的/*case 6: String id = +bC;while(isLetter(c)|isDigit(c)id+=c;c = nextChar();if(isKey(id)install(關(guān)鍵字,id,rpos-id.Length,rnum);elseinstall(標(biāo)識(shí)符,id,rpos-id.Length,rnum);state = 0;break;/*/讀入數(shù)字符,后面是 數(shù)字符(循環(huán)); .(轉(zhuǎn)狀態(tài));E(轉(zhuǎn)狀態(tài))/*case 7: str+=bC; while(isDigit(c) str+=c;c=nextChar();if(c=.) state=8;c=nextChar(); else if(c=E) state=10;c=nextChar();/需要判斷是否是 11w等else if(isLetter(c)state = 0;isRunning=false;fail(1); else state = 0;install(數(shù)字符,str,rpos-str.Length,rnum);break;/*/ . 后面跟的字符,除了數(shù)字符其它都出錯(cuò)/*case 8: str+=.;if(isDigit(c)state = 9;str+=c;c=nextChar();elsestate = 0;isRunning=false;fail(1);break;/*/ .數(shù)字符 后面字符,可以是數(shù)字符或者是E(需要加錯(cuò)誤提示,當(dāng)不是空格而是其他字母時(shí)候)/*case 9: while(isDigit(c)str+=c;c=nextChar();if(c=E)state = 10;c=nextChar();/需要判斷是否是 11w 等else if(isLetter(c)state = 0;isRunning=false;fail(1); elsestate = 0;install(數(shù)字符,str,rpos-str.Length,rnum);break; /*/ E 后面字符, +;-;數(shù)字符 都是對(duì)的,其他都是錯(cuò)的/*case 10:str+=E;if(c=+|c=-)state=11;str+=c;c=nextChar();else if(isDigit(c)state=12;str+=c;c=nextChar();elsestate=0;isRunning=false;fail(1);break;/*/ + - 后面字符, 數(shù)字符是對(duì)的.其他都是錯(cuò)的/*case 11:if(isDigit(c)state=12;str+=c;c=nextChar();elsestate = 0;isRunning=false;fail(1);break;/*/ E數(shù)字符 后面字符,只有數(shù)字符是對(duì)的/*case 12:while(isDigit(c)str+=c;c=nextChar(); if(isLetter(c)state = 0;isRunning=false;fail(1); install(數(shù)字符,str,rpos-str.Length,rnum);state=0;break;case 13: /聲明部分 id =#;while(isLetter(c)id+=c;c = nextChar();if(id=#include&c=)id+=c; install(文件引入,id,rpos-id.Length,rnum);c = nextChar();else fail(3); elsefail(0);state = 0;break; private void fail(int i) string typeerror=;switch(i)case 0:typeerror=輸入非法字符錯(cuò)誤;break;case 1:typeerror=操作符錯(cuò)誤;break;case 2:typeerror=數(shù)字符錯(cuò)誤;break;case 3:typeerror=聲明錯(cuò)誤;break;Console.WriteLine(typeerror+,位置);private char nextChar()char t;rpos+;if(br.Peek() = -1)br.Close();return ;t= (char) br.Read();return t; private void install(String tType,String aValue,int rpos,int rnum)ArrayList tokenArray = new ArrayList();tokenArray.Add(tType);tokenArray.Add(aValue);tokenArray.Add();symbolTable.Add(tokenArray);str=; private bool isLetter(char checkChar)int checkInt = (int)checkChar;if(checkInt=97)|(checkInt=65&checkInt=97)return true;return false; private bool isDigit(char checkChar)int checkInt = (int)checkChar;if(checkInt=48)return true;return false; private bool isKey(String checkKey)if(checkKey.Equals(if)|checkKey.Equals(then)|checkKey.Equals(else)|checkKey.Equals(int)|checkKey.Equals(real)|checkKey.Equals(while)return true;return false;程序輸入輸出舉例:輸出格式為 : 記號(hào) 字符 1: #include #includemain() a=1;if(a=1)then a=2.3;else
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024生物科技專利許可使用合同
- 2024欠款分期還款與債務(wù)重組咨詢服務(wù)合同3篇
- 2025年度通勤班車租賃與押金退還服務(wù)協(xié)議3篇
- 2024年鋁業(yè)質(zhì)量檢驗(yàn)合同
- 2024隔墻工程承包合同范本
- 2025年智能家居產(chǎn)品定制生產(chǎn)與銷售合同范本3篇
- 2024車輛GPS定位系統(tǒng)安裝合同
- 2024版車輛預(yù)訂定金合同書實(shí)例版B版
- 2024年物流運(yùn)輸合同貨物描述及運(yùn)輸方案
- 專門針對(duì)自然人客戶的信用借款協(xié)議(2024版)版
- 汽車修理業(yè)務(wù)受理程序、服務(wù)承諾、用戶抱怨制度
- GB/T 44670-2024殯儀館職工安全防護(hù)通用要求
- 8.制作豆腐 教案 2023-2024學(xué)年江蘇鳳凰出版社九年級(jí)勞動(dòng)技術(shù)
- 《聯(lián)合國(guó)教科文:學(xué)生人工智能能力框架》-中文版
- 合同債務(wù)人變更協(xié)議書模板
- 高中生物必修一知識(shí)點(diǎn)總結(jié)(必修1)
- 《風(fēng)力發(fā)電技術(shù)》課件-第三章 機(jī)組運(yùn)行與維護(hù)
- 2024年高中生物新教材同步選擇性必修第三冊(cè)學(xué)習(xí)筆記第4章 本章知識(shí)網(wǎng)絡(luò)
- 物料報(bào)廢回收合同范本
- 西班牙可再生能源行業(yè)市場(chǎng)前景及投資研究報(bào)告-培訓(xùn)課件外文版2024.6光伏儲(chǔ)能風(fēng)電
- 科研機(jī)構(gòu)成果轉(zhuǎn)化困境與對(duì)策
評(píng)論
0/150
提交評(píng)論