




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、實驗三:正規(guī)文法到正規(guī)式的轉(zhuǎn)換一:要求輸入任意的正規(guī)文法,輸出相應(yīng)的正規(guī)式二:實驗?zāi)康?. 熟練掌握正規(guī)文法到正規(guī)式的轉(zhuǎn)換規(guī)則2. 理解正規(guī)文法和正規(guī)式的等價性三:實驗原理1.一個正規(guī)語言可以由正規(guī)文法定義,也可以由正規(guī)式定義,對任意一個正規(guī)文法,存在一個定義同一個語言的正規(guī)式,反之,對每個正規(guī)式,存在生成同一個語言的正規(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) /分開產(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ù)五:出錯分析1: #include<iostream>忽視了c+語言中的頭文件應(yīng)當(dāng)去掉.h,須再另加上using namespace std;2:規(guī)則分解不對,導(dǎo)致結(jié)果出錯。3:太多循環(huán)嵌套容易造成程序出
3、錯,養(yǎng)成把括號提前打好的習(xí)慣。六:實驗結(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é)符存儲int n;/產(chǎn)生式總數(shù)struct Chomskystring left;string right; ; void apart(Chomsky *p,int 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; /左部沒有非終結(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() /右部長度是否小于左部flag+;break;elseflag-;if(flag>0)cout<<endl<<"此文法屬于0型文法,即短語文法。"<<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') /左部不屬于一個字符或不屬于非終結(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') /右部字符個數(shù)不是1或2,或首字符是非終結(jié)符 flag+; break; else if(pi.right.l
10、ength()=2)&&!(pi.right1>='A'&&pi.right1<='Z') /第二個字符不是非終結(jié)符 flag+; break; else flag-;if(flag>0) cout<<"此文法屬于2型文法,即上下文無關(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)成時停止轉(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<<".編譯原理實驗三:正規(guī)文法到正規(guī)式的轉(zhuǎn)換."<<endl; cout<<"請輸入正規(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ī)文法時才進(jìn)行
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【課件】有理數(shù)的乘方(教學(xué)課件)-2024-2025學(xué)年華東師大版(2024)數(shù)學(xué)七年級上冊
- 《并購策略與實施》課件
- (新版)煤礦機(jī)電班組長職業(yè)技能理論考試題庫500題(含答案)
- 服裝流程管理與協(xié)調(diào)試題及答案
- 紡織品檢測案例實操分享試題及答案
- 廣告設(shè)計師個性發(fā)展試題及答案
- 廣告設(shè)計師創(chuàng)意激發(fā)技巧試題及答案
- 2024廣告設(shè)計師行業(yè)標(biāo)準(zhǔn)試題及答案
- 助理廣告師知識重要性分析試題及答案
- 三年語文試題及答案
- 單管塔施工方案
- 數(shù)字電子電路技術(shù)1
- 混凝土質(zhì)量管理體系
- 《西廂記》英文劇本
- EndNote使用教程介紹課件
- 中國老年高血壓管理指南2023解讀
- 《數(shù)字編碼》PPT說課課件(人教版)
- NT檢查規(guī)范-課件
- 工程倫理-核工程的倫理問題
- 中國慢性腎臟病營養(yǎng)治療臨床實踐指南(2021版)
- 新產(chǎn)品開發(fā)打樣流程
評論
0/150
提交評論