影音先锋男人资源在线观看,精品国产日韩亚洲一区91,中文字幕日韩国产,2018av男人天堂,青青伊人精品,久久久久久久综合日本亚洲,国产日韩欧美一区二区三区在线

編譯原理語(yǔ)法分析.docx

上傳人:小** 文檔編號(hào):16684803 上傳時(shí)間:2020-10-21 格式:DOCX 頁(yè)數(shù):30 大?。?9.80KB
收藏 版權(quán)申訴 舉報(bào) 下載
編譯原理語(yǔ)法分析.docx_第1頁(yè)
第1頁(yè) / 共30頁(yè)
編譯原理語(yǔ)法分析.docx_第2頁(yè)
第2頁(yè) / 共30頁(yè)
編譯原理語(yǔ)法分析.docx_第3頁(yè)
第3頁(yè) / 共30頁(yè)

下載文檔到電腦,查找使用更方便

5 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《編譯原理語(yǔ)法分析.docx》由會(huì)員分享,可在線閱讀,更多相關(guān)《編譯原理語(yǔ)法分析.docx(30頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、上機(jī)練習(xí)二:語(yǔ)法分析 一、根據(jù)上機(jī)練習(xí)一給出的PL/0語(yǔ)言擴(kuò)充的巴克斯范式語(yǔ)法描述,利用遞歸下降的語(yǔ)法分析方法,編寫PL/0語(yǔ)言的語(yǔ)法分析程序。 要求: 1. 對(duì)給出的PL/0語(yǔ)言進(jìn)行分析,證明其可以進(jìn)行自上而下的語(yǔ)法分析; 2. 對(duì)block、proc、statement、condition、expression、term、factor進(jìn)行分析,畫出語(yǔ)法分析圖,在此基礎(chǔ)上描述這些子程序的設(shè)計(jì)思想; 3. 具有一定的語(yǔ)法錯(cuò)誤處理能力; 二、源代碼 #include #include #include #in

2、clude #include using namespace std; struct yufa { string SYM; //單詞的類別 string strToken; //用戶所定義的標(biāo)識(shí)符的值 int l; //記錄換行符的個(gè)數(shù),即記錄源文件的行數(shù) }yufa0, yufa1, yufa2[1000];//yufa1用于保存各個(gè)單詞,yufa1用于詞法分析過(guò)程;yufa0主要用于語(yǔ)法分析; char ch; int mm= 0; //結(jié)構(gòu)體數(shù)組下標(biāo) int line = 0;//出錯(cuò)位置 //char

3、 ch = ; string key[15] = { "begin", "end", "if", "then", "else", "while", "write", "read", "do", "call", "const", "var", "procedure", "program", "odd" };//預(yù)設(shè)保留字 void prog(); void block(); void condecl(); void _const(); void vardecl(); void proc(); void body(); void statement(); void

4、lexp(); void exp(); void term(); void factor(); void error0() { cout << "program標(biāo)示符出錯(cuò)" << endl; exit(0); //出錯(cuò)即退出 } void error1() { cout << "第" << line << "行缺少分號(hào)" << endl; } void error2() { cout << "第" << line << "行標(biāo)識(shí)符(變量名)出錯(cuò)" << endl; } void error3() { cout << "第" << li

5、ne << "常量未聲明(缺少const)" << endl; } void error4() { cout << "第" << line << "常量未賦值" << endl; } void error5() { cout << "第" << line << "賦值號(hào)出錯(cuò)或者缺少賦值號(hào)" << endl; } void error6() { cout << "第" <

6、 } void error8() { cout << "第" << line << "行缺少左括號(hào)" << endl; } void error9() { cout << "第" << line << "行缺少參數(shù)" << endl; } void error10() { cout << "第" << line << "行procedure錯(cuò)誤" << endl; } void error11() { cout << "第" << line << "行缺少end(begin與end不匹配)" << endl; } void error12() {

7、 cout << "第" << line << "行缺少then(if與then不匹配)" << endl; } void error13() { cout << "第" << line << "行缺少do(while與do不匹配)" << endl; } void error14() { cout << "第" << line << "行調(diào)用過(guò)程缺少標(biāo)識(shí)符" << endl; } void error15() { cout << "第" << line << "行缺少分號(hào)" << endl; } void error16() { cout << "第

8、" << line << "行條件語(yǔ)句出錯(cuò)(缺少界符)" << endl; } void prog()//程序的遞歸子程序?qū)崿F(xiàn) { line++; if (yufa0.SYM == "program")// program { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "biaoshifu") // ,即標(biāo)識(shí)符 { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == ";")//; { mm++; yufa0

9、.SYM = yufa2[mm].SYM; block(); } else error1();//缺少; } else error2();//缺少標(biāo)識(shí)符或者標(biāo)識(shí)符錯(cuò)誤 } else error0(); cout << "\n\n--------------------------語(yǔ)法分析結(jié)束------------------------\n\n" << endl; } void block()//程序體的遞歸子程序?qū)崿F(xiàn), → [][][] { if (yu

10、fa0.SYM == "const") condecl(); if (yufa0.SYM == "var") vardecl(); if (yufa0.SYM == "procedure") proc(); body(); } void condecl()//常量說(shuō)明的遞歸子程序?qū)崿F(xiàn), → const {,}; { line++; if (yufa0.SYM == "const") // const { mm++; yufa0.SYM = yufa2[mm].SYM; _const

