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

編譯原理語法分析

上傳人:jun****875 文檔編號:17814162 上傳時間:2020-12-07 格式:DOCX 頁數(shù):30 大?。?1.97KB
收藏 版權(quán)申訴 舉報 下載
編譯原理語法分析_第1頁
第1頁 / 共30頁
編譯原理語法分析_第2頁
第2頁 / 共30頁
編譯原理語法分析_第3頁
第3頁 / 共30頁

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

9.9 積分

下載資源

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

資源描述:

《編譯原理語法分析》由會員分享,可在線閱讀,更多相關(guān)《編譯原理語法分析(30頁珍藏版)》請在裝配圖網(wǎng)上搜索。

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

2、clude #include using namespace std; struct yufa { string SYM; //單詞的類別 string strToken; //用戶所定義的標(biāo)識符的值 int l; //記錄換行符的個數(shù),即記錄源文件的行數(shù) }yufa0, yufa1, yufa2[1000];//yufa1用于保存各個單詞,yufa1用于詞法分析過程;yufa0主要用于語法分析; char ch; int mm= 0; //結(jié)構(gòu)體數(shù)組下標(biāo) int line = 0;//出錯位置 //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)示符出錯" << endl; exit(0); //出錯即退出 } void error1() { cout << "第" << line << "行缺少分號" << endl; } void error2() { cout << "第" << line << "行標(biāo)識符(變量名)出錯" << endl; } void error3() { cout << "第" << li

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

6、 } void error8() { cout << "第" << line << "行缺少左括號" << endl; } void error9() { cout << "第" << line << "行缺少參數(shù)" << endl; } void error10() { cout << "第" << line << "行procedure錯誤" << 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)用過程缺少標(biāo)識符" << endl; } void error15() { cout << "第" << line << "行缺少分號" << endl; } void error16() { cout << "第

8、" << line << "行條件語句出錯(缺少界符)" << 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)識符 { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == ";")//; { mm++; yufa0

9、.SYM = yufa2[mm].SYM; block(); } else error1();//缺少; } else error2();//缺少標(biāo)識符或者標(biāo)識符錯誤 } else error0(); cout << "\n\n--------------------------語法分析結(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()//常量說明的遞歸子程序?qū)崿F(xiàn), → const {,}; { line++; if (yufa0.SYM == "const") // const { mm++; yufa0.SYM = yufa2[mm].SYM; _const

11、();// while (yufa0.SYM == ",")//,逗號 { 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();//缺少賦值號,或者賦值號錯誤

13、 } else error2(); //缺少標(biāo)識符 } void vardecl()//變量說明的遞歸子程序?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)識符即缺少變量 } 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();//括號不匹配 (右括號少) } else error8();//左括號缺少 } else error9();//缺少參數(shù) } else error10();//procedure錯誤 } 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();//語

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> //語句 // |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();//賦值號錯誤 } 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();//缺少右括號 } // 此處不會報錯,[({,})]因為表示可有可無的 } else error14();//調(diào)用過程缺少標(biāo)識符 } 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();//缺少右括號 } else error9();//read缺少參數(shù) } else error8();//缺少左括號 } 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();//缺少右括號 } else error8();//缺少左括號 } 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();//條件語句出錯,缺少界符 } //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(); //缺少右括號 } else error8();//缺少左括號 } 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ù)字后面跟字母,錯誤詞法 { while(IsLetter(ch)||IsDigit(ch)) { St

40、rToken = Concat(ch,StrToken); ch = file.get(); } cout <<"詞法錯誤!(數(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 << ":" << "詞法錯誤(:后面沒有=)" << 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 << "請輸入源文件名:"; cin.getline(filename, 30); file.open(filename, ios::in); if (!file) { cout << "文件打開失敗!\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--------------------------語法分析------------------------" << endl; yufa0.SYM = yufa2[mm].SYM; // yufa0.SYM = yufa1.SYM; prog(); return 0; }

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

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

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

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


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