LL(1)語法分析器實驗報告_第1頁
LL(1)語法分析器實驗報告_第2頁
LL(1)語法分析器實驗報告_第3頁
LL(1)語法分析器實驗報告_第4頁
LL(1)語法分析器實驗報告_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

LL〔1〕語法分析器實驗報告篇一:LL(1)語法分析實驗報告

?編譯原理?課程實驗報告

課程實驗題目:

作者所在系部:

作者所在專業(yè):

作者所在班級:

作者學號:

作者姓名:

指導教師姓名:

完成時間:

一、實驗目的LL(1)語法分析實驗計算機科學與工程系計算機科學與技術xxxxxxx

理解預測分析表方法的實現(xiàn)原理。

二、實驗內(nèi)容及要求

編寫一通用的預測法分析程序,要求有一定的錯誤處理才能,出錯后可以使程序繼續(xù)運行下去,直到分析過程完畢。可通過不同的文法〔通過數(shù)據(jù)表現(xiàn)〕進展測試。

給定算術表達式文法,編寫程序。

測試數(shù)據(jù):

1.算術表達式文法

E→TE’

E’→+TE’|-TE’|ε

T→FT’

T’→*FT’|/FT’|%FT’|ε

F→(E)|id|num

2.作業(yè)3.10文法

三、實驗程序設計說明

1.實驗方案設計

主要函數(shù)之間的調(diào)用關系如下列圖所示:

2.程序源代碼

源代碼如下:

#include

#include

#include

usingnamespacestd;

structNode1

{charvn;

charvt;

chars[10];

}MAP[20];//存儲分析預測表每個位置對應的終結(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ǎn)生式

charVN【6】={'E','R','T','W','F'};//存儲非終結(jié)符

charVT【6】={'i','+','*','(',')','#'};//存儲終結(jié)符

charSELECT[10][10]={"(,i","+","),#","(,i","*","+,),#","(","i"};//存儲文法中每個產(chǎn)生式對應的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對符號串%s的分析過程\n",word);printf("-----------------------------------------------------------------------\n");printf("\n");

printf("步驟棧頂元素剩余輸入串動作\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");//預測分析表

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表達式文法的預測分析表如下:\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篇二:語法分析器實驗報告

曲阜師范大學實驗報告

軟件工程一班組計算機系2022年級

日期2022-11-12

姓名王戰(zhàn)海學號2022416596

實驗名稱:語法分析實驗

一、實驗目的:

1、通過完成預測分析法的語法分析程序,理解預測分析法和遞歸子程序法的區(qū)別和聯(lián)絡;

2、理解語法分析的功能,掌握語法分析程序設計的原理和構造方法;

3、訓練掌握開發(fā)應用程序的根本方法。

二、實驗內(nèi)容:

1、根據(jù)某一文法編制調(diào)試LL〔1〕分析程序,以便對任意輸入的符號串進展分析;

2、構造預測分析表,并利用分析表和一個棧來實現(xiàn)對上述程序設計語言的分析程序;

3、分析法的功能是利用LL〔1〕控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號以及LL〔1〕分析表,對輸入符號串自上而下的分析過程。

三、實驗要求:

1、編程時注意編程風格:空行的使用、注釋的使用、縮進的使用等。

2、假設遇到錯誤的表達式,應輸出錯誤提示信息。

3、對以下文法,用LL〔1〕分析法對任意輸入的符號串進展分析:

〔1〕S->TE

〔2〕E->+TE|$

〔3〕T->FM

〔4〕M->*FM|$

〔5〕F->(E)|i#

四、實驗環(huán)境:

WindowsXP

Eclipse,J2SE1.6

五、實驗分析:

〔一〕設計思想

〔1〕定義局部:定義常量、變量、數(shù)據(jù)構造。

〔2〕初始化:設立LL(1)分析表、初始化變量空間〔包括堆棧、構造體、數(shù)組、臨時變量等〕;

〔3〕控制局部:從鍵盤輸入一個表達式符號串;

〔4〕利用LL(1)分析算法進展表達式處理:根據(jù)LL(1)分析表對表達式符號串進展堆棧〔或其他〕操作,輸出分析結(jié)果,假設遇到錯誤那么顯示錯誤信息。

〔二〕分析的流程圖

〔三〕算法設計

#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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論