版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課程名稱 編譯原理 </p><p> 設(shè)計(jì)題目 遞歸下降語(yǔ)法分析 </p><p><b> 設(shè)計(jì)目的</b></p><p> 通過(guò)設(shè)計(jì)、編制、調(diào)試一個(gè)具體的語(yǔ)法分析程序,加深對(duì)語(yǔ)法分析原理的理解,加深對(duì)語(yǔ)法及語(yǔ)義分析原理的理解,并實(shí)現(xiàn)對(duì)文法的判斷,是算符優(yōu)先文法的對(duì)
2、其進(jìn)行FirstVT集及LastVT集的分析,并對(duì)輸入的字符串進(jìn)行規(guī)約輸出規(guī)約結(jié)果成功或失敗。</p><p><b> 設(shè)計(jì)內(nèi)容及步驟</b></p><p> 內(nèi)容:在C++ 6.0中編寫(xiě)程序代碼實(shí)現(xiàn)語(yǔ)法分析功能,調(diào)試得到相應(yīng)文法的判斷結(jié)果:是算符優(yōu)先或不是。若是,則輸出各非終結(jié)符的FirstVT與LastVT集的結(jié)果,還可進(jìn)行字符串的規(guī)約,輸出詳細(xì)的規(guī)約步驟
3、,程序自動(dòng)判別規(guī)約成功與失敗。</p><p> 步驟:1.看書(shū),找資料,了解語(yǔ)法分析器的工作過(guò)程與原理</p><p> 2.分析題目,列出基本的設(shè)計(jì)思路</p><p> 定義棧,進(jìn)棧,出棧函數(shù)</p><p><b> 棧為空時(shí)的處理</b></p><p> 構(gòu)造函數(shù)判斷文法是否
4、是算符文法,算符優(yōu)先文法</p><p> 構(gòu)造FirstVT和LastVT函數(shù)對(duì)文法的非終結(jié)符進(jìn)行分析</p><p> 是算符優(yōu)先文法時(shí),構(gòu)造函數(shù)對(duì)其可以進(jìn)行輸入待規(guī)約串,輸出規(guī)約結(jié)果</p><p> 構(gòu)造主函數(shù),對(duì)過(guò)程進(jìn)行分析</p><p> 3.上機(jī)實(shí)踐編碼,將設(shè)計(jì)的思路轉(zhuǎn)換成C++語(yǔ)言編碼,編譯運(yùn)行</p>
5、<p> 4.測(cè)試,輸入不同的文法,觀察運(yùn)行結(jié)果</p><p><b> 詳細(xì)的算法描述</b></p><p> 詳細(xì)設(shè)計(jì)偽代碼如下:</p><p> 首先要聲明變量,然后定義各個(gè)函數(shù)</p><p> 1.void Initstack(charstack &s)</p>
6、<p><b> {//定義棧</b></p><p> s.base=new charLode[20];</p><p> s.top=-1; }</p><p> 2. void push(charstack &s,charLode w)</p><p><b> {//字符進(jìn)
7、棧</b></p><p><b> s.top++;</b></p><p> s.base[s.top].E=w.E;</p><p> s.base[s.top].e=w.e;</p><p><b> }</b></p><p> 3. void
8、 pop(charstack &s,charLode &w)</p><p><b> {//字符出棧</b></p><p> w.E=s.base[s.top].E;</p><p> w.e=s.base[s.top].e;</p><p><b> s.top--;</b&
9、gt;</p><p><b> }</b></p><p> 4. int IsEmpty(charstack s)</p><p> {//判斷棧是否為空</p><p> if(s.top==-1)</p><p><b> return 1;</b><
10、/p><p> else return 0;</p><p><b> }</b></p><p> 5.int IsLetter(char ch)</p><p> {//判斷是否為非終結(jié)符</p><p> if(ch>='A'&&ch<=
11、39;Z')</p><p><b> return 1;</b></p><p> else return 0;</p><p><b> }</b></p><p> 6.int judge1(int n)</p><p> { //judge1是判斷是
12、否是算符文法:若產(chǎn)生式中含有兩個(gè)相繼的非終結(jié)符則不是算符文法</p><p><b> }</b></p><p> 7. void judge2(int n)</p><p> {//judge2是判斷文法G是否為算符優(yōu)先文法:若不是算符文法或若文法中含空字或終結(jié)符的優(yōu)先級(jí)不唯一則不是算符優(yōu)先文法</p><p>
13、; 8.int search1(char r[],int kk,char a)</p><p> { //search1是查看存放終結(jié)符的數(shù)組r中是否含有重復(fù)的終結(jié)符}</p><p> 9.void createF(int n)</p><p> { //createF函數(shù)是用F數(shù)組存放每個(gè)終結(jié)符與非終結(jié)符和組合,并且值每隊(duì)的標(biāo)志位為0;F數(shù)組是一個(gè)結(jié)構(gòu)體
14、}</p><p> 10.void search(charLode w)</p><p> { //search函數(shù)是將在F數(shù)組中尋找到的終結(jié)符與非終結(jié)符對(duì)的標(biāo)志位值為1 }</p><p> 分情況討論://產(chǎn)生式的后選式的第一個(gè)字符就是終結(jié)符的情況</p><p> //產(chǎn)生式的后選式的第一個(gè)字符是非終結(jié)符的情況</p&g
15、t;<p> 11.void LastVT(int n) </p><p> {//求LastVT</p><p><b> }</b></p><p> 12.void FirstVT(int n) </p><p> {//求FirstVT</p><p><b&
16、gt; }</b></p><p> 13.void createYXB(int n)</p><p><b> {//構(gòu)造優(yōu)先表</b></p><p> 分情況討論://優(yōu)先級(jí)等于的情況,用1值表示等于}</p><p> //優(yōu)先級(jí)小于的情況,用2值表示小于</p><p&
17、gt; //優(yōu)先級(jí)大于的情況,用3值表示大于</p><p><b> }</b></p><p> 14.int judge3(char s,char a)</p><p> {//judge3是用來(lái)返回在歸約過(guò)程中兩個(gè)非終結(jié)符相比較的值</p><p><b> }</b></p
18、><p> 15.void print(char s[],char STR[][20],int q,int u,int ii,int k)</p><p> {//打印歸約的過(guò)程}</p><p> 16. void process(char STR[][20],int ii)</p><p> {//對(duì)輸入的字符串進(jìn)行歸約的過(guò)程<
19、/p><p><b> }</b></p><p><b> 設(shè)計(jì)結(jié)果</b></p><p> 分兩大類(lèi),四種不同的情況</p><p> 第一類(lèi)情況:產(chǎn)生式的候選式以終結(jié)符開(kāi)始候選式以終結(jié)符開(kāi)始經(jīng)過(guò)存在遞歸式的非終結(jié)符后再以終結(jié)符結(jié)束</p><p> 第二類(lèi)情況:
20、產(chǎn)生式的候選式是兩個(gè)或以上的非終結(jié)符</p><p><b> 五、設(shè)計(jì)總結(jié)與心得</b></p><p> 通過(guò)對(duì)語(yǔ)法分析的實(shí)踐操作,對(duì)它在實(shí)踐中的應(yīng)用有了更深刻的理解,通過(guò)上機(jī)實(shí)踐,提高了從錯(cuò)誤中分析問(wèn)題,解決問(wèn)題的能力。在實(shí)踐的基礎(chǔ)上,把所學(xué)的知識(shí)得到了實(shí)際應(yīng)用,通過(guò)本次的編譯原理課程設(shè)計(jì),讓我對(duì)用C++編程的大致思路又進(jìn)行了一次回顧,設(shè)計(jì)一個(gè)可運(yùn)行的程序代
21、碼的思路規(guī)范,聲明變量,定義各大需要調(diào)用的函數(shù)及其調(diào)用。</p><p> 在這個(gè)實(shí)驗(yàn)的過(guò)程中,如何運(yùn)用棧,指針來(lái)達(dá)到判斷是否是算符優(yōu)先文法的規(guī)約的目的,當(dāng)然其中也設(shè)計(jì)了多個(gè)供調(diào)用的函數(shù),聲明了多個(gè)變量,鍛煉了思維邏輯能力,同時(shí)在和同學(xué)的探討下鍛煉了我的發(fā)現(xiàn)問(wèn)題分析問(wèn)題的能力。</p><p><b> 六、程序完整代碼</b></p><p&
22、gt; #include<iostream.h></p><p> #include<string.h></p><p> #include<stdio.h></p><p> typedef struct</p><p><b> {</b></p><
23、p><b> char R;</b></p><p><b> char r;</b></p><p><b> int flag;</b></p><p><b> }array;</b></p><p> typedef struct
24、</p><p><b> {</b></p><p><b> char E;</b></p><p><b> char e;</b></p><p> }charLode;</p><p> typedef struct</p>
25、;<p><b> {</b></p><p> charLode *base;</p><p><b> int top;</b></p><p> }charstack;</p><p> char str[80][80],arr[80][80],brr[80][80];
26、</p><p> array F[20];</p><p> int m,kk,p,ppp,FF=1;</p><p> char r[10];</p><p> int crr[20][20],FLAG=0;</p><p> char ccrr1[1][20],ccrr2[20][1];</p&g
27、t;<p> void Initstack(charstack &s){</p><p> s.base=new charLode[20];</p><p><b> s.top=-1;</b></p><p><b> }</b></p><p> void pus
28、h(charstack &s,charLode w)</p><p><b> {</b></p><p><b> s.top++;</b></p><p> s.base[s.top].E=w.E;</p><p> s.base[s.top].e=w.e;</p>
29、<p><b> }</b></p><p> void pop(charstack &s,charLode &w)</p><p><b> {</b></p><p> w.E=s.base[s.top].E;</p><p> w.e=s.base[s.t
30、op].e;</p><p><b> s.top--;</b></p><p><b> }</b></p><p> int IsEmpty(charstack s)</p><p><b> {</b></p><p> if(s.top
31、==-1)</p><p><b> return 1;</b></p><p> else return 0;</p><p><b> }</b></p><p> int IsLetter(char ch)</p><p><b> {</b&
32、gt;</p><p> if(ch>='A'&&ch<='Z')</p><p><b> return 1;</b></p><p> else return 0;</p><p><b> }</b></p>&
33、lt;p> int judge1(int n)</p><p><b> {</b></p><p> int j=3,flag=0;</p><p> for(int i=0;i<=n;i++)</p><p> while(str[i][j]!='\0')</p>
34、<p><b> {</b></p><p> char a=str[i][j];</p><p> char b=str[i][j+1];</p><p> if(IsLetter(a)&&IsLetter(b))</p><p> {flag=1;break;}</p>
35、<p><b> else j++;</b></p><p><b> }</b></p><p> if(flag==1)</p><p><b> return 0;</b></p><p><b> else</b></
36、p><p><b> return 1;</b></p><p><b> }</b></p><p> void judge2(int n)</p><p><b> {</b></p><p> for(int i=0;i<=n;i++)
37、</p><p> if(str[i][3]=='~'||judge1(n)==0||FLAG==1)//'~'代表空字</p><p> {cout<<"文法G不是算符優(yōu)先文法!"<<endl;FF=0;break;}</p><p><b> if(i>n)<
38、/b></p><p> cout<<"文法G是算符優(yōu)先文法!"<<endl;</p><p><b> }</b></p><p> int search1(char r[],int kk,char a)</p><p><b> {</b>
39、;</p><p> for(int i=0;i<kk;i++)</p><p> if(r[i]==a)</p><p><b> break;</b></p><p> if(i==kk) return 0;</p><p> else return 1;</p>
40、<p><b> }</b></p><p> void createF(int n)</p><p><b> {</b></p><p> int k=0,i=1;char g;</p><p> char t[10];//t數(shù)組用來(lái)存放非終結(jié)符</p>&l
41、t;p> t[0]=str[0][0];</p><p> while(i<=n)</p><p><b> {</b></p><p> if(t[k]!=str[i][0])</p><p> {k++;t[k]=str[i][0];g=t[k];i++;}</p><p&g
42、t;<b> else i++;</b></p><p><b> }</b></p><p><b> kk=0;</b></p><p><b> char c;</b></p><p> for(i=0;i<=n;i++)</p
43、><p> { int j=3;</p><p> while(str[i][j]!='\0')</p><p><b> {</b></p><p> c=str[i][j];</p><p> if(IsLetter(c)==0)</p><p>
44、<b> {</b></p><p> if(!search1(r,kk,c))</p><p> r[kk]=c;kk++;//r數(shù)組用來(lái)存放終結(jié)符</p><p><b> }</b></p><p><b> j++;</b></p><p&
45、gt;<b> }</b></p><p><b> }</b></p><p><b> m=0;</b></p><p> for(i=0;i<k;i++)</p><p> for(int j=0;j<kk-1;j++)</p><
46、;p><b> {</b></p><p> F[m].R=t[i];</p><p> F[m].r=r[j];</p><p> F[m].flag=0;</p><p><b> m++;</b></p><p><b> }</b&g
47、t;</p><p><b> }</b></p><p> void search(charLode w)</p><p><b> {</b></p><p> for(int i=0;i<m;i++)</p><p> if(F[i].R==w.E&am
48、p;&F[i].r==w.e)</p><p> {F[i].flag=1;break;}</p><p><b> }</b></p><p> void FirstVT(int n) {</p><p> charstack sta;</p><p> charLode w;
49、</p><p><b> int i=0;</b></p><p> Initstack(sta);</p><p> while(i<=n)</p><p><b> {</b></p><p><b> int k=3;</b>&l
50、t;/p><p> w.E=str[i][0];</p><p> char a=str[i][k];</p><p> char b=str[i][k+1];</p><p> if(!IsLetter(a)) {</p><p><b> w.e=a;</b></p>
51、<p> push(sta,w);</p><p> search(w);</p><p><b> i++;</b></p><p><b> }</b></p><p> else if(IsLetter(a)&&b!='\0'&&am
52、p;!IsLetter(b)) {</p><p><b> w.e=b;</b></p><p> push(sta,w);</p><p> search(w);</p><p><b> i++;</b></p><p><b> }</b
53、></p><p><b> else i++;</b></p><p><b> }</b></p><p> charLode ww;</p><p> while(!IsEmpty(sta))</p><p><b> {</b>&
54、lt;/p><p> pop(sta,ww);</p><p> for(i=0;i<=n;i++)</p><p><b> {</b></p><p> w.E=str[i][0];</p><p> if(str[i][3]==ww.E&&str[i][4]==&
55、#39;\0')</p><p><b> {</b></p><p><b> w.e=ww.e;</b></p><p> push(sta,w);</p><p> search(w);</p><p><b> break;</b&g
56、t;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> p=0;int k=1;i=1;</p><p> while(i<m)</p>&l
57、t;p><b> {</b></p><p> if(F[i-1].flag==1)</p><p><b> {</b></p><p> arr[p][0]=F[i-1].R;</p><p> arr[p][k]=F[i-1].r;</p><p>&l
58、t;b> }</b></p><p> while(F[i].flag==0&&i<m)</p><p><b> i++;</b></p><p> if(F[i].flag==1)</p><p><b> {</b></p>&l
59、t;p> if(F[i].R==arr[p][0])</p><p><b> k++;</b></p><p> else {arr[p][k+1]='\0';p++;k=1;}</p><p><b> i++;</b></p><p><b> }&l
60、t;/b></p><p><b> } </b></p><p><b> }</b></p><p> void LastVT(int n){</p><p> charstack sta;</p><p> charLode w;</p>
61、<p> for(int i=0;i<m;i++)</p><p> F[i].flag=0;</p><p><b> i=0;</b></p><p> Initstack(sta);</p><p> while(i<=n)</p><p><b&g
62、t; {</b></p><p> int k=strlen(str[i]);</p><p> w.E=str[i][0];</p><p> char a=str[i][k-1];</p><p> char b=str[i][k-2];</p><p> if(!IsLetter(a))&
63、lt;/p><p><b> {</b></p><p><b> w.e=a;</b></p><p> push(sta,w);</p><p> search(w);</p><p><b> i++;</b></p><
64、p><b> }</b></p><p> else if(IsLetter(a)&&!IsLetter(b))</p><p><b> {</b></p><p><b> w.e=b;</b></p><p> push(sta,w);&l
65、t;/p><p> search(w);</p><p><b> i++;</b></p><p><b> }</b></p><p><b> else i++;</b></p><p><b> }</b></p
66、><p> charLode ee;</p><p> while(!IsEmpty(sta))</p><p><b> {</b></p><p> pop(sta,ee);</p><p> for(i=0;i<=n;i++)</p><p><b&
67、gt; {</b></p><p> w.E=str[i][0];</p><p> if(str[i][3]==ee.E&&str[i][4]=='\0')</p><p><b> {</b></p><p><b> w.e=ee.e;</b&g
68、t;</p><p> push(sta,w);</p><p> search(w);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
69、 int k=1;i=1;</p><p><b> ppp=0;</b></p><p> while(i<m)</p><p><b> {</b></p><p> if(F[i-1].flag==1)</p><p><b> {</
70、b></p><p> brr[ppp][0]=F[i-1].R;</p><p> brr[ppp][k]=F[i-1].r;</p><p><b> }</b></p><p> while(F[i].flag==0&&i<m)</p><p><b
71、> i++;</b></p><p> if(F[i].flag==1)</p><p><b> {</b></p><p> if(F[i].R==arr[ppp][0])</p><p><b> k++;</b></p><p> els
72、e {brr[ppp][k+1]='\0';ppp++;k=1;}</p><p><b> i++;</b></p><p><b> }</b></p><p><b> } </b></p><p><b> }</b>&
73、lt;/p><p> void createYXB(int n)</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(j=1;j<=kk;j++)</p><p> ccrr1[0][j]=r[j-1
74、];</p><p> for( i=1;i<=kk;i++)</p><p> ccrr2[i][0]=r[i-1];</p><p> for(i=1;i<=kk;i++)</p><p> for(j=1;j<=kk;j++)</p><p> crr[i][j]=0;</p&g
75、t;<p> int I=0,J=3;</p><p> while(I<=n)</p><p><b> {</b></p><p> if(str[I][J+1]=='\0')</p><p> {I++;J=3;}</p><p><b&g
76、t; else</b></p><p><b> {</b></p><p> while(str[I][J+1]!='\0')</p><p><b> {</b></p><p> char aa=str[I][J];</p><p>
77、; char bb=str[I][J+1];</p><p> if(!IsLetter(aa)&&!IsLetter(bb))</p><p><b> { </b></p><p> for(i=1;i<=kk;i++)</p><p><b> { </b>&
78、lt;/p><p> if(ccrr2[i][0]==aa)</p><p><b> break; </b></p><p><b> }</b></p><p> for(j=1;j<=kk;j++)</p><p><b> {</b>
79、</p><p> if(ccrr1[0][j]==bb)</p><p><b> break; </b></p><p><b> }</b></p><p> if(crr[i][j]==0)</p><p> crr[i][j]=1;</p>
80、<p> else {FLAG=1;I=n+1;}</p><p><b> J++;</b></p><p><b> }</b></p><p> if(!IsLetter(aa)&&IsLetter(bb)&&str[I][J+2]!='\0'&am
81、p;&!IsLetter(str[I][J+2])) { </p><p> for(i=1;i<=kk;i++)</p><p><b> { </b></p><p> if(ccrr2[i][0]==aa)</p><p><b> break;</b><
82、;/p><p><b> }</b></p><p> for(int j=1;j<=kk;j++)</p><p> { if(ccrr1[0][j]==str[I][J+2])</p><p><b> break;</b></p><p><b&
83、gt; }</b></p><p> if(crr[i][j]==0)</p><p> crr[i][j]=1;</p><p> else {FLAG=1;I=n+1;}</p><p><b> }</b></p><p> if(!IsLetter(aa)&
84、&IsLetter(bb)) { </p><p> for(i=1;i<=kk;i++)</p><p> { if(aa==ccrr2[i][0])</p><p><b> break;</b></p><p><b> }</b></p>
85、<p> for(j=0;j<=p;j++)</p><p> { if(bb==arr[j][0])</p><p><b> break;</b></p><p><b> }</b></p><p> for(int mm=1;arr[j][mm]!=
86、9;\0';mm++)</p><p><b> { </b></p><p> for(int pp=1;pp<=kk;pp++)</p><p><b> {</b></p><p> if(ccrr1[0][pp]==arr[j][mm])</p><
87、p><b> break;</b></p><p><b> }</b></p><p> if(crr[i][pp]==0)</p><p> crr[i][pp]=2;</p><p> else {FLAG=1;I=n+1;}</p><p><b
88、> }</b></p><p><b> J++;</b></p><p><b> }</b></p><p> if(IsLetter(aa)&&!IsLetter(bb))</p><p><b> { </b></p&g
89、t;<p> for(i=1;i<=kk;i++)</p><p><b> { </b></p><p> if(ccrr1[0][i]==bb)</p><p><b> break;</b></p><p><b> }</b></p&
90、gt;<p> for(j=0;j<=ppp;j++)</p><p><b> {</b></p><p> if(aa==brr[j][0])</p><p><b> break;</b></p><p><b> }</b></p&g
91、t;<p> for(int mm=1;brr[j][mm]!='\0';mm++)</p><p><b> { </b></p><p> for(int pp=1;pp<=kk;pp++)</p><p><b> {</b></p><p>
92、if(ccrr2[pp][0]==brr[j][mm])</p><p><b> break;</b></p><p><b> }</b></p><p> if(crr[pp][i]==0)</p><p> crr[pp][i]=3;</p><p> el
93、se {FLAG=1;I=n+1;}</p><p><b> }</b></p><p><b> J++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b&
94、gt; }</b></p><p><b> }</b></p><p><b> }</b></p><p> int judge3(char s,char a)</p><p><b> {</b></p><p> int
95、i=1,j=1;</p><p> while(ccrr2[i][0]!=s)</p><p><b> i++;</b></p><p><b> j++;</b></p><p> if(crr[i][j]==3) return 3;</p><p> whil
96、e(ccrr1[0][j]!=a)</p><p> else if(crr[i][j]==2) </p><p><b> return 2;</b></p><p> else if(crr[i][j]==1)</p><p><b> return 1;</b></p>
97、<p> else return 0;</p><p><b> }</b></p><p> void print(char s[],char STR[][20],int q,int u,int ii,int k) {</p><p> cout<<u<<" ";&l
98、t;/p><p> for(int i=0;i<=k;i++)</p><p> cout<<s[i];</p><p> cout<<" ";</p><p> for(i=q;i<=ii;i++)</p><p> cout<<
99、;STR[0][i];</p><p> cout<<" ";</p><p><b> }</b></p><p> void process(char STR[][20],int ii)//對(duì)輸入的字符串進(jìn)行歸約的過(guò)程</p><p><b> { &l
100、t;/b></p><p> cout<<"步驟"<<" "<<"符號(hào)棧"<<" "<<"輸入串"<<" "<<"動(dòng)作"<<endl;</p&
101、gt;<p> int k=0,q=0,u=0,b,i,j;</p><p> char s[40],a;</p><p><b> s[k]='#';</b></p><p> print(s,STR,q,u,ii,k);</p><p> cout<<"預(yù)
102、備"<<endl;</p><p><b> k++;u++;</b></p><p> s[k]=STR[0][q];</p><p><b> q++;</b></p><p> print(s,STR,q,u,ii,k);</p><p>
103、 cout<<"移進(jìn)"<<endl;</p><p> while(q<=ii)</p><p><b> {</b></p><p> a=STR[0][q];</p><p> if(!IsLetter(s[k])) j=k;</p><
104、p> else j=k-1;</p><p> b=judge3(s[j],a);</p><p> if(b==3)//大于的情況進(jìn)行歸約</p><p><b> {</b></p><p> while(IsLetter(s[j-1]))</p><p><b>
105、 j--;</b></p><p> for(i=j;i<=k;i++)</p><p> s[i]='\0';</p><p> k=j;s[k]='N';u++;</p><p> print(s,STR,q,u,ii,k);</p><p> cout&
106、lt;<"歸約"<<endl;</p><p><b> }</b></p><p> else if(b==2||b==1)//小于或等于的情況移進(jìn)</p><p><b> {</b></p><p><b> k++;</b>
107、</p><p><b> s[k]=a;</b></p><p><b> u++;</b></p><p><b> q++;</b></p><p> print(s,STR,q,u,ii,k);</p><p> if(s[0]==
108、39;#'&&s[1]=='N'&&s[2]=='#')</p><p> cout<<"接受"<<endl;</p><p> else cout<<"移進(jìn)"<<endl;</p><p><b&
109、gt; }</b></p><p><b> else </b></p><p> {cout<<"出錯(cuò)"<<endl;break;}</p><p><b> }</b></p><p> if(s[0]=='#'&
110、amp;&s[1]=='N'&&s[2]=='#')</p><p> cout<<"歸約成功"<<endl;</p><p> else cout<<"歸約失敗"<<endl;</p><p><b> }
111、</b></p><p> void main()</p><p><b> {</b></p><p> int n,i,j;</p><p> cout<<"請(qǐng)輸入你要定義的文法G的產(chǎn)生式的個(gè)數(shù)n:";</p><p><b>
112、cin>>n;</b></p><p> for(i=0;i<n;i++)</p><p><b> {</b></p><p> gets(str[i]);</p><p> j=strlen(str[i]);</p><p> str[i][j]=
113、9;\0';</p><p><b> }</b></p><p> str[i][0]='Q';</p><p> str[i][1]='-';</p><p> str[i][2]='>';</p><p> str[i]
114、[3]='#';</p><p> str[i][4]=str[0][0];</p><p> str[i][5]='#';</p><p> str[i][6]='\0';</p><p> cout<<"你定義的產(chǎn)生式如下:"<<endl;
115、</p><p> for(i=0;i<=n;i++)</p><p> cout<<str[i]<<endl;</p><p> if(judge1(n)==0)//判斷文法G是否為算符文法</p><p> cout<<"文法G不是算符文法!"<<endl;
116、</p><p> if(judge1(n)==1)</p><p><b> {</b></p><p> cout<<"文法G是算符文法!"<<endl;</p><p> createF(n);</p><p> FirstVT(n);&
117、lt;/p><p> LastVT(n);</p><p> createYXB(n);</p><p><b> }</b></p><p> judge2(n);//判斷文法G是否為算符優(yōu)先文法</p><p> if(FLAG==0)</p><p><b
118、> {</b></p><p> for(i=0;i<=p;i++)//打印FirstVT</p><p><b> {</b></p><p> cout<<"FirstVT("<<arr[i][0]<<")={";</p>
119、<p> for(int l=1;arr[i][l+1]!='\0';l++)</p><p> cout<<arr[i][l]<<",";</p><p> cout<<arr[i][l]<<"}"<<endl;</p><p>
120、<b> }</b></p><p> cout<<"FirstVT(Q)={#}"<<endl; </p><p> for(i=0;i<=ppp;i++)//打印LastVT</p><p><b> {</b></p><p> co
121、ut<<"LastVT("<<arr[i][0]<<")={";</p><p> for(int l=1;brr[i][l+1]!='\0';l++)</p><p> cout<<brr[i][l]<<",";</p><p&g
122、t; cout<<brr[i][l]<<"}"<<endl;</p><p><b> }</b></p><p> cout<<"LastVT(Q)={#}"<<endl;</p><p> cout<<"優(yōu)先表如
123、下:"<<endl;</p><p> for(i=1;i<kk;i++)//打印優(yōu)先關(guān)系表</p><p><b> {</b></p><p> cout<<" ";</p><p> cout<<ccrr1[0][i];</p
124、><p><b> }</b></p><p> cout<<endl;</p><p> for(i=1;i<kk;i++)</p><p><b> {</b></p><p> cout<<ccrr2[i][0]<<&qu
125、ot; ";</p><p> for(j=1;j<kk;j++)</p><p><b> {</b></p><p> if(crr[i][j]==0)</p><p> cout<<" ";</p><p> else if(crr[
126、i][j]==1)</p><p> cout<<"=";</p><p> else if(crr[i][j]==2)</p><p> cout<<"<";</p><p> else if(crr[i][j]==3)</p><p>
127、 cout<<">";</p><p> cout<<" ";</p><p><b> }</b></p><p> cout<<endl;</p><p><b> }</b></p>&
128、lt;p><b> }</b></p><p><b> if(FF==1)</b></p><p><b> {</b></p><p> char STR[1][20];</p><p> cout<<"請(qǐng)輸入要規(guī)約的字符串:"
129、;<<endl;</p><p> gets(STR[0]);</p><p> int ii=strlen(STR[0]);</p><p> STR[0][ii]='#';</p><p> cout<<"下面是規(guī)約的過(guò)程:"<<endl;</p>
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 語(yǔ)法分析程序遞歸下降法
- 實(shí)驗(yàn)遞歸下降語(yǔ)法分析程序設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--- 語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)---語(yǔ)法分析器
- 語(yǔ)法分析課程設(shè)計(jì)---編譯原理語(yǔ)法分析器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--語(yǔ)法分析器
- 編譯原理語(yǔ)法分析器課程設(shè)計(jì)
- 編譯原理遞歸下降子程序課程設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì)---ll(1)遞歸下降分析器
- 編譯原理詞法分析器語(yǔ)法分析課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)(c++)-語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)-詞法語(yǔ)法分析器
- 編譯原理課程設(shè)計(jì)--表達(dá)式語(yǔ)法分析器
- c-minus詞法分析和語(yǔ)法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)
- 遞歸下降分析法實(shí)現(xiàn)ll文法的語(yǔ)法分析器
- 編譯原理語(yǔ)法分析
- 編譯原理課程設(shè)計(jì)--c-編譯器詞法分析與語(yǔ)法分析的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--pascal語(yǔ)言詞法、語(yǔ)法分析器設(shè)計(jì)
- 編譯技術(shù)課程設(shè)計(jì)報(bào)告-詞法分析、語(yǔ)法分析、中間代碼生成
- 編譯原理課程設(shè)計(jì)--構(gòu)造lr(0)分析法語(yǔ)法分析器
評(píng)論
0/150
提交評(píng)論