**是從清華那本編譯教材後邊實驗部分改的
二、實驗內容
「簡單的演算法表示式文法」
〈算術表示式〉∷=〈項〉│〈算術表示式〉+〈項〉│〈算術表示式〉-〈項〉
〈項〉∷=〈因式〉│〈項〉*〈因式〉│〈項〉/〈因式〉
〈因式〉∷=〈變數〉│(〈算術表示式〉)
〈變數〉∷=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
說明:為了簡化變數,即簡化詞法分析程式,此文法中變數的定義就是乙個字母。
根據「簡單的演算法表示式文法」在starter files基礎上編寫乙個遞迴向下的語法分析程式。
輸入:字串或者文字檔案
輸出:「合法表示式」或者「非法表示式」
例如:輸入a+b*c-b/d則顯示或者輸出「合法表示式」,輸入aa++–c*則顯示或者輸出「非法表示式」
三、實驗分析與設計
s: 算術表示式
b: 項
c: 因式
d: 變數
消除左遞迴後的文法:
s->bi
i->+bi|-bi|ξ
b->cj
j->*bi|/bi|ξ
c->d|(s)
d->a|…|z
first(s)=
first(i)=
first(b)=
first(j)=
first(c)=
first(d)=
follow(s)=
follow(b)=
follow(i)=
follow(j)=
follow(c)=
follow(d)=
#include
#include
#include
#include
/* 符號 */
enum symbol //列舉型別
;#define al 10 //識別符號的最大長度
enum symbol sym; //當前的符號
char ch; //獲取當前字元,getch 使用
char a[al+1]; //當前識別符號ident
file* fin; //用於指向輸入檔案的指標
void getsym(); //讀單詞,將單詞類別放入sym中
void s();
void i();
void b();
void j();
void c();
void d();
int main()
getsym(); //讀第乙個單詞,將單詞類別放入sym中
s(); //開始按e->ta 分析
if (sym==end)
else
fclose(fin); //關閉檔案
printf("繼續分析則輸入檔名,否則回車");
//scanf("%s",filename);
gets(filename);
}while (strlen(filename)>0); //判斷檔名字串是否大於0
}/*詞法分析,獲取乙個符號*/
void getsym()
return;
}//遞迴下降分析 分析產生式e-> ta
void s()
else
}void d()
}//新增
void i()
else
if(sym==rparen || sym==end)//右括號或者檔案結束
else
else
}}void b()
void j()
else
if(sym==plus || sym==sub || sym==rparen || sym==end)//+——)或者結束
else
else
}}void c()
else
}else
}
五、執行的結果
懶得貼的還要截圖 反正可以正經執行
遞迴下降語法分析實驗
通過設計 開發乙個高階語言的遞迴下降語法分析程式,實現 對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,加 深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。1 理解語法分析在編譯程式中的作用,以及它與詞法分析程式的 關係 2 掌握遞迴下降語法分析方法的主要原理 3 理解遞迴下降分析法對...
Pascal 語法分析器 簡易實現
目錄前言 一 實現內容 二 實現準備 1.詞法分析器 2.自上而下的語法分析 理論 三 節選 四 測試截圖 此文僅筆者學習記錄,並不是多麼高深的東西,而且離完成也過了一段時間 不小心給忘了,汗 不過非常歡迎各種指導建議 pascal語言子集 pl 0 詞法分析器的設計與實現 pl 0語言的bnf描述...
實驗二 遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...