11、();// while (yufa0.SYM == ",")//,逗號(hào) { mm++; yufa0.SYM = yufa2[mm].SYM; _const(); }// if (yufa0.SYM == ";")//; { mm++; yufa0.SYM = yufa2[mm].SYM; } else error1();//缺少; } else error3();//缺少常量定義const } void _const()//常量,:=

12、 { if (yufa0.SYM == "biaoshifu") // { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "fuzhi") { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "didit") { mm++; yufa0.SYM = yufa2[mm].SYM; } else error4();//常量未賦值 } else error5();//缺少賦值號(hào),或者賦值號(hào)錯(cuò)誤

13、 } else error2(); //缺少標(biāo)識(shí)符 } void vardecl()//變量說(shuō)明的遞歸子程序?qū)崿F(xiàn), → var {,}; { line++; if (yufa0.SYM == "var") { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "biaoshifu") // { mm++; yufa0.SYM = yufa2[mm].SYM; while (yufa0.SYM == ",")//, { m

14、m++; yufa0.SYM = yufa2[mm].SYM;//下一單詞 if (yufa0.SYM == "biaoshifu") // { mm++; yufa0.SYM = yufa2[mm].SYM; } else error2();//缺少標(biāo)識(shí)符即缺少變量 } if (yufa0.SYM == ";") { mm++; yufa0.SYM = yufa2[mm].SYM; }//下一單詞 else error2(); } } else error6(

15、);//變量未聲明 } void proc()// → procedure {,});{;} { line++; if (yufa0.SYM == "procedure") //procedure { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "biaoshifu") // { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "(") //( {

16、 mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "biaoshifu")// { mm++; yufa0.SYM = yufa2[mm].SYM; while (yufa0.SYM == ",")// , { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "biaoshifu") { mm++; yufa0.SYM = yufa2[mm].SYM;

17、 } else error2(); } } if (yufa0.SYM == ")")// ) { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == ";") //; { mm++; yufa0.SYM = yufa2[mm].SYM;//下一單詞---------->> block(); while (yufa0.SYM == ";") { mm++; yufa0.

18、SYM = yufa2[mm].SYM; proc(); } } else error1();// 缺少; } else error7();//括號(hào)不匹配 (右括號(hào)少) } else error8();//左括號(hào)缺少 } else error9();//缺少參數(shù) } else error10();//procedure錯(cuò)誤 } void body()// → begin {;}end { if (yu

19、fa0.SYM == "begin") { line++; mm++; yufa0.SYM = yufa2[mm].SYM; statement(); // while ((yufa0.SYM == "biaoshi") || (yufa0.SYM == "if") || (yufa0.SYM == "while") || // (yufa0.SYM == "call") || (yufa0.SYM == "read") || (yufa0.SYM == "write") || (yufa0.SYM == "begin")) // error1();//語(yǔ)

20、句未到最后一條,缺少";" while(yufa0.SYM == ";") { mm++; yufa0.SYM = yufa2[mm].SYM; statement(); } if (yufa0.SYM == "end") { line ++; mm++; yufa0.SYM = yufa2[mm].SYM; } else error11();//缺少end與begin匹配 } else error12();//缺少begin } // := <

21、statement> //語(yǔ)句 // |if then [else ] // |while do // |call [({,})] // | // |read ({,}) // |write ({,}) void statement() {

22、 if (yufa0.SYM == "biaoshifu") // := { line++; mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "fuzhi") { mm++; yufa0.SYM = yufa2[mm].SYM; exp(); } else error5();//賦值號(hào)錯(cuò)誤 } else if (yufa0.SYM == "if") //if then [else

23、tement>] { line++; mm++; yufa0.SYM = yufa2[mm].SYM; lexp(); if (yufa0.SYM == "then") { mm++; yufa0.SYM = yufa2[mm].SYM; statement(); if (yufa0.SYM == "else") { mm++; yufa0.SYM = yufa2[mm].SYM; statement(); } } else error12();//缺少then } els

24、e if (yufa0.SYM == "while")//while do { line++; mm++; yufa0.SYM = yufa2[mm].SYM; lexp(); if (yufa0.SYM == "do") { mm++; yufa0.SYM = yufa2[mm].SYM; statement(); } else error13();//缺少do不匹配(while 與do 不匹配) } else if (yufa0.SYM == "call")//call

25、d>[({,})] { line++; mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "biaoshifu") // { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "(") // { mm++; yufa0.SYM = yufa2[mm].SYM; while(yufa0.SYM == ",") { mm++;yufa0.SYM = yufa2[mm].SYM;

26、 exp(); } if (yufa0.SYM == ")") { mm++; yufa0.SYM = yufa2[mm].SYM; } else error7();//缺少右括號(hào) } // 此處不會(huì)報(bào)錯(cuò),[({,})]因?yàn)楸硎究捎锌蔁o(wú)的 } else error14();//調(diào)用過(guò)程缺少標(biāo)識(shí)符 } else if (yufa0.SYM == "read")//read ({,}) { line++; mm++; yufa0.SYM

