語法分析實驗部分簡易版

2021-08-06 02:26:47 字數 2159 閱讀 3153

**是從清華那本編譯教材後邊實驗部分改的

二、實驗內容

「簡單的演算法表示式文法」

〈算術表示式〉∷=〈項〉│〈算術表示式〉+〈項〉│〈算術表示式〉-〈項〉

〈項〉∷=〈因式〉│〈項〉*〈因式〉│〈項〉/〈因式〉

〈因式〉∷=〈變數〉│(〈算術表示式〉)

〈變數〉∷=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集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...