LL(1)語法分析器實(shí)驗(yàn)報(bào)告_第1頁
LL(1)語法分析器實(shí)驗(yàn)報(bào)告_第2頁
LL(1)語法分析器實(shí)驗(yàn)報(bào)告_第3頁
LL(1)語法分析器實(shí)驗(yàn)報(bào)告_第4頁
LL(1)語法分析器實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論