1課程任務書(2)
1問題描述........................(3)
2描述語法和屬性語法(3)
2.1 While-Do循環語句的語法(3)
2.2while-do循環句結構翻譯(3)
3中間代碼形式的語法分析和描述(4)
3.1語法分析法(4)
3.2中間代碼形式描述(4)
4簡要分析和概要設計(5)
4.1詞法分析(5)
4.2遞歸下降翻譯器的設計(5)
4.3語法指導翻譯(5)
5詳細的算法描述.................(6)
5.1語法(6)
5.2錯誤.........................................(6)
6試驗方法和試驗結果(9)
6.1測試方法(9)
6.2測試結果(10)
7設計的特點、缺點、收獲和經驗(10)
7.1設計特征(10)
7.2不足、收獲和經驗(11)
8參考文獻(11)
課程設計任務書
題目:循環句的語法分析和語義分析程序設計(遞歸下降法)
1.
通過設計、編譯和調試壹個語法和語義分析程序,我們可以加深對語法和語義分析原理的理解。
2.設計內容和要求
WHILE〈布爾表達式〉DO〈賦值語句>
在…之中
(1)學號29到32的學生為了完成上述任務分別選擇遞歸下降法、LL(1)、算子優先分析法(或簡單優先法)和LR法,中間碼為四進制。
(2)寫出符合分析方法要求的文法,給出分析方法的思路,完成分析程序設計。
(3)編制分析程序後,設計若幹用例,在計算機上進行測試,通過設計的分析程序。
3.課程設計報告的內容應包括:
1.設計題目、班級、學號、姓名、完成日期;
2.給出語法分析方法、中間代碼形式的描述、語法和屬性語法的設計;或者詞匯分析法。
3.符號表和令牌碼的設計。
4.簡要分析和概要設計;
5.詳細的算法描述;
6.源程序列表;
7.給出軟件的測試方法和結果;
8.設計的評價、收獲和體驗。
4.時間表:
第17周,第1周——周四上午,周五全天。
教員簽名:年月日
系主任(或負責教師)簽名:年月日
1問題描述
設計壹個WHILE〈布爾表達式〉DO〈賦值語句》的詞法、語法和語義分析程序。語法分析選擇遞歸下降法,語法指導翻譯輸出中間代碼四邊形。
語法和屬性語法的描述。
2.1 while-do循環語句的語法
生產配方為S-& gt;而E do A,為了方便語法引導的翻譯,改寫如下:
語法G(s)如下:
s-& gt;WEDG(意思是當我們做某事時)
g-& gt;c=R
r-& gt;dTe|d
t->;+|-|*|/
e-& gt;空軍基地
f-& gt;& gt| = = | & lt
2.2 whil ie-do循環句的結構翻譯:
3.中間代碼形式的語法分析方法及描述
3.1語法分析法
遞歸下降法的實現思想是為文法的每個非終結符設計壹個對應的遞歸子程序,識別程序由壹組這樣的子程序組成。
它的優點是簡單、直觀、易於構造,許多編譯系統都實現了這壹點。
缺點是語法要求很高,很多遞歸調用影響了分析器的效率。
它的語法可以表示為:
E→T│E+T
T→F│T*F
F→i│(E)
語法圖可以用來表示壹種語言的語法,如下圖所示:
E
T
F
3.2中間代碼形式描述
中間代碼壹式四份輸出,壹式四份是壹個記錄結構,有四個字段,分別叫OP、ARG1、ARG2和result。字段op包含代表運算符的內部代碼。語句,而
100(& lt;,甲,乙,102)
101 ( j,,_,105)
102 ( +,a,b,n)
103 ( =,n,_,a)
104 ( j,_,100)
105
4.簡要分析和概要設計
4.1詞法分析
詞法分析程序的任務是:從左到右逐字符掃描源程序,逐個生成單詞符號,將作為字符串的源程序轉換成單詞符號的中間程序。詞法分析檢查的錯誤主要是挑出源程序中的非法符號。所謂非法符號,是指編程語言中不允許出現的符號,就像自然語句中的錯別字壹樣。
4.2遞歸下降翻譯器的設計
1.:為每個非終結符A構造壹個函數過程,為A的每個繼承屬性設置壹個形參,函數返回值為A的綜合屬性,在A對應的函數過程中,為A的產生式中出現的每個語法符號的每個屬性設置壹個局部變量,在非終結符A對應的函數過程中,根據當前輸入的符號決定使用哪個產生候選。
2.在每個生產類型對應的程序代碼中,按照從左到右的順序,分別對字符號、非3:終止符、語義動作做如下工作。
(1)對於綜合屬性為X的終結符X,將X的值存儲在為X,X設置的變量中..然後,生成匹配x的調用,並讀入輸入符號。
(2)對於每個非終結符B,生成壹個賦值語句c=B(b1,b2,…,bk),右邊有壹個函數調用。
(3)對於語義動作,動作的代碼被復制到分析器中,對應屬性的每壹個引用都被代表屬性的變量所替代。
4.3語法指導翻譯
在語法分析的過程中,隨著壹步步分析的進展,按照每壹個產生式對應的語義子程序(或語義規則描述的語義動作)進行翻譯。屬性文法的每個符號都有壹個屬性,所以當每個符號放入堆棧時,它必須和屬性壹起放入堆棧。這樣,堆棧符號由語法符號和存儲符號屬性的字段組成。由於屬性類型不同,存儲在屬性域中的內容取決於屬性類型。有些可以直接存儲屬性值,有些可以存儲指向屬性值的指針。對於綜合屬性,其屬性域不存儲其屬性值,而是存儲壹個指向存儲屬性值的單元的指針。對於繼承的屬性,它們的域直接存儲它們的屬性值。繼承屬性的域在第壹次進入堆棧時是空的,但在堆棧符號成為頂部符號之前的某個時刻,它們必須接受相應的屬性值,即繼承屬性的域在成為頂部符號時必須有值。
5詳細的算法描述
5.1語法
/*
語法語法
s-& gt;WEDG
g-& gt;c=R
r-& gt;dTe|d
t->;+|-| * |/| % E-& gt;空軍基地
f-& gt;& gt| = = | & lt
*/
5.2檢查錯誤
根據遞歸下降法求wa
s()
void S()
{
printf(" % d \ tS-& gt;WEDG\n”,合計);total++;
w();
e();
}
w()
void W()
{
如果(ch!='W ')
{
Printf("有非法字符%c,請回車返回!!",ch);
getchar();
getchar();
退出(1);
}
}
e()
void E()
{
ch = a[++ I 1];
如果(ch!='a ')
{
Printf("有非法字符%c %c,請回車返回!!",ch);
getchar();
getchar();
退出(1);
}
printf(" % d \ tE-& gt;aFb\n”,合計);total++;
f();
}
f()
void F()
{
int I;
ch = a[++ I 1];
I = I 1+1;
如果(a[i]!='b ')
{
Printf("有非法字符%c,請回車返回!!",a[I]);
getchar();
getchar();
退出(1);
}
開關(通道)
{
大小寫“>”:
printf(" % d \ tF-& gt;& gt\n”,合計);total++;
打破;
大小寫“==”:
printf(" % d \ tF-& gt;==\n ",合計);total++;
打破;
默認值:
printf(" % d \ tF-& gt;& lt\n”,合計);total++;
打破;
}
d();
g();
}
d()
空D()
{
++ I 1;
ch = a[++ I 1];
如果(ch!='D ')
{
Printf("有非法字符%c,請回車返回!!",ch);
getchar();
getchar();
退出(1);}
ch = a[++ I 1];
}
g()
void G()
{
int I = I 1+1;
如果(ch!= ' c ' & amp& amp壹個[我]!='=')
{
Printf("有非法字符%c %c,請回車返回!!",ch,a[I]);
getchar();
getchar();
退出(1);
}
printf(" % d \ tG-& gt;c=R\n ",合計);total++;
r();
}
r()
void R()
{
int I;
I = I 1+1;
I 1 = I 1+2;
ch = a[I 1];
如果(a[i]!= ' = ' & amp& ampch!='d ')
{
Printf("有非法字符%c %c,請回車返回!!",a[i],ch);
getchar();
getchar();
退出(1);
}
其他
{
if((a[I 1+1]= = '+')| |(a[I 1+1]= = '-')| |(a[I 1+1]= = ' *)|(a[I 1+1]= = '/'))
{
printf(" % d \ tR-& gt;dTe\n”,總計);total++;
t();
}
其他
{
printf(" % d \ tR-& gt;d\n”,合計);total++;
w();
e();
}
}
}
t()
void T()
{
ch = a[++ I 1];
開關(通道)
{
大小寫“+”:
printf(" % d \ TT-& gt;+\n ",合計);total++;
打破;
大小寫'-':
printf(" % d \ TT-& gt;-\n ",合計);total++;
打破;
大小寫' * ':
printf(" % d \ TT-& gt;*\n ",合計);total++;
打破;
默認值:
printf(" % d \ TT-& gt;/\n ",合計);total++;
打破;
}
ch = ' #
}
6測試方法和測試結果
6.1測試方法
在C++環境中,設計並測試了幾個有代表性的用例,例如,輸入語句wa
6.2測試結果
測試結果如下:
7設計特點、缺點、收獲和經驗
7.1設計的特點
本設計采用遞歸下降法對輸入的while - do循環語句進行語法和語義分析,輸出四元數。因此,程序充分體現了遞歸下降的思想。
7.2設計缺陷、收獲和經驗
本次設計的主要不足是我沒有將程序通用化,無法通過用戶自動輸入代碼實現詞法分析的四進制輸出。這個程序只能實現對WA的分析
這次課程設計鞏固了我關於遞歸下降法的知識,使我對WHILE—DO循環語句有了更深入的理解,提高了我的實踐能力。
8門課程設計參考資料
1張編譯原理(第二版)清華大學出版社
2何《編譯原理》華中科技大學出版社
3陳火旺《程序設計語言編譯原理》(第3版)國防工業出版社。
本科課程設計成績評估表
班級:軟件0701姓名:周學號:0120710680129。
序號計分項目滿分。
1認真學習遵守紀律
2設計合理性分析10
3設計方案的正確性、可行性和創造性20
4設計結果的正確性40
5規範性設計報告10
6設計驗收10
總分/等級
評論:
註:期末成績按五級記錄。優秀(90-100),良好(80-89),壹般(70-79),
及格(60-69分),60分以下視為不及格。
源程序
# include & ltstdio.h & gt
# include & ltdos.h & gt
# include & ltstdlib.h & gt
# include & ltstring.h & gt
char a[50],g[50][50];
char ch
int n1,i1=0,I2 = 0;
int total = 0;
void S();
void D();
void G();
void W();
void E();
void R();
void T();
void F();
void main()
{
int j = 0;
Printf("語法G(s)是:\ n ");
printf(" s-& gt;DGWE \ n ");
printf(" G->;c = R \ n ");
printf(" R-& gt;dTe | d \ n ");
printf(" T->;+|-| * |/\ n ");
printf(" E->;aFb \ n ");
printf(" F-& gt;& gt| = = | & lt\ n ");
Printf("請輸入壹個while-do語句(D代表do,W代表while),以#: \n結尾");
做{
scanf("%c ",& ampch);
a[j]= ch;
j++;
}while(ch!='#');
n 1 = j;
ch = a[0];
s();
printf(" \ n ");
if (ch=='# ')
{printf("輸出四元數為:\ n ");
printf(" 100(& lt;,a,b,102)\ n ");
printf("101 (j,_,_,105)\ n ");
printf("102 (+,a,b,n)\ n ");
printf("103 (=,n,_,a)\ n ");
printf("104 (j,_,_,100)\ n ");
printf(" 105 \ n ");
}
否則{
printf(" error \ n ");
printf("按任意鍵繼續..\ n ");
getchar();getchar();
返回;
}
printf(" \ n ");
printf("按任意鍵繼續..\ n ");
getchar();
getchar();
}
/*誤差分析*/
void S()
{
printf(" % d \ tS-& gt;WEDG\n”,合計);total++;
w();
e();
}
void W()
{
如果(ch!='W ')
{
Printf("有非法字符%c,請回車返回!!",ch);
getchar();
getchar();
退出(1);
}
}
void E()
{
ch = a[++ I 1];
如果(ch!='a ')
{
Printf("有非法字符%c %c,請回車返回!!",ch);
getchar();
getchar();
退出(1);
}
printf(" % d \ tE-& gt;aFb\n”,合計);total++;
f();
}
void F()
{
int I;
ch = a[++ I 1];
I = I 1+1;
如果(a[i]!='b ')
{
Printf("有非法字符%c,請回車返回!!",a[I]);
getchar();
getchar();
退出(1);
}
開關(通道)
{
大小寫“>”:
printf(" % d \ tF-& gt;& gt\n”,合計);total++;
打破;
大小寫“==”:
printf(" % d \ tF-& gt;==\n ",合計);total++;
打破;
默認值:
printf(" % d \ tF-& gt;& lt\n”,合計);total++;
打破;
}
d();
g();
}
空D()
{ ++ I 1;
ch = a[++ I 1];
如果(ch!='D ')
{printf("有非法字符%c,請回車返回!!",ch);
getchar();
getchar();
退出(1);}
ch = a[++ I 1];
}
void G()
{ int I = I 1+1;
如果(ch!= ' c ' & amp& amp壹個[我]!='=')
{printf("有非法字符%c %c,請回車!!",ch,a[I]);
getchar();
getchar();
退出(1);}
printf(" % d \ tG-& gt;c=R\n ",合計);total++;
r();
}
void R()
{
int I;
I = I 1+1;
I 1 = I 1+2;
ch = a[I 1];
如果(a[i]!= ' = ' & amp& ampch!='d ')
{
Printf("有非法字符%c %c,請回車返回!!",a[i],ch);
getchar();
getchar();
退出(1);
}
其他
{
if((a[I 1+1]= = '+')| |(a[I 1+1]= = '-')| |(a[I 1+1]= = ' *)|(a[I 1+1]= = '/'))
{
printf(" % d \ tR-& gt;dTe\n”,總計);total++;
t();
}
其他
{
printf(" % d \ tR-& gt;d\n”,合計);total++;
w();
e();
}
}
}
void T()
{
ch = a[++ I 1];
開關(通道)
{
大小寫“+”:
printf(" % d \ TT-& gt;+\n ",合計);total++;
打破;
大小寫'-':
printf(" % d \ TT-& gt;-\n ",合計);total++;
打破;
大小寫' * ':
printf(" % d \ TT-& gt;*\n ",合計);total++;
打破;
默認值:
printf(" % d \ TT-& gt;/\n ",合計);total++;
打破;
}
ch = ' #
}
講師簽名:
日期2010