27、= yufa2[mm].SYM; if (yufa0.SYM == "(") { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "biaoshifu") { mm++; yufa0.SYM = yufa2[mm].SYM; while (yufa0.SYM == ",") { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "biaoshifu") { mm++; yu

28、fa0.SYM = yufa2[mm].SYM; } else error2();//缺少標(biāo)示符 } if (yufa0.SYM == ")") { mm++; yufa0.SYM = yufa2[mm].SYM; } else error7();//缺少右括號(hào) } else error9();//read缺少參數(shù) } else error8();//缺少左括號(hào) } else if (yufa0.SYM == "write")//write ({,<

29、exp>}) { line++; mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == "(") { mm++; yufa0.SYM = yufa2[mm].SYM; exp(); while (yufa0.SYM == ",") { mm++; yufa0.SYM = yufa2[mm].SYM; exp(); } if (yufa0.SYM == ")

30、") { mm++; yufa0.SYM = yufa2[mm].SYM; } else error7();//缺少右括號(hào) } else error8();//缺少左括號(hào) } else body();// } // |odd // → [+|-]{} //{} //||() //

31、> → =|<>|<|<=|>|>= // → +|- // → *|/ // → l{l|d} (注:l表示字母) // → dievbyqtbdd void lexp()// |odd { if (yufa0.SYM == "odd") { mm++; yufa0.SYM = yufa2[mm].SYM; exp(); } else { exp(); if ((yufa0.SYM == "ge") || (yufa0.SYM =

32、= "g") || (yufa0.SYM == "l") || (yufa0.SYM == "ne") || (yufa0.SYM == "l") || (yufa0.SYM == "=")) { mm++; yufa0.SYM = yufa2[mm].SYM; exp(); } else error15();//條件語(yǔ)句出錯(cuò),缺少界符 } //odd是否存在? } void exp()// → [+|-]{} { while((yufa0.SYM == "+") || (y

33、ufa0.SYM == "-")) { mm++; yufa0.SYM = yufa2[mm].SYM; term();// } term(); while ((yufa0.SYM == "+") || (yufa0.SYM == "-"))// → +|- { mm++; yufa0.SYM = yufa2[mm].SYM; term(); } } void term()//{} { factor(); while ((yu

34、fa0.SYM == "*") || (yufa0.SYM == "/"))// → *|/ { mm++; yufa0.SYM = yufa2[mm].SYM; factor();//factor() } } void factor()//||() { if (yufa0.SYM == "biaoshi") { mm++; yufa0.SYM = yufa2[mm].SYM; } else if (yufa0.SYM == "digit") { mm++

35、; yufa0.SYM = yufa2[mm].SYM; } else if (yufa0.SYM == "(") { mm++; yufa0.SYM = yufa2[mm].SYM; exp(); if (yufa0.SYM == ")") { mm++; yufa0.SYM = yufa2[mm].SYM; } else error7(); //缺少右括號(hào) } else error8();//缺少左括號(hào) } string Concat(char ch,string strToken) { s

36、trToken += ch; return strToken; } int IsLetter(char c ) //判斷字母 { if (((c <= z)&&(c >= a)) || ((c <= Z)&&(c >= A))) return 1; else return 0; } int IsDigit(char c) //判斷數(shù)字 { if ((c >= 0)&&(c <= 9)) return 1; else return 0; } int IsKey(string StrToken) //

