中北大學軟件學院
實 驗 報 告
專
業
課程名稱
學
號
姓
名
輔導教師
成績
實驗日期 2014.12.03 實驗時間
10:00—11:30 1、實驗名稱
語法分析器的設計與實現
2、實驗目的 掌握自上而下語法分析方法、自下而上語法分析方法
3、實驗要求 (1)實驗內容:四選一
① 設計及實現能夠識別表達式的預測分析程序。
文法如下:
G[E]:E->E+T|T
T->T*F|F
F->(E)|i
② 設計及實現能夠識別表達式的 LR分析程序。
文法如下:
G[E]:E->E+T|T
T->T*F|F
F->(E)|i
③
設計及實現能夠識別表達式的算符優先分析程序。
文法如下:
G[E]:E->E+T|T
T->T*F|F
F->P↑F|P
P->(E)|i
④設計及實現計算表達式的計算器。
表達式中可包含+、-、*、/、(、)運算符。
(2)實驗要求:
對已給的一個二元式形式表達式,能夠檢查有無語法錯誤。并指定出錯位置。
將表達式的語法樹輸出(或將語法分析過程輸出)。
4、實驗原理 根據自上而下和自下而上的語法分析思想實現語法分析程序。
5、實驗步驟 (1)根據文法構造語法分析表。
(2)編寫總控程序實現語法分析。
6、狀態轉換圖及詞法分析程序
(1)狀態轉換圖
否
(2)語法分析器源代碼
#include<stdio.h>
#include<string.h>
char *action[12][6]={"S5#",NULL,NULL,"S4#",NULL,NULL,
/*ACTION 表*/
NULL,"S6#",NULL,NULL,NULL,"acc",
LL(1) 文報錯判 斷有結讀入文法開 始
NULL,"r2#","S7#", NULL,"r2#","r2#",
NULL,"r4#","r4#", NULL,"r4#","r4#",
"S5#",NULL,NULL, "S4#",NULL,NULL,
NULL,"r6#","r6#", NULL,"r6#","r6#",
"S5#",NULL,NULL, "S4#",NULL,NULL,
"S5#",NULL,NULL, "S4#",NULL,NULL,
NULL,"S6#",NULL, NULL,"S11#",NULL,
NULL,"r1#","S7#", NULL,"r1#","r1#",
NULL,"r3#","r3#", NULL,"r3#","r3#",
NULL,"r5#","r5#", NULL,"r5#","r5#"};
int goto1[12][3]={1,2,3,
/*QOTO 表*/
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 vt[6]={"i","+","*","(",")","#"};
/*存放終結符*/
char vn[3]={"E","T","F"};
/*存放非終結符*/
char*LR[7]={"M->E#","E->E+T#","E->T#","T->T*F#","T->F#","F->(E)#","F->i#"};
/*存放產生式*/
int a[20];//數組 a 實現狀態棧
char b[20],c[20],c1;//數組 b 實現符號棧,數組 c 存放輸入的字符串
int top1,top2,top3,top,m,n;
int main()
{
int g,h,i,j,k,l,p,y,z,count;
char x,copy[20],copy1[20];
top1=0;top2=0;top3=0;top=0;
a[0]=0;y=a[0];b[0]="#";
count=0;z=0;
//輸入要識別的字符串
printf("請輸入表達式\n");
do{
scanf("%c",&c1);
c[top3]=c1;
//字符數組 c[10]存放輸入的字符串
top3=top3+1;//最后 top3=5
}while(c1!="#");
//輸出分析結果
printf("步驟\t 狀態棧\t\t 符號棧\t\t 輸入串\t\tACTION\tGOTO\n");
do{
y=z;m=0;n=0;
/*y,z 指向狀態棧棧頂*/
g=top;j=0;k=0;
x=c[top];
//將輸入符號賦給 x
count++;
printf("%d\t",count);//輸出步驟序號
while(m<=top1)
{
/*輸出狀態棧*/
printf("%d",a[m]);
m=m+1;
}
printf("\t\t");
while(n<=top2)
{
/*輸出符號棧*/
printf("%c",b[n]);
n=n+1;
}
printf("\t\t");
while(g<=top3)
{
/*輸出輸入串*/
printf("%c",c[g]);
g=g+1;
}
printf("\t\t");
while(x!=vt[j]&&j<=5) //獲取當前 x 對應 j 的值
j++;
if(j==5&&x!=vt[j])//如果 x 不是終結符則報錯
{
printf("error\n");
return 0;
}
if(action[y][j]==NULL){
printf("error\n");
return 0;
}
else
strcpy(copy,action[y][j]);
if(copy[0]=="S")
{
/*處理移進*/
z=copy[1]-"0";//因為狀態從 0 開始
top1=top1+1;
top2=top2+1;
a[top1]=z;//數組 a 實現狀態棧
b[top2]=x;//數組 b 實現符號棧
top=top+1;//輸入符號串數組 c的頂
i=0;
while(copy[i]!="#")//例 "S3#"
輸出 ACTION
{
printf("%c",copy[i])
return 0;
i++;
}
printf("\n");
}
if(copy[0]=="r")
{
/*處理歸約*/
i=0;
while(copy[i]!="#")//例 "S3#"
輸出 ACTION
{
printf("%c",copy[i])
return 0;
i++;
}
h=copy[1]-"0";//因為狀態從 0 開始
strcpy(copy1,LR[h]);
while(copy1[0]!=vn[k]) //獲取當前 k 值
k++;
l=strlen(LR[h])-4;
top1=top1-l+1;
top2=top2-l+1;
y=a[top1-1];
p=goto1[y][k];
a[top1]=p;
b[top2]=copy1[0];
z=p;
printf("\t");
printf("%d\n",p);
}
}while(action[y][j]!="acc");
printf("acc\n");
getchar();
}
7、測試及結果
確定是否為 LL(1)文法
8、心得 通過本次的實驗,使我真正的了解語法分析器的實現過程,讓我更加深刻領悟語法分析器的實現原理。雖然在本次實驗中遇到了各種各樣的困難和錯誤,但在老師和同學們的幫助下我都一一克服了,使得語法分析器能夠正確的識別相應的語法和表達式。
在做實驗的過程中,發現自己在編寫程序過程中,總是會忽略各種細節,從而導致經常修改一些很小的低級錯誤才能使程序正常運行,不僅浪費時間,還影響對其他地方的修改,并且在很多步驟處理上,方法不正確。使結果不能符合要求,深刻體會到了自己在編程方面與別人的差距,在今后的學習中,我會注意改正自己在這方面的缺點,促使自己的編程水平不斷進步。編譯原理是一門專業學科,對于現階段的我來說,只能掌握它的一些基本原理和概念,對于一些更深層的知識還是有很多難以理解的地方。但在這次實驗過程中,鍛煉了自己的思考能力,也鍛煉了自己的動手編程能力,對于將知識的轉化有了很大的幫助。
推薦訪問: 編譯 語法 原理上一篇:黨務公開工作自查報告
下一篇:村防汛先進個人事跡
在偉大祖國73華誕之際,我參加了單位組織的“光影鑄魂”主題黨日活動,集中觀看了抗美援朝題材影片《長津湖》,再一次重溫這段悲壯歷史,再一次深刻感悟偉大抗美援朝精神。1950年10月,新中國剛剛成立一年,
根據省局黨組《關于舉辦習近平談治國理政(第四卷)讀書班的通知》要求,我中心通過專題學習、專題研討以及交流分享等形式,系統的對《習近平談治國理政》(第四卷)進行了深入的學習與交流,下面我就來談一談我個人
《習近平談治國理政》(第四卷)是在百年變局和世紀疫情相互疊加的大背景下,對以習近平同志為核心的黨中央治國理政重大戰略部署、重大理論創造、重大思想引領的系統呈現。它生動記錄了新一代黨中央領導集體統籌兩個
《真抓實干做好新發展階段“三農工作”》是《習近平談治國理政》第四卷中的文章,這是習近平總書記在2020年12月28日中央農村工作會議上的集體學習時的講話。文章指出,我常講,領導干部要胸懷黨和國家工作大
在《習近平談治國理政》第四卷中,習近平總書記強調,江山就是人民,人民就是江山,打江山、守江山,守的是人民的心。從嘉興南湖中駛出的小小紅船,到世界上最大的執政黨,在中國共產黨的字典里,“人民”一詞從來都
黨的十八大以來,習近平總書記以馬克思主義戰略家的博大胸襟和深謀遠慮,在治國理政和推動全球治理中牢固樹立戰略意識,在不同場合多次圍繞戰略策略的重要性,戰略和策略的關系,提高戰略思維、堅定戰略自信、強化戰
《習近平談治國理政》第四卷集中展示了以習近平同志為核心的黨中央在百年變局和世紀疫情相互疊加背景下,如何更好地堅持和發展中國特色社會主義而進行的生動實踐與理論探索;對于新時代堅持和發展什么樣的中國特色社
在黨組織的關懷下,我有幸參加了區委組織部組織的入黨積極分子培訓班。為期一周的學習,學習形式多樣,課程內容豐富,各位專家的講解細致精彩,對于我加深對黨的創新理論的認識、對黨的歷史的深入了解、對中共黨員的
《習近平談治國理政》第四卷《共建網上美好精神家園》一文中指出:網絡玩命是新形勢下社會文明的重要內容,是建設網絡強國的重要領域。截至2021年12月,我國網民規模達10 32億,較2020年12月增長4
剛剛召開的中國共產黨第十九屆中央委員會第七次全體會議上討論并通過了黨的十九屆中央委員會向中國共產黨第二十次全國代表大會的報告、黨的十九屆中央紀律檢查委員會向中國共產黨第二十次全國代表大會的工作報告和《