版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、.目錄一語法分析方法11.判斷為算符優(yōu)先文法 :12.求 FirstVT 集和 LastVT 集13.根據(jù) FirstVT 和 LastVT 集構(gòu)造算符優(yōu)先表1二程序設(shè)計(jì)21.總體設(shè)計(jì)22.子程序設(shè)計(jì)2三程序中的結(jié)構(gòu)說明31.重要函數(shù)介紹32.函數(shù)代碼3專業(yè) .專注.四程序測試24五、 實(shí)驗(yàn)總結(jié)27專業(yè) .專注.一語法分析方法GS0 S #S#1 SV2 VT|ViT3 TF|T+F4 F)V*|(+(i(1.A-> BC BC OGA-> abA-> .aBb .A-> aBB >b . B >Cb .A-> Bb . B > a B >
2、 aC2.FirstVTLastVT0S #S#表 1-1非終結(jié)符的 FIRSTVT 和 LASTVT 集合表FIRSTVTLASTVTS#Si, +,),(i,+,*,(Vi,+, ),(i,+,*,(T+,),(+,(,*F),(*,(3.FirstVTLastVT專業(yè) .專注.表 1-2 GS 的算符優(yōu)先關(guān)系矩陣表#i+*()#i+*()二程序設(shè)計(jì)1.總體設(shè)計(jì)讀入文法規(guī)則創(chuàng)建文法關(guān)系表模塊求 FIRSTVT 模塊求 LASTVT模塊識(shí)別終結(jié)符模塊求下標(biāo)模塊讀取語法分析串輸入串分析模塊圖 2-1總體設(shè)計(jì)圖2.子程序設(shè)計(jì)求 FIRSTVT 模塊創(chuàng)建文法關(guān)系表模塊求 LASTVT 模塊識(shí)別終結(jié)
3、符模塊.F專業(yè) .專注T.圖 2-2子程序設(shè)計(jì)創(chuàng)建文法關(guān)系模塊圖三程序中的結(jié)構(gòu)說明1.重要函數(shù)介紹int deal();/ 對(duì)輸入串的分析函數(shù)int zhongjie(char c);/ 判斷字符 c 是否是終結(jié)符函數(shù)int xiabiao(char c);/ 求字符 c 在算符優(yōu)先關(guān)系表中的下標(biāo)void out(int j,int k,char *s);/ 打印 s 棧void firstvt(char c);/ 求非終結(jié)符 c 的 FIRSTVT集void lastvt(char c);/ 求非終結(jié)符 c 的 LASTVT 集void table();/ 創(chuàng)建文法優(yōu)先關(guān)系表void prt
4、fun(char biao1010);/ 打印 firstvt 或者 lastvt 集2.函數(shù)代碼#include "stdio.h"#include "stdlib.h"專業(yè) .專注.char data2020;/ 算符優(yōu)先關(guān)系char s100;/ 模擬符號(hào)棧 schar lable20;/ 文法終結(jié)符集char input100;/ 文法輸入符號(hào)串char string2010;/ 用于輸入串的分析int k;char a;int j;char q;int r;/ 文法規(guī)則個(gè)數(shù)int r1;/ 轉(zhuǎn)化后文法規(guī)則個(gè)數(shù)char st1030;/ 用來存儲(chǔ)
5、文法規(guī)則char first1010;/ / 文法非終結(jié)符 FIRSTVT集char last1010;/ 文法非終結(jié)符 LASTVT 集int fflag10=0;/ 標(biāo)志第 i 個(gè)非終結(jié)符的 FIRSTVT集是否已求出int lflag10=0;/ 標(biāo)志第 i 個(gè)非終結(jié)符的 LASTVT 集是否已求出int deal();/ 對(duì)輸入串的分析int zhongjie(char c);/ 判斷字符 c 是否是終結(jié)符int xiabiao(char c);/ 求字符 c 在算符優(yōu)先關(guān)系表中的下標(biāo)void out(int j,int k,char *s);/ 打印 s 棧專業(yè) .專注.void f
6、irstvt(char c);/ 求非終結(jié)符 c 的 FIRSTVT集void lastvt(char c);/ 求非終結(jié)符 c 的 LASTVT 集void table();/ 創(chuàng)建文法優(yōu)先關(guān)系表void prtfun(char biao1010);/ 打印 firstvt 或者 lastvt 集int main()int i,j,k=0;printf(" 請(qǐng)輸入文法規(guī)則數(shù) :");scanf("%d",&r);printf(" 請(qǐng)輸入文法規(guī)則 :n");for(i=0;i<r;i+)scanf("%s&qu
7、ot;,sti);/ 存儲(chǔ)文法規(guī)則 ,初始化 FIRSTVT集和 LASTVT 集firsti0=0;/firsti0和 lasti0 分別表示 sti0 非終結(jié)符的 FIRSTVT集和 LASTVT 集中元素的個(gè)數(shù) */lasti0=0;for(i=0;i<r;i+)/ 判斷文法是否合法for(j=0;stij!='0'j+)if(sti0<'A'|sti0>'Z')/ 判斷首字母若不是非終結(jié)符專業(yè) .專注.printf(" 不是算符文法 !n");exit(-1);if(stij>='A
8、39;&&stij<='Z')/ 判斷兩個(gè)非終結(jié)符相連if(stij+1>='A'&&stij+1<='Z')printf(" 不是算符文法 !n"); exit(-1);for(i=0;i<r;i+)for(j=0;stij!='0'j+)if(stij<'A'|stij>'Z')&&stij!='-'&&stij!='>'&&
9、;stij!='|')lablek+=stij;lablek='#'lablek+1='0'專業(yè) .專注.table();printf(" 每個(gè)非終結(jié)符的 FIRSTVT集為: n"); / 輸出每個(gè)非終結(jié)符的FIRSTVT集prtfun(first);printf(" 每個(gè)非終結(jié)符的LASTVT 集為: n"); / 輸出每個(gè)非終結(jié)符的LASTVT 集prtfun(last);printf(" 算符優(yōu)先分析表如下 :n");for(i=0;lablei!='0'i+)p
10、rintf("t%c",lablei);/ 打印優(yōu)先關(guān)系矩陣第一行printf("n");for(i=0;i<k+1;i+)printf("%ct",lablei);/ 打印優(yōu)先關(guān)系矩陣第一列元素for(j=0;j<k+1;j+)printf("%ct",dataij);/ 打印每一列的優(yōu)先關(guān)系printf("n");printf(" 請(qǐng)輸入文法輸入符號(hào)串以# 結(jié)束 :");專業(yè) .專注.scanf("%s",input);/ 接受輸入分析串d
11、eal();void prtfun(char biao1010)/ 打印 firstvt 或者 lastvt 集int i,j;for(i=0;i<r;i+)printf("%c: ",sti0);/ 輸入對(duì)應(yīng)非終結(jié)符for(j=0;j<biaoi0;j+)printf("%c ",biaoij+1);printf("n");void table()/ 創(chuàng)建文法優(yōu)先關(guān)系表char text2010;專業(yè) .專注.int i,j,k,t,l,x=0,y=0;int m,n;x=0;for(i=0;i<r;i+)firs
12、tvt(sti0);/ 求對(duì)應(yīng)非終結(jié)符的FIRSTVT集lastvt(sti0);/ 求對(duì)應(yīng)非終結(jié)符的LASTVT 集for(i=0;i<r;i+)/ 過濾文法規(guī)則中的 “|” textxy=sti0;y+;for(j=1;stij!='0'j+)if(stij='|')textxy='0'/ 將 “|”前部分作為一條規(guī)則x+;y=0;textxy=sti0;/ 將“|”后部分作為另一條規(guī)則y+;textxy+='-'textxy+='>'專業(yè) .專注.elsetextxy=stij;y+;textxy
13、='0'x+;y=0;r1=x;printf(" 轉(zhuǎn)化后的文法為 :n");for(i=0;i<x;i+)/ 輸出轉(zhuǎn)化后的文法 規(guī)則串printf("%sn",texti);for(i=0;i<x;i+)/* 求每個(gè)終結(jié)符的推導(dǎo)結(jié)果(去掉 "->" 后的轉(zhuǎn)化文法 ,用于最后的規(guī)約 )*/ stringi0=texti0; for(j=3,l=1;textij!='0'j+,l+)stringil=textij;專業(yè) .專注.stringil='0'for(i=0;i&l
14、t;x;i+)for(j=1;textij+1!='0'j+)if(zhongjie(textij)&&zhongjie(textij+1)/ 求 “= ”關(guān)系m=xiabiao(textij);n=xiabiao(textij+1);/ 求終結(jié)符在優(yōu)先關(guān)系表中的下標(biāo)datamn='='if(textij+2!='0'&&zhongjie(textij)&&zhongjie(textij+2)&&!zhongjie(textij+1)/ 求“= ”關(guān)系m=xiabiao(textij
15、);n=xiabiao(textij+2);datamn='='if(zhongjie(textij)&&!zhongjie(textij+1)專業(yè) .專注.for(k=0;k<r;k+)if(stk0=textij+1)break;m=xiabiao(textij);for(t=0;t<firstk0;t+)/ 求 “< ”關(guān)系n=xiabiao(firstkt+1);datamn='<'if(!zhongjie(textij)&&zhongjie(textij+1) / 求“> ”關(guān)系for(k=
16、0;k<r;k+)if(stk0=textij)break;n=xiabiao(textij+1);for(t=0;t<lastk0;t+)專業(yè) .專注.m=xiabiao(lastkt+1);datamn='>'m=xiabiao('#');for(t=0;t<first00;t+)n=xiabiao(first0t+1);datamn='<'n=xiabiao('#');for(t=0;t<last00;t+)m=xiabiao(last0t+1);datamn='>'
17、datann='='專業(yè) .專注.void firstvt(char c)/ 求 FIRSTVT集int i,j,k,m,n;for(i=0;i<r;i+)if(sti0=c)break;if(fflagi=0)n=firsti0+1;m=0;do if(m=2|stim='|')if(zhongjie(stim+1)firstin=stim+1;n+;else if(zhongjie(stim+2) firstin=stim+2;n+;專業(yè) .專注.if(stim+1!=c)firstvt(stim+1);for(j=0;j<r;j+) if(st
18、j0=stim+1) break;for(k=0;k<firstj0;k+)int t;for(t=0;t<n;t+)if(firstit=firstjk+1)break;if(t=n)firstin=firstjk+1;n+;專業(yè) .專注.m+;while(stim!='0');firstin='0'firsti0=-n;fflagi=1;void lastvt(char c)/ 求 LASTVT 集int i,j,k,m,n;for(i=0;i<r;i+)if(sti0=c)break;if(lflagi=0)n=lasti0+1;m=0;
19、專業(yè) .專注.doif(stim+1='0'|stim+1='|')if(zhongjie(stim)lastin=stim;n+;elseif(zhongjie(stim-1)lastin=stim-1;n+;if(stim!=c)lastvt(stim);for(j=0;j<r;j+)if(stj0=stim)專業(yè) .專注.break;for(k=0;k<lastj0;k+)int t;for(t=0;t<n;t+)if(lastit=lastjk+1)break;if(t=n)lastin=lastjk+1;n+;m+;while(sti
20、m!='0');lastin='0'專業(yè) .專注.lasti0=-n;lflagi=1;int deal()/ 對(duì)輸入串的分析int i,j;int x,y;int z;/ 輸入串的長度k=1;sk='#'/ 棧置初值for(i=0;inputi!='0'i+);/ 計(jì)算輸入串的長度z=i-;i=0;while(a=inputi)!='0')if(zhongjie(sk)j=k;elsej=k-1;x=xiabiao(sj);y=xiabiao(a);專業(yè) .專注.if(dataxy='>')
21、out(1,k,s);printf("%c",a);out(i+1,z,input);printf(" 歸約 n");doq=sj;if(zhongjie(sj-1)j=j-1;else j=j-2;x=xiabiao(sj);y=xiabiao(q);while(dataxy!='<');int m,n,N;for(m=j+1;m<=k;m+)for(N=0;N<r1;N+)for(n=1;stringNn!='0'n+)if(!zhongjie(sm)&&!zhongjie(strin
22、gNn)專業(yè) .專注.if(zhongjie(sm+1)&&zhongjie(stringNn+1)&&sm+1=stringNn+1)sj+1=stringN0;break;elseif(zhongjie(sm)if(sm=stringNn)sj+1=stringN0;break;k=j+1;if(k=2&&a='#')out(1,k,s);printf("%c",a);專業(yè) .專注.out(i+1,z,input);printf(" 結(jié)束 n");printf(" 輸入串符合文法的定義 !n");return 1;/ 輸入串符合文法的定義elseif(dataxy='<'|dataxy='=')/ 移進(jìn)out(1,k,s);printf("%c",a);o
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度光伏發(fā)電站投資建設(shè)與運(yùn)營承包合同樣本3篇
- 2025年高校學(xué)生宿舍托管租賃服務(wù)合同范本3篇
- 二零二五年籃球運(yùn)動(dòng)場地照明節(jié)能改造合同2篇
- 四川省自貢市2024-2025學(xué)年八年級(jí)上學(xué)期期末考試道德與法治試題(含答案)
- 2025版圍擋安裝勞務(wù)分包合同范本(含氣候影響調(diào)整)2篇
- 《漿細(xì)胞白血病》課件
- 外幣存款利率的市場預(yù)測考核試卷
- 城市公共交通系統(tǒng)的創(chuàng)新與改進(jìn)考核試卷
- 《明代的政治與制度》課件
- 二零二五年度木雕工藝品出口退稅與稅收籌劃合同4篇
- 山東鐵投集團(tuán)招聘筆試沖刺題2025
- 真需求-打開商業(yè)世界的萬能鑰匙
- 2025年天津市政集團(tuán)公司招聘筆試參考題庫含答案解析
- GB/T 44953-2024雷電災(zāi)害調(diào)查技術(shù)規(guī)范
- 2024-2025學(xué)年度第一學(xué)期三年級(jí)語文寒假作業(yè)第三天
- 2024年列車員技能競賽理論考試題庫500題(含答案)
- 心律失常介入治療
- 6S精益實(shí)戰(zhàn)手冊(cè)
- 展會(huì)場館保潔管理服務(wù)方案
- 監(jiān)理從業(yè)水平培訓(xùn)課件
- 廣東省惠州市實(shí)驗(yàn)中學(xué)2025屆物理高二第一學(xué)期期末綜合測試試題含解析
評(píng)論
0/150
提交評(píng)論