37、判斷保留字 { int i; for (i = 0; i<15; i++) { if (key[i].compare(StrToken) == 0) return 1; } return 0; } void getsym(fstream &file) { string StrToken = ""; // if (ch == || ch == \t || ch == \n) //濾掉空白字符 // ch = file.get(); if (IsLetter(ch)) { while (IsLetter(c

38、h) || IsDigit(ch)) { StrToken = Concat(ch,StrToken); ch = file.get(); } if (IsKey(StrToken)) { int i; for (i = 0; i<15; i++) { if (key[i].compare(StrToken) == 0) yufa1.SYM = key[i]; } yufa1.strToken = StrToken; } else { yufa1.SYM

39、= "biaoshifu"; yufa1.strToken = StrToken; } } if (IsDigit(ch)) { StrToken = ""; while(IsDigit(ch)) { StrToken = Concat(ch,StrToken); ch = file.get(); } if(IsLetter(ch)) //數(shù)字后面跟字母,錯(cuò)誤詞法 { while(IsLetter(ch)||IsDigit(ch)) { St

40、rToken = Concat(ch,StrToken); ch = file.get(); } cout <<"詞法錯(cuò)誤!(數(shù)字后面跟字母) "<< StrToken<< endl; } else yufa1.SYM = "digit"; yufa1.strToken = StrToken; } else switch (ch) { case+:{yufa1.SYM = "+";yufa1.strToken = "+";ch = file.get();break;} case-:{yufa1.SYM = "-";yufa1

41、.strToken = "-";ch = file.get();break;} case*:{yufa1.SYM = "*";yufa1.strToken = "*";ch = file.get();break;} case/:{yufa1.SYM = "/";yufa1.strToken = "/";ch = file.get();break;} case(:{yufa1.SYM = "(";yufa1.strToken = "(";ch = file.get();break;} case):{yufa1.SYM = ")";yufa1.strToken = ")";ch =

42、 file.get();break;} case=:{yufa1.SYM = "=";yufa1.strToken = "=";ch = file.get();break;} case;:{yufa1.SYM = ";";yufa1.strToken = ";";ch = file.get();break;} case,:{yufa1.SYM = ",";yufa1.strToken = ",";ch = file.get();break;} case:: { ch = file.get(); if (ch == =) { yufa1.SYM =

43、"fuzhi"; yufa1.strToken = ":="; } else cout << ":" << "詞法錯(cuò)誤(:后面沒(méi)有=)" << endl; ch = file.get(); break; } case>: { ch = file.get(); if (ch == =) { yufa1.SYM = "ge"; yufa1.strToken = ">="; } else { yufa1.SYM = "g"; yufa1.strToken = ">";

44、} ch = file.get(); break; } case<: { ch = file.get(); if (ch == =) { yufa1.SYM = "le"; yufa1.strToken = "<="; } else if (ch == >) { yufa1.SYM = "ne"; yufa1.strToken = "<>"; } else { yufa1.SYM = "l"; yufa1.strToken = "<"; }

45、 ch = file.get(); break; } } } int main() { int nn = 0; string StrToken = ""; fstream file; char ch; int ll; char filename[30]; cout << "請(qǐng)輸入源文件名:"; cin.getline(filename, 30); file.open(filename, ios::in); if (!file) { cout << "文件打開(kāi)失敗!\n\n"; exit(0); } yufa

46、2[nn].l = 0; cout << "\n--------------------------詞法分析------------------------" << endl; // ch = file.get(); while (!file.eof()) { // if (ch == || ch == \t || ch == \n) //濾掉空白字符 // ch = file.get(); // ch = file.get(); if (ch == || ch == \t) ch=file.get(); while (

47、ch == \n) { ll ++; ch = file.get(); } getsym(file); nn++; yufa2[nn].SYM = yufa1.SYM; yufa2[nn].strToken = yufa1.strToken; yufa2[nn].l = ll; // cout.setf(ios::left); cout << "(" << setw(2) << nn << ") "; cout << setw(13) << yufa2[nn].SYM << se

48、tw(9) << yufa2[nn].strToken << "\n"; cout << setw(13) << yufa1.SYM << setw(9) << yufa1.strToken << "\n"; } // nn++; // yufa2[nn].SYM = "the_end";//完成 // yufa2[nn].strToken = "the_end"; file.close(); // cout << "\n\n\n--------------------------語(yǔ)法分析------------------------" << endl; yufa0.SYM = yufa2[mm].SYM; // yufa0.SYM = yufa1.SYM; prog(); return 0; }

展開(kāi)閱讀全文
溫馨提示:
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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!