編譯原理 實驗2 遞迴下降語法分析程式設計

2021-10-06 21:10:34 字數 3499 閱讀 4756

【實驗要求】

(1)待分析的簡單語言的詞法同實驗1

(2)待分析的簡單語言的語法

用擴充的bnf表示如下:

1)《程式》::=begin《語句串》end

2) 《語句串》::=《語句》

3) 《語句》::=《賦值語句》

4) 《賦值語句》::=id:=《表示式》

5) 《表示式》::=《項》

6) 《項》::=《因子》

7) 《因子》::=id|num|(《表示式》)

(3)語法分析程式的功能

輸入單詞串以」#」結束,如果是文法正確的句子,輸出成功資訊;否則輸出錯誤資訊。

例如:輸入   begin a:=9; x:=2 * 3; b:=a + x end #

輸出   success

輸入   x:=a + b * c end #

輸出   error

這個實驗二與實驗一是有一定聯絡的,實驗一請**:

實驗一 詞法分析器實驗:

#include #include using namespace std;

char prog[800]; //儲存程式

char token[10]; //儲存單詞字串

char ch; //當前字元

int syn; //單詞種別碼

int sum; //整型常數

int p; //prog指標

int m; //token指標

int n;

int kk; //錯誤標記

//關鍵字

const char * rwtab[6] = ;

bool isletter(char ch); //判斷是否為字母

bool isdigit(char ch); //判斷是否為數字

void scanner(); //掃瞄分析器

void irparser(); //語法分析器

void yucu(); //語句串分析函式

void statement(); //語句分析函式

void expression(); //表示式分析函式

void term();

void factor();

bool isletter(char ch)

else

}bool isdigit(char ch)

else }

void scanner()

m = 0;

//獲取下乙個有效字元

ch = prog[p];

while(ch == ' ')

if(isdigit(ch))

} //字元為字串

else if(isletter(ch))

token[m] = '\0';

m++;

syn = 10;

for(n = 0; n < 6; n++)

} }else

else if (ch == '=')

break;

case '>':

syn = 23;

m = 0;

token[m++] = ch;

p++;

ch = prog[p];

if (ch == '=')

break;

case ':':

syn = 17;

m = 0;

token[m] = ch;

m++;

p++;

ch = prog[p];

if (ch == '=')

break;

case '+':

syn = 13;

token[0] = ch;

p++;

ch = prog[p];

break;

case '-':

syn = 14;

token[0] = ch;

p++;

ch = prog[p];

break;

case '*':

syn = 15;

token[0] = ch;

p++;

ch = prog[p];

break;

case '/':

syn = 16;

token[0] = ch;

p++;

ch = prog[p];

break;

case '=':

syn = 25;

token[0] = ch;

p++;

ch = prog[p];

break;

case ';':

syn = 26;

token[0] = ch;

p++;

ch = prog[p];

break;

case '(':

syn = 27;

token[0] = ch;

p++;

ch = prog[p];

break;

case ')':

syn = 28;

token[0] = ch;

p++;

ch = prog[p];

break;

case '#':

syn = 0;

token[0] = ch;

break;

default:

syn = -1;

break;

}} }

void irparser()

} else

} }else

}void yucu()

}void statement()

else

} else

}void expression()

}void term()

} void factor()

else if (syn == 27)

else

}} int main(int argc, char** ar**) while(str != '#');

p = 0;

ch = prog[p];

scanner();

irparser();

//開始分析

// do{

// scanner();

// switch(syn){

// case 11:

// cout << "(" << syn << "," << sum << ")" << endl;

// break;

// case -1:

// cout << "error" << endl;

// break;

// default:

// cout << "("<< syn << "," << token << ")" 《是的,終於寫完啦,好開心!!!

編譯原理實驗三 語法分析(遞迴下降法)

實驗任務 完成以下描述算術表示式的ll 1 文法的遞迴下降分析程式 g e e te e ate t ft t mft f e i a m 說明 終結符號i為使用者定義的簡單變數,即識別符號的定義。設計要求 1 輸入串應是詞法分析的輸出二元式序列,即某算術表示式 實驗專案一 的輸出結果。輸出為輸入串...

遞迴下降語法分析實驗

通過設計 開發乙個高階語言的遞迴下降語法分析程式,實現 對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,加 深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。1 理解語法分析在編譯程式中的作用,以及它與詞法分析程式的 關係 2 掌握遞迴下降語法分析方法的主要原理 3 理解遞迴下降分析法對...

實驗2 遞迴下降語法分析程式設計

開發語言及實現平台或實驗環境 c clion 實驗目的 1 理解語法分析在編譯程式中的作用,以及它與詞法分析程式的關係 2 加深對遞迴下降語法分析原理的理解 3 掌握遞迴下降語法分析的實現方法 實驗內容 編制乙個遞迴下降分析程式,實現對詞法分析程式提供的單詞序列的語法檢查和結構分析。實驗要求 1 待...