




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)三:正規(guī)文法到正規(guī)式的轉(zhuǎn)換一:要求輸入任意的正規(guī)文法,輸出相應(yīng)的正規(guī)式二:實(shí)驗(yàn)?zāi)康?. 熟練掌握正規(guī)文法到正規(guī)式的轉(zhuǎn)換規(guī)則2. 理解正規(guī)文法和正規(guī)式的等價(jià)性三:實(shí)驗(yàn)原理1.一個(gè)正規(guī)語(yǔ)言可以由正規(guī)文法定義,也可以由正規(guī)式定義,對(duì)任意一個(gè)正規(guī)文法,存在一個(gè)定義同一個(gè)語(yǔ)言的正規(guī)式,反之,對(duì)每個(gè)正規(guī)式,存在生成同一個(gè)語(yǔ)言的正規(guī)文法2正規(guī)文法與正規(guī)式的轉(zhuǎn)換規(guī)則: 1 A-xB,B->y則:A=xy 2A-xA,A->y 則:A-x*y 3A-x,A-y 則:A=x|y四:數(shù)據(jù)結(jié)構(gòu)與算法struct Chomskystring left; string right; ;void apart
2、(Chomsky *p,int i) /分開(kāi)產(chǎn)生式左右部void VNVT(Chomsky *p)/求VN和VTint zero(Chomsky *p)/0型文法int one(Chomsky *p)/1型文法int two(Chomsky *p)/2型文法int three(Chomsky *p)/3型文法void change(Chomsky *p)/正規(guī)文法到正規(guī)式的轉(zhuǎn)換函數(shù)五:出錯(cuò)分析1: #include<iostream>忽視了c+語(yǔ)言中的頭文件應(yīng)當(dāng)去掉.h,須再另加上using namespace std;2:規(guī)則分解不對(duì),導(dǎo)致結(jié)果出錯(cuò)。3:太多循環(huán)嵌套容易造成程序出
3、錯(cuò),養(yǎng)成把括號(hào)提前打好的習(xí)慣。六:實(shí)驗(yàn)結(jié)果與分析不是正規(guī)文法的不能轉(zhuǎn)換:是正規(guī)文法的才可以轉(zhuǎn)換:七:源代碼#include<iostream>#include<string>using namespace std;#define max 50int NONE=1;string strings,noend,end;/非終結(jié)符與終結(jié)符存儲(chǔ)int n;/產(chǎn)生式總數(shù)struct Chomskystring left;string right; ; void apart(Chomsky *p,int i) /分開(kāi)產(chǎn)生式左右部int j; for(j=0;j<strings.
4、length();j+)if(stringsj='-')pi.left=strings.substr(0,j);pi.right=strings.substr(j+1,strings.length()-j);void VNVT(Chomsky *p)/求VN和VTint i,j;for(i=0;i<n;i+) for(j=0;j<(int)pi.left.length();j+) if(pi.leftj>='A'&&pi.leftj<='Z')/非終結(jié)符判斷if(noend.find(pi.leftj)&g
5、t;100)noend+=pi.leftj; elseif(end.find(pi.leftj)>100)end+=pi.leftj;for(j=0;j<(int)pi.right.length();j+) if(!(pi.rightj>='A'&&pi.rightj<='Z')/終結(jié)符判斷if(end.find(pi.rightj)>100)end+=pi.rightj;else if(noend.find(pi.rightj)>100)noend+=pi.rightj;int zero(Chomsky *p
6、)/0型文法int flag(0),count(0); int i,j; for(i=0;i<n;i+) for(j=0;j<(int)pi.left.length();j+)if(pi.leftj>='A'&&pi.leftj<='Z') /有否非終結(jié)符flag+;if(flag>0)flag=0;count+;else break; /左部沒(méi)有非終結(jié)符,結(jié)束if(count=n) return 1; /屬于0型文法elsecout<<endl<<"所輸產(chǎn)生式不屬于任何文法。&qu
7、ot;<<endl;NONE=0;return 0;int one(Chomsky *p)/1型文法int flag(0); int i; if(zero(p)for(i=0;i<n;i+) if(pi.right.length()<pi.left.length() /右部長(zhǎng)度是否小于左部flag+;break;elseflag-;if(flag>0)cout<<endl<<"此文法屬于0型文法,即短語(yǔ)文法。"<<endl; return 0; /不屬于1型文法else if(flag=0)return 1;
8、 /屬于1型文法elsereturn 0;int two(Chomsky *p)/2型文法int flag(0); int i; if(one(p)for(i=0;i<n;i+)if(pi.left.length()!=1)|!(pi.left0>='A'&&pi.left0<='Z') /左部不屬于一個(gè)字符或不屬于非終結(jié)符flag+;break;else flag-;if(flag>0)cout<<endl<<"此文法屬于1型文法,即上下文有關(guān)文法。"<<endl;
9、 return 0; /不屬于2型文法else if(flag=0)return 1; /屬于2型文法elsereturn 0;int three(Chomsky *p)/3型文法int flag=0;int i;if(two(p) for(i=0;i<n;i+) if(!(pi.right.length()=1|pi.right.length()=2)|(pi.right0>='A'&&pi.right0<='Z') /右部字符個(gè)數(shù)不是1或2,或首字符是非終結(jié)符 flag+; break; else if(pi.right.l
10、ength()=2)&&!(pi.right1>='A'&&pi.right1<='Z') /第二個(gè)字符不是非終結(jié)符 flag+; break; else flag-;if(flag>0) cout<<"此文法屬于2型文法,即上下文無(wú)關(guān)文法。"<<endl; i=n; return 0;else if(flag=0) cout<<"此文法屬于3型文法,即正規(guī)文法。"<<endl; return 1; else return 0
11、; void change(Chomsky *p)/正規(guī)文法到正規(guī)式的轉(zhuǎn)換函數(shù)int i,j,m,flag; /合并產(chǎn)生式for (i=0;i<n;i+)for(j=i+1;j<n;j+)if(pi.left=pj.left)&&(pi.right1=pj.right1)if(pi.right1=pj.right1&&pi.left0=pj.right1)/合并形如A->aA,A->bA的產(chǎn)生式為A->aA|bA的形式 pi.right=pi.right+"|"+pj.right; pj.left="&
12、quot; pj.right=""elseif(pi.right1=pj.right1&&pi.left0!=pj.right1)/合并形如S->aA,S->bA的產(chǎn)生式為S->aA|bA的形式 pi.right=pi.right+"|"+pj.right; pj.left="" pj.right="" if(pi.right.length()=1&&pj.right.length()=1&&pi.left=pj.left)/合并形如S->a,
13、S->b,S->c的產(chǎn)生式為S->a|b|c的形式pi.right=pi.right+"|"+pj.right; pj.left="" pj.right=""for(i=0;i<n;i+)/提取形如S->aA|bA的公因式為S->(a|b)A的形式 flag=pi.right.length(); if(pi.right.length()>2&&'A'<=pi.right1&&pi.right1<='Z'&&am
14、p;pi.right2='|') for(j=1;j<flag-1;j=j+3) pi.rightj=' ' if(j=flag-1) pi.right="("+pi.right.substr(0,pi.right.length()-1)+")"+pi.right.substr(pi.right.length()-1); for(i=0;i<n;i+) if(pi.left0=pi.rightpi.right.length()-1&&pi.right.length()>1) for(j=0
15、;j<n;j+) if(pi.left=pj.left&&j!=i) for(m=0;m<pj.right.length();m+) if('A'<=pj.rightm&&pj.rightm<='Z')break; if(m=pj.right.length() pi.right=pi.right.substr(0,pi.right.length()-1)+"*"+"("+pj.right+")" pj.right="" pj.l
16、eft="" flag=n; while(flag>=0)/當(dāng)所有產(chǎn)生式的右部均為終結(jié)符構(gòu)成時(shí)停止轉(zhuǎn)換 for(i=0,flag=flag-1;i<n;i+) for(j=0;j<pi.right.length();j+) if('A'<=pi.rightj&&pi.rightj<='Z') for(m=0;m<n;m+) if(pm.left0=pi.rightj&&m!=i) pi.right=pi.right.substr(0,j)+pm.right+pi.right.
17、substr(j+1); pm.left="" pm.right="" break; /再次合并左部相等的產(chǎn)生式 for(i=0;i<n;i+) for(j=0;j<n;j+) if(pi.left0=pj.left0&&i!=j) if(pj.right.length()>1) pi.right=pi.right+"|"+"("+pj.right+")" pj.left="" pj.right="" else pi.ri
18、ght=pi.right+"|"+pj.right; pj.left="" pj.right="" void main()int i,j; cout<<".編譯原理實(shí)驗(yàn)三:正規(guī)文法到正規(guī)式的轉(zhuǎn)換."<<endl; cout<<"請(qǐng)輸入正規(guī)文法(三型文法)的產(chǎn)生式總數(shù)及各產(chǎn)生式:"<<endl<<"其中左右部之間用'-'表示,空用'#'表示"<<endl; cin>>n; Chomsky *p=new Chomskymax; for(i=0;i<n;i+)cin>>strings; apart(p,i); VNVT(p);if(three(p)/只有當(dāng)輸入為正規(guī)文法時(shí)才進(jìn)行
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 燒燙傷急救知識(shí)
- 行業(yè)分析的關(guān)鍵指標(biāo)試題及答案
- 金融分析師考試數(shù)據(jù)分析方法與試題及答案
- 2024年CFA考試技巧及試題與答案
- 短時(shí)間掌握的2024年CFA試題及答案
- 城市建筑線描課件
- 山東省威海市2024-2025學(xué)年高三上學(xué)期期末考試歷史試題
- 2024年CFA考試設(shè)計(jì)的適應(yīng)性試題及答案
- 江西省豐城市第九中學(xué)2024-2025學(xué)年高三上學(xué)期期末考試(復(fù)讀班)歷史試題(含解析)
- 答疑解惑的2024年CFA考試試題及答案
- 急性肺栓塞應(yīng)急預(yù)案
- 快手申訴文本
- β內(nèi)酰胺類抗菌藥物皮膚試驗(yàn)指導(dǎo)原則(2021年版)解讀
- 簡(jiǎn)單版廣州市勞動(dòng)合同
- 急診室 縮短急性腦卒中患者溶栓時(shí)間PDCA匯報(bào)
- 《短詩(shī)三首》繁星(七一)【教案】部編版語(yǔ)文四年級(jí)下冊(cè)
- 第五版-FMEA-新版FMEA【第五版】
- 火龍罐綜合灸技術(shù)課件
- 宋代藥業(yè)研究
- 守株待兔兒童故事繪本PPT
- 全國(guó)自考馬克思主義基本原理概論習(xí)題庫(kù)(附答案 整理版 打印版)
評(píng)論
0/150
提交評(píng)論