版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、學(xué)號(hào) E10714103 專業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 姓名 萬(wàn)學(xué)進(jìn)實(shí)驗(yàn)日期2010-6-8 教師簽字 成績(jī)實(shí) 驗(yàn) 報(bào) 告【實(shí)驗(yàn)名稱】 SLR(1)語(yǔ)法分析【實(shí)驗(yàn)?zāi)康摹繕?gòu)造LR(1)分析程序,利用它進(jìn)行語(yǔ)法分析,判斷給出的符號(hào)串是否為該文法識(shí)別的句子,了解LR(K)分析方法是嚴(yán)格的從左向右掃描,和自底向上的語(yǔ)法分析方法?!緦?shí)驗(yàn)內(nèi)容】對(duì)下列文法,用LR(1)分析法對(duì)任意輸入的符號(hào)串進(jìn)行分析: (1)S->E(2)E->E+T(3)E->T(4)T->T*F(5)T->F(6)F->(E)(7)F->i【設(shè)計(jì)思想】(1)總控程序,也可以稱為驅(qū)動(dòng)程序。對(duì)所有的LR
2、分析器總控程序都是相同的。(2)分析表或分析函數(shù),不同的文法分析表將不同,同一個(gè)文法采用的LR分析器不同時(shí),分析表將不同,分析表又可以分為動(dòng)作表(ACTION)和狀態(tài)轉(zhuǎn)換(GOTO)表兩個(gè)部分,它們都可用二維數(shù)組表示。(3)分析棧,包括文法符號(hào)棧和相應(yīng)的狀態(tài)棧,它們均是先進(jìn)后出棧。分析器的動(dòng)作就是由棧頂狀態(tài)和當(dāng)前輸入符號(hào)所決定。u LR分析器由三個(gè)部分組成:u 其中:SP為棧指針,Si為狀態(tài)棧,Xi為文法符號(hào)棧。狀態(tài)轉(zhuǎn)換表用GOTOi,X=j表示,規(guī)定當(dāng)棧頂狀態(tài)為i,遇到當(dāng)前文法符號(hào)為X時(shí)應(yīng)轉(zhuǎn)向狀態(tài)j,X為終結(jié)符或非終結(jié)符。u ACTIONi,a規(guī)定了棧頂狀態(tài)為i時(shí)遇到輸入符號(hào)a應(yīng)執(zhí)行。動(dòng)作有
3、四種可能:(1)移進(jìn): actioni,a= Sj:狀態(tài)j移入到狀態(tài)棧,把a(bǔ)移入到文法符號(hào)棧,其中i,j表示狀態(tài)號(hào)。(2)歸約: actioni,a=rk:當(dāng)在棧頂形成句柄時(shí),則歸約為相應(yīng)的非終結(jié)符A,即文法中有A- B的產(chǎn)生式,若B的長(zhǎng)度為R(即|B|=R),則從狀態(tài)棧和文法符號(hào)棧中自頂向下去掉R個(gè)符號(hào),即棧指針SP減去R,并把A移入文法符號(hào)棧內(nèi),j=GOTOi,A移進(jìn)狀態(tài)棧,其中i為修改指針后的棧頂狀態(tài)。(3)接受acc: 當(dāng)歸約到文法符號(hào)棧中只剩文法的開(kāi)始符號(hào)S時(shí),并且輸入符號(hào)串已結(jié)束即當(dāng)前輸入符是'#',則為分析成功。(4)報(bào)錯(cuò):當(dāng)遇到狀態(tài)棧頂為某一狀態(tài)下出現(xiàn)不該遇到的
4、文法符號(hào)時(shí),則報(bào)錯(cuò),說(shuō)明輸入端不是該文法能接受的符號(hào)串。【實(shí)驗(yàn)要求】1、編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。2、如果遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息。 3、程序輸入/輸出實(shí)例: 輸入一以#結(jié)束的符號(hào)串(包括+*/()i#):在此位置輸入符號(hào)串 輸出過(guò)程如下:步驟 狀態(tài)棧 符號(hào)棧 剩余輸入串 動(dòng) 作 1 0 # i+i*i# 移進(jìn) 【流程圖】【源代碼】#include<stdio.h>#include<stdlib.h>int Action126=105,0,0,104,0,0,0,106,0,0,0,-1,0,52,107,0,52
5、,52,0,54,54,0,54,54,105,0,0,104,0,0,0,56,56,0,56,56,105,0,0,104,0,0,105,0,0,104,0,0,0,106,0,0,111,0,0,51,107,0,51,51,0,53,53,0,53,53,0,55,55,0,55,55;int Goto123=1,2,3,0,0,0,0,0,0,0,0,0,8,2,3,0,0,0,0,9,3,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0;char Grammar2010='0'char VT10,VN10;char AVT6='i',&
6、#39;+','*','(',')','#'char GVN3='E','T','F'int vnNum,vtNum,stateNum=12;int VNum10;int grammarNum;typedef structchar *base;char *top;SymbolStack;typedef structint *base;int *top;StateStack;StateStack state;SymbolStack symbol;int ScanGrammar(
7、)FILE *fp=fopen("SLR文法.txt","r"); FILE *tp;char singleChar,nextChar;int i=0,j=0,k,count;while(!feof(fp)fscanf(fp,"%c",&singleChar);if(singleChar='?')Grammarij='0'break;if(singleChar='n')Grammarij='0'i+;j=0;continue;if(singleChar='
8、-')tp=fp;fscanf(tp,"%c",&nextChar);if(nextChar='>')fp=tp;continue;if(singleChar='|')Grammari+10=Grammari0;Grammarij='0' i+;j=1;continue;Grammarij=singleChar;if(singleChar>='A'&&singleChar<='Z')count=0;while(VNcount!=singleCha
9、r&&VNcount!='0')count+;if(VNcount='0')vnNum=count+1;if(singleChar='S')j+;continue;VNcount=singleChar;vnNum=count+1;else count=0;while(VTcount!=singleChar&&VTcount!='0')count+;if(VTcount='0')VTcount=singleChar;vtNum=count+1;j+;printf("輸入的文法
10、:n");for(k=0;k<=i;k+)j=0;while(Grammarkj!='0')if(j=1)printf("->");printf("%c",Grammarkj);j+; printf("n");count=0;printf("VT:");while(VTcount!='0')printf("%3c",VTcount); count+;VTcount='#'vtNum=count+1;printf("%
11、3c",VTcount);printf("nVN:");count=0;while(VNcount!='0')printf("%3c",VNcount);count+;printf("n");/printf("n%d %dn",vtNum,vnNum);fclose(fp);grammarNum=i+1; return i;int vNumCount()int i,j;for(i=0;i<grammarNum;i+)j=1;while(Grammarij!='0')j
12、+;VNumi=j;/printf("%3d",VNumi);printf("n");return 0;void InitStack()state.base=(int *)malloc(100*sizeof(int);if(!state.base)exit(1);state.top=state.base;*state.top=0;symbol.base=(char *)malloc(100*sizeof(char);if(!symbol.base)exit(1);symbol.top=symbol.base;*symbol.top='#'
13、int Judge(int stateTop,char inputChar)int i,j;for(i=0;i<stateNum;i+)if(stateTop=i)break;for(j=0;j<vtNum;j+)if(inputChar=AVTj)break;return Actionij;int GetGoto(int stateTop,char inputChar)int i,j;for(i=0;i<stateNum;i+)if(stateTop=i)break;for(j=0;j<vnNum;j+)if(inputChar=GVNj)break;return G
14、otoij;int print(int count,int i,char Input,int action,int gt,int sign)int *p=state.base,stateNum;int j,jj;char *q=symbol.base,symbolNum;printf("%dt",count);while(p!=state.top+1)stateNum=*p;printf("%d",stateNum);p+;printf("t");while(q!=symbol.top+1)symbolNum=*q;printf(&q
15、uot;%c",symbolNum);q+;printf("t");j=i;jj=0;while(jj<j)printf(" ");jj+;while(Inputj!='0')printf("%c",Inputj);j+;printf("t");if(sign=1)printf("tS%dt%dn",action,gt);if(sign=2)printf("tr%dt%dn",action,gt);if(sign=3)printf("
16、tacct%dn",gt);if(sign=0)printf("t0t0n");return 0;int Pop(int action)int *p,stateNum,ssValue,i;state.top-;p=state.top;stateNum=*p;i=VNumaction-1;while(i!=0)symbol.top-;i-;symbol.top+;*symbol.top=Grammaraction0;ssValue=GetGoto(stateNum,Grammaraction0);if(ssValue=0)return ssValue;state.t
17、op+;*state.top=ssValue;return ssValue;int Reduction()char Input20;int i=0,count=1;int ssValue,action;int stateTop,gt;int sign=-1;/移進(jìn)1,規(guī)約2,接受3scanf("%s",&Input); while(Inputi!='0')if(Inputi>='A'&&Inputi<='Z')printf("輸入的不是有效的表達(dá)式!");return 0
18、;i+;i=0;printf("步驟t狀態(tài)棧t符號(hào)棧t輸入串ttACTIONtGOTOn");while(Inputi!='0')if(count=1)print(count,i,Input,0,0,0);count+;stateTop=*state.top;ssValue=Judge(stateTop,Inputi);if(ssValue=0)state.top-;if(*symbol.top='#')printf("規(guī)約出錯(cuò)!");return 0;continue;if(ssValue=-1)sign=3;print(count,i,Input,ssValue,0,sign);count+;return 1;if(ssValue>=100)sign=1;action=ssValue-100;state.top+;*state.top=ac
溫馨提示
- 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àn)學(xué)校2020年高二語(yǔ)文模擬試卷含解析
- 2025年江西贛州市會(huì)昌縣興會(huì)科技創(chuàng)新集團(tuán)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 2025年西安航空工業(yè)慶安集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 2025年廣安投資集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 《文化生活教材介紹》課件
- 2024年藝術(shù)品購(gòu)銷合同條款
- 2024版實(shí)驗(yàn)動(dòng)物購(gòu)銷合同
- 二零二五年度珠寶首飾OEM委托生產(chǎn)合同示范文本2篇
- 二零二五年度礦山勞動(dòng)用工員工職業(yè)生涯規(guī)劃合同2篇
- 2024汽車租賃合同起訴狀范本模板
- 2022屆高考英語(yǔ)二輪復(fù)習(xí):閱讀理解細(xì)節(jié)理解題 導(dǎo)學(xué)案
- 中文網(wǎng)絡(luò)成癮量表(臺(tái)灣陳淑惠)
- 連續(xù)梁施工安全培訓(xùn):掛籃施工及安全控制
- 儲(chǔ)運(yùn)車間裝卸車和儲(chǔ)罐安全操作培訓(xùn)
- 洞庭湖觀鳥(niǎo)旅游發(fā)展現(xiàn)狀及對(duì)策
- 土壤與肥料學(xué)課件
- 供應(yīng)商物料質(zhì)量問(wèn)題賠償協(xié)議(中文)
- 公共廁所(預(yù)算書(shū))
- 《豬肉分割及介紹》PPT課件.ppt
- 集團(tuán)公司員工宿舍管理辦法(正式版)
- 康復(fù)治療學(xué)專業(yè)畢業(yè)生的培養(yǎng)與就業(yè)分析
評(píng)論
0/150
提交評(píng)論