版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
LL〔1〕語法分析器實(shí)驗(yàn)報(bào)告篇一:LL(1)語法分析實(shí)驗(yàn)報(bào)告
?編譯原理?課程實(shí)驗(yàn)報(bào)告
課程實(shí)驗(yàn)題目:
作者所在系部:
作者所在專業(yè):
作者所在班級(jí):
作者學(xué)號(hào):
作者姓名:
指導(dǎo)教師姓名:
完成時(shí)間:
一、實(shí)驗(yàn)?zāi)康腖L(1)語法分析實(shí)驗(yàn)計(jì)算機(jī)科學(xué)與工程系計(jì)算機(jī)科學(xué)與技術(shù)xxxxxxx
理解預(yù)測(cè)分析表方法的實(shí)現(xiàn)原理。
二、實(shí)驗(yàn)內(nèi)容及要求
編寫一通用的預(yù)測(cè)法分析程序,要求有一定的錯(cuò)誤處理才能,出錯(cuò)后可以使程序繼續(xù)運(yùn)行下去,直到分析過程完畢。可通過不同的文法〔通過數(shù)據(jù)表現(xiàn)〕進(jìn)展測(cè)試。
給定算術(shù)表達(dá)式文法,編寫程序。
測(cè)試數(shù)據(jù):
1.算術(shù)表達(dá)式文法
E→TE’
E’→+TE’|-TE’|ε
T→FT’
T’→*FT’|/FT’|%FT’|ε
F→(E)|id|num
2.作業(yè)3.10文法
三、實(shí)驗(yàn)程序設(shè)計(jì)說明
1.實(shí)驗(yàn)方案設(shè)計(jì)
主要函數(shù)之間的調(diào)用關(guān)系如下列圖所示:
2.程序源代碼
源代碼如下:
#include
#include
#include
usingnamespacestd;
structNode1
{charvn;
charvt;
chars[10];
}MAP[20];//存儲(chǔ)分析預(yù)測(cè)表每個(gè)位置對(duì)應(yīng)的終結(jié)符,非終結(jié)符,產(chǎn)生式intk;
//用R代表E',W代表T',e代表空
charstart='E';
intlen=8;
char
G[10][10]={"E->TR","R->+TR","R->e","T->FW","W->*FW","W->e","F->(E)","F->i"};//存儲(chǔ)文法中的產(chǎn)生式
charVN【6】={'E','R','T','W','F'};//存儲(chǔ)非終結(jié)符
charVT【6】={'i','+','*','(',')','#'};//存儲(chǔ)終結(jié)符
charSELECT[10][10]={"(,i","+","),#","(,i","*","+,),#","(","i"};//存儲(chǔ)文法中每個(gè)產(chǎn)生式對(duì)應(yīng)的SELECT集
charRight[10][8]={"->TR","->+TR","->e","->FW","->*FW","->e","->(E)","->i"};//用R代表A',W代表B',e代表空
/*charstart='A';
intlen=6;
charG[10][10]={"A->aR","R->ABl","R->e","B->dW","W->bW","W->e"};charVN【6】={'A','R','B','W'};
charVT【6】={'a','d','b','#','l'};
charSELECT[10][10]={"a","a","d,#","d","b","l"};
charRight[10]【6】={"->aR","->ABl","->e","->dW","->bW","->e"};*/
stackstak;
boolpare(char*a,char*b)
{inti,la=strlen(a),j,lb=strlen(b);
for(i=0;ifor(j=0;j{if(a[i]==b[j])
return1;}
return0;}
char*Find(charvn,charvt)
{inti;
for(i=0;i{if(MAP[i].vn==vnMAP[i].vt==vt)
returnMAP[i].s;}
return"error";}
char*Analyse(char*word)
{charp,action[10],output[10];
inti=1,j,l=strlen(word),k=0,l_act,m;
while(!stak.empty())
stak.pop();
stak.push('#');
stak.push(start);
printf("___________________________________________________________\n");printf("\n對(duì)符號(hào)串%s的分析過程\n",word);printf("-----------------------------------------------------------------------\n");printf("\n");
printf("步驟棧頂元素剩余輸入串動(dòng)作\n");
printf("-----------------------------------------------------------------------\n");p=stak.top();
while(p!='#')
{printf("%7d",i++);
p=stak.top();
stak.pop();
printf("%6c",p);
for(j=k,m=0;joutput[m++]=word[j];
output[m]='\0';
printf("%10s",output);
if(p==word[k])
{if(p=='#')
{printf("分析成功\n");
return"SUCCESS";}
printf("匹配終結(jié)符“%c〞\n",p);
k++;}
else
{strcpy(action,Find(p,word[k]));
if(strcmp(action,"error")==0)
{printf("沒有可用的產(chǎn)生式\n");
return"ERROR";}
printf("展開非終結(jié)符%c%s\n",p,action);
intl_act=strlen(action);
if(action[l_act-1]=='e')
continue;
for(j=l_act-1;j>1;j--)
stak.push(action[j]);}
}if(strcmp(output,"#")!=0)
return"ERROR";
}
intmain()
{freopen("in1.txt","r",stdin);
//freopen("in2.txt","r",stdin);
charsource[100];
inti,j,flag,l,m;
//printf("\n***為了方便編寫程序,用R代表E',W代表T',e代表空*****\n\n");printf("\n****為了方便編寫程序,用R代表A',W代表B',e代表空*****\n\n");
printf("該文法的產(chǎn)生式如下:\n");
for(i=0;iprintf("%s\n",G[i]);
printf("___________________________________________________________\n");printf("\n該文法的SELECT集如下:\n");
for(i=0;i{printf("SELECT(%s)={%s}\n",G[i],SELECT[i]);}
printf("___________________________________________________________\n");//判斷是否是LL(1)文法
flag=1;
for(i=0;i{for(j=i+1;j{if(G[i][0]==G[j][0])
{if(pare(SELECT[i],SELECT[j]))
{flag=0;break;}
}
}if(j!=8)
break;}
if(flag)
printf("\n有一樣左部產(chǎn)生式的SELECT集合的交集為空,所以文法是LL〔1〕文法。\n");
else
printf("\n有一樣左部產(chǎn)生式的SELECT集合的交集不為空,所以文法不是LL〔1〕文法。\n");
printf("___________________________________________________________\n");//預(yù)測(cè)分析表
for(i=0,k=0;i{l=strlen(SELECT[i]);
for(j=0;j{MAP[k].vn=G[i][0];
MAP[k].vt=SELECT[i][j];
strcpy(MAP[k].s,Right[i]);
k++;}}
printf("\n表達(dá)式文法的預(yù)測(cè)分析表如下:\n\n");
printf("");
for(i=0;iprintf("%10c",VT[i]);
printf("\n");
for(i=0;i{printf("---------------------------------------------------------------\n");printf("%10c",VN[i]);
for(j=0;j篇二:語法分析器實(shí)驗(yàn)報(bào)告
曲阜師范大學(xué)實(shí)驗(yàn)報(bào)告
軟件工程一班組計(jì)算機(jī)系2022年級(jí)
日期2022-11-12
姓名王戰(zhàn)海學(xué)號(hào)2022416596
實(shí)驗(yàn)名稱:語法分析實(shí)驗(yàn)
一、實(shí)驗(yàn)?zāi)康模?/p>
1、通過完成預(yù)測(cè)分析法的語法分析程序,理解預(yù)測(cè)分析法和遞歸子程序法的區(qū)別和聯(lián)絡(luò);
2、理解語法分析的功能,掌握語法分析程序設(shè)計(jì)的原理和構(gòu)造方法;
3、訓(xùn)練掌握開發(fā)應(yīng)用程序的根本方法。
二、實(shí)驗(yàn)內(nèi)容:
1、根據(jù)某一文法編制調(diào)試LL〔1〕分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)展分析;
2、構(gòu)造預(yù)測(cè)分析表,并利用分析表和一個(gè)棧來實(shí)現(xiàn)對(duì)上述程序設(shè)計(jì)語言的分析程序;
3、分析法的功能是利用LL〔1〕控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號(hào)以及LL〔1〕分析表,對(duì)輸入符號(hào)串自上而下的分析過程。
三、實(shí)驗(yàn)要求:
1、編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。
2、假設(shè)遇到錯(cuò)誤的表達(dá)式,應(yīng)輸出錯(cuò)誤提示信息。
3、對(duì)以下文法,用LL〔1〕分析法對(duì)任意輸入的符號(hào)串進(jìn)展分析:
〔1〕S->TE
〔2〕E->+TE|$
〔3〕T->FM
〔4〕M->*FM|$
〔5〕F->(E)|i#
四、實(shí)驗(yàn)環(huán)境:
WindowsXP
Eclipse,J2SE1.6
五、實(shí)驗(yàn)分析:
〔一〕設(shè)計(jì)思想
〔1〕定義局部:定義常量、變量、數(shù)據(jù)構(gòu)造。
〔2〕初始化:設(shè)立LL(1)分析表、初始化變量空間〔包括堆棧、構(gòu)造體、數(shù)組、臨時(shí)變量等〕;
〔3〕控制局部:從鍵盤輸入一個(gè)表達(dá)式符號(hào)串;
〔4〕利用LL(1)分析算法進(jìn)展表達(dá)式處理:根據(jù)LL(1)分析表對(duì)表達(dá)式符號(hào)串進(jìn)展堆?!不蚱渌巢僮?,輸出分析結(jié)果,假設(shè)遇到錯(cuò)誤那么顯示錯(cuò)誤信息。
〔二〕分析的流程圖
〔三〕算法設(shè)計(jì)
#include
#include
intvnNum,grammarNum,vtNum=6;
intorder;
intcount=1;
charGrammar[20][10],BlankTerminate[20]【2】;charFirst【5】【4】={'S','(','i','\0',
'E','+','$','\0',
'T','(','i','\0',
'M','*','$','\0',
'F','(','i','\0'};
charFollow【5】【6】={'S',')','#','\0','\0','\0','E',')','#','\0','\0','\0','T','+',')','#','\0','\0','M','+',')','#','\0','\0','F','*','+',')','#','\0'};charSelect[8]【4】={'(','i','\0','\0',
'+','\0','\0','\0',')','#','\0','\0',
'(','i','\0','\0',
'*','\0','\0','\0','+',')','#','\0',
'(','\0','\0','\0',
'i','\0','\0','\0'};intIndiBlanket【6】【7】;
charVT[10]={'i','+','*','(',')','#'};
typedefstruct{
char*base;
char*top;
intstacksize;
}AnalStack;
AnalStackS;
intScanGrammar()
{
FILE*fp=fopen("文法.txt","r");FILE*tp;
charsingleChar,nextChar;inti=0,j=0;while(!feof(fp)){fscanf(fp,"%c",singleChar);if(singleChar=='#'){Grammar[i][j]='\0';break;}if(singleChar=='\n'){Grammar[i][j]='\0';i++;j=0;continue;}if(singleChar=='-'){tp=fp;fscanf(tp,"%c",nextChar);if(nextChar=='>'){fp=tp;continue;}}if(singleChar=='|'){Grammar[i+1][0]=Grammar[i][0];Grammar[i][j]='\0';i++;j=1;continue;}Grammar[i][j]=singleChar;j++;}
//printf("輸入的文法:\n");
for(intk=0;k{
j=0;
while(Grammar[k][j]!='\0'){
if(j==1)
{
//
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 26718-2024城市軌道交通安全防范系統(tǒng)技術(shù)要求
- 廣東酒店管理職業(yè)技術(shù)學(xué)院《經(jīng)典劇目排練》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東交通職業(yè)技術(shù)學(xué)院《醫(yī)學(xué)是什么》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東技術(shù)師范大學(xué)《中醫(yī)藥文化傳播》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東海洋大學(xué)《幼兒園玩教具設(shè)計(jì)與制作》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東工商職業(yè)技術(shù)大學(xué)《中國(guó)經(jīng)濟(jì)前沿(英語)》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)生勞動(dòng)課種花課件
- 《非平穩(wěn)信號(hào)分析》課件
- 贛西科技職業(yè)學(xué)院《材料力學(xué)D》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南師范大學(xué)《多媒體影像創(chuàng)作》2023-2024學(xué)年第一學(xué)期期末試卷
- ICD-10疾病編碼完整版
- 醫(yī)療器械的檢查與包裝講解課件
- 高頻焊接操作技術(shù)規(guī)范
- 環(huán)氧樹脂固化
- GB_T4897-2015刨花板(高清版)
- 公路工程竣工驗(yàn)收辦法
- 畢業(yè)設(shè)計(jì)(論文)安徽汽車產(chǎn)業(yè)的現(xiàn)狀分析及發(fā)展戰(zhàn)略研究
- (完整word版)直流穩(wěn)壓電源的設(shè)計(jì)
- 帆軟BIFineBI技術(shù)白皮書
- 絞車斜巷提升能力計(jì)算及絞車選型核算方法
- 6_背景調(diào)查表
評(píng)論
0/150
提交評(píng)論