




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、語(yǔ)法分析實(shí)驗(yàn)報(bào)告一、實(shí)驗(yàn)?zāi)康模?1. 了解單詞(內(nèi)部編碼)符號(hào)串中的短語(yǔ)句型結(jié)構(gòu)形成規(guī)律。 2. 理解和掌握語(yǔ)法分析過(guò)程中語(yǔ)法分析思想(LL,LR)的智能算法化方法。二、實(shí)驗(yàn)內(nèi)容:構(gòu)造自己設(shè)計(jì)的小語(yǔ)言的語(yǔ)法分析器: 1. 小語(yǔ)言的語(yǔ)法描述(語(yǔ)法規(guī)則)的設(shè)計(jì)即文法的設(shè)計(jì); 2. 把文法形式符號(hào)中所隱含的信息內(nèi)容挖掘出來(lái)并用LL或LR的資料形式(分析表)表示出來(lái); 3. 語(yǔ)法分析的數(shù)據(jù)輸入形式和輸出形式的確定;4. 語(yǔ)法分析程序各個(gè)模塊的設(shè)計(jì)與調(diào)試。主要設(shè)備和材料:電腦、winxp操作系統(tǒng)、VC語(yǔ)言系統(tǒng)三、實(shí)驗(yàn)步驟:1、語(yǔ)法規(guī)則 <程序> := <變量定義語(yǔ)句> | <
2、;賦值語(yǔ)句> | <條件語(yǔ)句> | <循環(huán)語(yǔ)句> <變量定義語(yǔ)句> := var 變量,變量; <賦值語(yǔ)句> := 變量 := <表達(dá)式>; <表達(dá)式> := 標(biāo)識(shí)符運(yùn)算符 標(biāo)識(shí)符 ; <標(biāo)識(shí)符> := 變量 |常量 <運(yùn)算符 > := + | - | * | / | >= | <= <條件語(yǔ)句> := <if語(yǔ)句><else語(yǔ)句> <if語(yǔ)句> := if(表達(dá)式) thenbegin 賦值語(yǔ)句 |條件語(yǔ)句 | 循環(huán)語(yǔ)句end &l
3、t;else語(yǔ)句> := begin 賦值語(yǔ)句 | 條件語(yǔ)句 | 循環(huán)語(yǔ)句 end <循環(huán)語(yǔ)句> := while(表達(dá)式) begin 賦值語(yǔ)句 | 條件語(yǔ)句 | 循環(huán)語(yǔ)句 end <輸出語(yǔ)句> := prn 表達(dá)式-注1:若if語(yǔ)句、else語(yǔ)句、循環(huán)語(yǔ)句中出現(xiàn)begin,后面的end必須出現(xiàn),即begin與end同對(duì)出現(xiàn)-注2:if、while后的"(",")"表示終結(jié)符,而不是定義成分優(yōu)先的說(shuō)明符號(hào)2、分析表: : =變量常量 , ;運(yùn)算符 ( )變 量定 義-> -> -> -> 賦 值語(yǔ)
4、句->->->-> ->條 件語(yǔ) 句->-> -> -> -> -> -> 循 環(huán)語(yǔ) 句-> -> -> -> -> -> -> 輸 出語(yǔ) 句->->->分析表(續(xù)):whilevarbeginendifthenprn變 量 定 義-> 賦 值 語(yǔ) 句條 件 語(yǔ) 句->->-> -> 循 環(huán) 語(yǔ) 句-> -> -> 輸 出 語(yǔ) 句->3、 調(diào)試和測(cè)試四、實(shí)驗(yàn)總結(jié):本實(shí)驗(yàn)在詞法分析的基礎(chǔ)上,對(duì)提取出的標(biāo)識(shí)符進(jìn)行語(yǔ)
5、法判斷。對(duì)已有的語(yǔ)法規(guī)則運(yùn)用LL(1)文法判別并進(jìn)行構(gòu)造分析表時(shí),遇到的最大困難是:當(dāng)發(fā)生規(guī)約沖突時(shí),該如何處理。如對(duì)于產(chǎn)生式s->aAb,當(dāng)對(duì)a進(jìn)行規(guī)約時(shí),滿足語(yǔ)法規(guī)則的(用戶輸入串中當(dāng)前要進(jìn)行規(guī)約的標(biāo)識(shí)符)只有有限種,而不滿足的卻有無(wú)限種情況。當(dāng)發(fā)生規(guī)約沖突時(shí),如何在這無(wú)限種情況中,確定沖突的具體信息,以便用戶查找。在反復(fù)的嘗試和驗(yàn)證中,我們發(fā)現(xiàn)發(fā)生沖突的用戶輸入串滿足一定的規(guī)律,且按這種規(guī)律可以把這無(wú)限種情況化歸為有限類,于是我們找出其中規(guī)律并進(jìn)行劃分,然后再對(duì)這些有限類沖突進(jìn)行處理。五、實(shí)驗(yàn)心得:通過(guò)這次實(shí)驗(yàn)有以下幾點(diǎn)收獲:1 LR(1)的構(gòu)造使得對(duì)理論的知識(shí)理解的更加透徹。其中
6、LR(1)分析表構(gòu)造了很多遍,一直無(wú)法得到正確結(jié)果,這是恒心的考驗(yàn)。2 在寫程序中用類數(shù)組來(lái)存放單詞屬性使得對(duì)單詞各項(xiàng)值的調(diào)用更加方便,特別是對(duì)出錯(cuò)信息的檢測(cè)有很大的作用。3 本實(shí)驗(yàn)是在詞法基礎(chǔ)上的更進(jìn)一步,在詞法程序上添加語(yǔ)法程序,更加理解二者之間的關(guān)系。詞法分析為語(yǔ)法分析提供了詞法單元,方便分析,使程序模塊化,易于讀懂。六、附錄:#include <iostream>#include <fstream>#include <string>#include <math.h>#include <ctype.h>#include <
7、cstdlib>using namespace std;#define Max 655 /最大代碼長(zhǎng)度#define WordMaxNum 256 /變量最大個(gè)數(shù)#define DigitNum 256/常量最大個(gè)數(shù)#define MaxKeyWord32/關(guān)鍵字?jǐn)?shù)量#define MaxOptANum 8/運(yùn)算符最大個(gè)數(shù)#define MaxOptBNum 4/運(yùn)算符最大個(gè)數(shù)#define MaxEndNum 11/界符最大個(gè)數(shù)typedef struct DisplayTableint Index; /標(biāo)識(shí)符所在表的下標(biāo)int type;/標(biāo)識(shí)符的類型int line;/標(biāo)識(shí)符所在表
8、的行數(shù)char symbol20;/標(biāo)識(shí)符所在表的名稱Table;int TableNum = 0; /display表的表項(xiàng)總數(shù)char WordWordMaxNum20; /標(biāo)識(shí)符表char DigitWordMaxNum20; /數(shù)字表int WordNum = 0; /變量表的下標(biāo)int DigNum = 0; /常量表的下標(biāo)bool errorFlag = 0; /錯(cuò)誤標(biāo)志 int TableIndex = -1; /display 表的下標(biāo)索引int beginCount = 0;/遇到begin加1,遇到end減1int ifCount = 0; /遇到if加1Table *ta
9、ble = new TableMax;/關(guān)鍵字const char* const KeyWordMaxKeyWord = "and","array", "begin","case","char","constant","do","else","end","false","for","if","input","integer&qu
10、ot;,"not","of","or","output","packed","procedure","program","read","real","repeat","set", "then", "to", "type", "until", "var","while&q
11、uot;, "with","prn" / 單目運(yùn)算const char OptA = '+','-','*','/','=','#','<','>'/雙目運(yùn)算符const char *OptB = "<=",">=",":=","<>"/ 界符const char End = '(', ')
12、' , ',' , '' , '.' , '' , '' , ':' , '' , '' , '"' void error(char str20,int nLine, int errorType) errorFlag = 1; cout <<" nError : " switch(errorType) case 1:cout << "第" << nLine-1
13、 <<"行" << str << " 變量的長(zhǎng)度超過(guò)限制!n" break; case 2:cout << "第" << nLine-1 <<"行" << str << " 小數(shù)點(diǎn)錯(cuò)誤!n" break;case 3:cout << "第" << nLine-1 <<"行" << str << &quo
14、t; 常量的長(zhǎng)度超過(guò)限制!n"break;/switch/errorvoid Scanner(char ch,int chLen,int nLine)int chIndex = 0; while(chIndex < chLen) /對(duì)輸入的字符掃描/*處理空格和tab*/忽略空格和tabwhile(chchIndex = ' ' | chchIndex = 9 ) chIndex +; /*處理?yè)Q行符*/ /遇到換行符,行數(shù)加1while(chchIndex = 10) nLine+;chIndex +;/*標(biāo)識(shí)符*/if( isalpha(chchIndex)
15、 /以字母、下劃線開頭 char str256; int strLen = 0;/是字母、下劃線while(isalpha(chchIndex) | chchIndex = '_' ) strstrLen + = chchIndex; chIndex +;while(isdigit(chchIndex)/不是第一位,可以為數(shù)字strstrLen + = chchIndex;chIndex +;strstrLen = 0; /字符串結(jié)束符if(strlen(str) > 20) /標(biāo)識(shí)符超過(guò)規(guī)定長(zhǎng)度,報(bào)錯(cuò)處理error(str,nLine,1); elseint i; fo
16、r(i = 0;i < MaxKeyWord; i+) /與關(guān)鍵字匹配/是關(guān)鍵字,寫入table表中 if(strcmp(str, KeyWordi) = 0) strcpy(tableTableNum.symbol,str);tableTableNum.type = 1; /關(guān)鍵字tableTableNum.line = nLine;tableTableNum.Index = i;TableNum +;break; if(i >= MaxKeyWord) /不是關(guān)鍵字tableTableNum.Index = WordNum;strcpy(WordWordNum+,str);ta
17、bleTableNum.type = 2; /變量標(biāo)識(shí)符strcpy(tableTableNum.symbol,str);tableTableNum.line = nLine;TableNum +;/*常數(shù)*/else if(isdigit(chchIndex) /遇到數(shù)字int flag = 0;char str256;int strLen = 0;/數(shù)字和小數(shù)點(diǎn)while(isdigit(chchIndex) | chchIndex = '.')/flag表記小數(shù)點(diǎn)的個(gè)數(shù),0時(shí)為整數(shù),1時(shí)為小數(shù),2時(shí)出錯(cuò)if(chchIndex = '.') flag +;
18、strstrLen + = chchIndex;chIndex +; strstrLen = 0;if(strlen(str) > 20) /常量標(biāo)識(shí)符超過(guò)規(guī)定長(zhǎng)度20,報(bào)錯(cuò)處理error(str,nLine,3);if(flag = 0)tableTableNum.type = 3; /整數(shù)if(flag = 1)tableTableNum.type = 4; /小數(shù)if(flag > 1)error(str,nLine,2);tableTableNum.Index = DigNum;strcpy(DigitDigNum +,str);strcpy(tableTableNum.s
19、ymbol,str);tableTableNum.line = nLine;TableNum +;/*運(yùn)算符*/else/用來(lái)區(qū)分是不是無(wú)法識(shí)別的標(biāo)識(shí)符,0為運(yùn)算符,1為界符int errorFlag;char str3;str0 = chchIndex;str1 = chchIndex + 1;str2 = '0'int i;for( i = 0;i < MaxOptBNum;i+)/MaxOptBNum)if(strcmp(str,OptBi) = 0) errorFlag = 0; tableTableNum.type = 6; strcpy(tableTableN
20、um.symbol,str); tableTableNum.line = nLine; tableTableNum.Index = i; TableNum +; chIndex = chIndex + 2; break;if(i >= MaxOptBNum)for( int k = 0;k < MaxOptANum; k+)if(OptAk = chchIndex)errorFlag = 0;tableTableNum.type = 5;tableTableNum.symbol0 = chchIndex;tableTableNum.symbol1 = 0;tableTableNum
21、.line = nLine;tableTableNum.Index = k;TableNum +;chIndex +;break;/*界符*/for(int j = 0;j < MaxEndNum;j +)if(Endj =chchIndex)errorFlag = 1;tableTableNum.line = nLine;tableTableNum.symbol0 = chchIndex;tableTableNum.symbol1 = 0;tableTableNum.Index = j;tableTableNum.type = 7;TableNum +;chIndex +;/*其他無(wú)法
22、識(shí)別字符*/開頭的不是字母、數(shù)字、運(yùn)算符、界符if(errorFlag != 0 && errorFlag != 1) char str256;int strLen = -1;strstrLen + = chchIndex;chIndex +;while(*ch != ' ' | *ch != 9 | chchIndex != 10)strstrLen + = chchIndex;chIndex +;strstrLen = 0;tableTableNum.type = 8;strcpy(tableTableNum.symbol,str);tableTableNu
23、m.line = nLine;tableTableNum.Index = -2;TableNum +; /*把十進(jìn)制小數(shù)轉(zhuǎn)為16進(jìn)制*/void Trans(double x,int p) /把十進(jìn)制小數(shù)轉(zhuǎn)為16進(jìn)制int i=0; /控制保留的有效位數(shù)while(i<p) if(x=0) /如果小數(shù)部分是0 break; /則退出循環(huán) else int k=int(x*16); /取整數(shù)部分 x=x*16-int(k); /得到小數(shù)部分 if(k<=9) cout<<k; else cout<<char(k+55); ; i+; ;/*語(yǔ)法錯(cuò)誤*/void
24、 Gerror(int errorType,int nIndex)errorFlag = 1;switch(errorType)case 1:cout << "第" << tablenIndex.line <<"行:" << tablenIndex.symbol <<" 應(yīng)該為賦值號(hào):= n"break; case 2:cout << "第" << tablenIndex.line <<"行:" &l
25、t;< tablenIndex.symbol <<" 應(yīng)為變量 n"break;case 3:cout << "第" << tablenIndex.line <<"行:" << tablenIndex.symbol <<" 應(yīng)為逗號(hào) n"break; case 4:cout << "第" << tablenIndex.line <<"行:" << ta
26、blenIndex.symbol <<" 應(yīng)為分號(hào) n"break;case 5:cout << "第" << tablenIndex.line <<"行:" << tablenIndex.symbol <<" 應(yīng)為運(yùn)算符 n"break;case 6:cout << "第" << tablenIndex.line <<"行:" << tablenIndex
27、.symbol <<" 應(yīng)為變量或常量 n"break;case 7:cout << "第" <<tableTableIndex.line <<"行 " << tablenIndex.symbol << "與"<<tableTableIndex + 1.symbol <<"之間缺少運(yùn)算符 n"break;case 8:cout << "第" << table
28、nIndex.line <<"行:" << tablenIndex + 1 .symbol <<" 應(yīng)為'(' n"break;case 9:cout << "第" <<tableTableIndex.line <<"行 " << tableTableIndex.symbol << "與" <<tablenIndex + 1.symbol <<"之間缺
29、少'(' n"break;case 10:cout << "第" << tableTableIndex - 1.line << " 行: 缺少'then'" << endl;break;case 11: cout << "第" << tableTableIndex.line << " 行:"<<tablenIndex.symbol << "應(yīng)為then n&
30、quot; break;case 12:cout << "第" << tableTableIndex.line << " 行: end 后不能接 " <<tableTableIndex.symbol << endl; break;case 13:cout << "第" << tablenIndex.line <<"行: " << tablenIndex - 1.symbol <<"與 &
31、quot; <<tableTableIndex.symbol <<"之間缺少變量 n"break;case 14:cout << "第" <<tablenIndex .line <<"行 " << tablenIndex .symbol << "后缺少'' n"break;case 15:cout << "第" << tableTableIndex.line <<
32、; " 行:"<<tablenIndex.symbol << "應(yīng)為')' n"break;case 16:cout << "第" << tableTableIndex.line << " 行,begin 后不能接 " <<tableTableIndex.symbol << endl;break;/*表達(dá)式判斷*/bool express()while(1 ) if(tableTableIndex.type=2|ta
33、bleTableIndex.type = 3 ) if(tableTableIndex.type=3&&tableTableIndex+ 1.type = 2 && tableTableIndex.line = tableTableIndex + 1.line) Gerror(7,TableIndex); /出錯(cuò)信息:該處缺少運(yùn)算符/TableIndex = TableIndex + 2;TableIndex +;if(tableTableIndex.line != tableTableIndex + 1.line)/Gerror(14,TableIndex);
34、 /出錯(cuò)信息:該語(yǔ)句缺少分號(hào)return 1; TableIndex +;else if(tableTableIndex.type = 5|tableTableIndex.type = 6)Gerror(13,TableIndex);TableIndex +;else Gerror(6,TableIndex); /出錯(cuò)信息:該處應(yīng)為變量或常量TableIndex +;if(tableTableIndex.type =5| tableTableIndex.type = 6 )TableIndex +;else if(tableTableIndex.type = 7)return 1;else i
35、f(TableIndex >= TableNum) /| ) Gerror(14,TableIndex); /出錯(cuò)信息:該語(yǔ)句缺少分號(hào) return 1;else Gerror(5,TableIndex); /出錯(cuò)信息:此處應(yīng)為運(yùn)算符 TableIndex +;/*賦值語(yǔ)句判斷*/bool Assign() /賦值語(yǔ)句的判斷TableIndex +;if(strcmp( ":=" , tableTableIndex.symbol) = 0)TableIndex +; else Gerror(1,TableIndex); /出錯(cuò)信息:賦值號(hào)應(yīng)該為":=&quo
36、t; TableIndex +;if(express() /":="后可以為變量或常量if(strcmp("",tableTableIndex.symbol) = 0)return 1;else if(TableIndex >= TableNum) Gerror(14,TableIndex); /出錯(cuò)信息:該語(yǔ)句缺少分號(hào) return 1;else if(tableTableIndex.line != tableTableIndex + 1.line)Gerror(14,TableIndex); /出錯(cuò)信息:該語(yǔ)句缺少分號(hào)return 1;/Tab
37、leIndex +;else Gerror(6,TableIndex); /出錯(cuò)信息:":="后應(yīng)為變量或常量 TableIndex +;return 0;/*語(yǔ)句判斷*/bool judge() /條件、循環(huán)、初始化語(yǔ)句的判斷/*begin*/if(strcmp("begin",tableTableIndex.symbol)=0) /匹配begin beginCount +; if(tableTableIndex + 1.type = 7)TableIndex +;cout << "第" << tableTa
38、bleIndex.line << " 行,begin 后不能接 " <<tableTableIndex.symbol << endl;return 1;/*end*/if(strcmp("end",tableTableIndex.symbol) = 0) /匹配endbeginCount -;if(TableIndex < TableNum)if(tableTableIndex+1.type=7|tableTableIndex+ 1.type = 8)TableIndex +;Gerror(12,TableInd
39、ex);return 1; /*else*/if(strcmp("else",tableTableIndex.symbol) = 0) /匹配else ifCount -; return 1;if(strcmp("prn",tableTableIndex.symbol) = 0)/匹配prn TableIndex +; if(tableTableIndex.type = 2 | tableTableIndex.type = 3) / prn 后為變量或常量TableIndex +; /語(yǔ)句結(jié)束,“;”if(strcmp("",tabl
40、eTableIndex.symbol) = 0)return 1; else Gerror(4,TableIndex);/出錯(cuò)信息:此處應(yīng)為"" /ifelse Gerror(2,TableIndex);/出錯(cuò)信息:此處應(yīng)為變量 TableIndex +; /if_prn/*var變量定義*/if(strcmp("var",tableTableIndex.symbol) = 0)/ var a,b,c;TableIndex +;if(tableTableIndex.type != 2)if(strcmp(",",tableTableI
41、ndex.symbol) = 0)Gerror(13,TableIndex);else Gerror(2,TableIndex);/出錯(cuò)信息:此處應(yīng)為變量TableIndex +;if(strcmp(",",tableTableIndex.symbol) !=0)Gerror(3,TableIndex); /出錯(cuò)信息:此處應(yīng)為","TableIndex +;while(1)while(strcmp(",",tableTableIndex.symbol)=0)TableIndex = TableIndex + 1;if(tableTab
42、leIndex.type !=2)Gerror(2,TableIndex);/出錯(cuò)信息:此處應(yīng)為變量TableIndex +; TableIndex +;if(strcmp("",tableTableIndex.symbol)=0)return 1;else Gerror(4,TableIndex);/出錯(cuò)信息:此處應(yīng)為分號(hào)""return 0;/*if語(yǔ)句判斷*/if語(yǔ)句else if(strcmp("if",tableTableIndex.symbol) = 0) ifCount +; /if個(gè)數(shù)加1 if(tableTableIndex +1.type = 2 | tableTableIndex + 1.type = 3)Gerror(9,TableIndex); /出錯(cuò)信息:此處缺少')'TableIndex +; else if(strcmp("(",tableTableIndex + 1.symbol) != 0
溫馨提示
- 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. 人人文庫(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司福利團(tuán)建旅游活動(dòng)方案
- 公司自駕游出行活動(dòng)方案
- 2025年職業(yè)生涯規(guī)劃與發(fā)展考試試卷及答案
- 2025年應(yīng)急救援與災(zāi)難管理考試題及答案
- 2025年新興技術(shù)與傳統(tǒng)行業(yè)融合發(fā)展的能力測(cè)試試卷及答案
- 2025年水資源管理與可持續(xù)發(fā)展考試題及答案
- 2025年生物醫(yī)學(xué)工程專業(yè)綜合考試試題及答案
- 2025年農(nóng)田水利工程師職業(yè)資格考試試卷及答案
- 2025年量子物理基礎(chǔ)知識(shí)與應(yīng)用考試試題及答案
- 2025年公共英語(yǔ)等級(jí)考試試卷及答案
- 地下室頂板行車與堆載驗(yàn)算與加固方案
- 生物多樣性保護(hù)與建設(shè)項(xiàng)目可行性研究報(bào)告
- 健康減肥調(diào)脂降糖
- LaTeX科技排版課件
- 2023年河北交通投資集團(tuán)有限公司招聘筆試題庫(kù)及答案解析
- 反向傳播算法課件
- 企業(yè)質(zhì)量安全主體責(zé)任
- 南模自招試卷-2012年自主招生
- 數(shù)據(jù)倉(cāng)庫(kù)開發(fā)規(guī)范
- 可下載打印的公司章程
- 固定資產(chǎn)報(bào)廢申請(qǐng)單
評(píng)論
0/150
提交評(píng)論