語法分析 算術表示式遞迴下降分析程式設計

2021-05-18 08:32:11 字數 1858 閱讀 7442

1、實驗目的:

(1)掌握自上而下語法分析的要求與特點。

(2)掌握遞迴下降語法分析的基本原理和方法。

(3)掌握相應資料結構的設計方法。

2、實驗內容:

程式設計實現給定算術表示式的遞迴下降分析器。

算術表示式文法如下:

e-->e+t|t

t-->t*f|f

f-->(e)|i

3、設計說明:

首先改寫文法為ll(1)文法;然後為每乙個非終結符,構造相應的遞迴過程,過程的名字表示規則左部的非終結符;過程體按規則右部符號串的順序編寫。

4、設計分析

這個題目屬於比較典型的遞迴下降語法分析。需要先將原算術表示式方法改寫為ll(1)文法為:

e-->te'

e'-->+te'|ε

t-->ft'

t'-->*ft'|ε

f-->(e)|i

然後再為每個非終結符設計乙個對應的函式,通過各函式之間的遞迴呼叫從而實現遞迴下降語法分析的功能。

具體方法為:

(1)當遇到終結符a時,則編寫語句

if(當前讀到的輸入符號==a)讀入下乙個輸入符號

(2)當遇到非終結符a時,則編寫語句呼叫a()。

(3)當遇到a-->ε規則時,則編寫語句

if(當前讀到的輸入符號不屬於follow(a))error()

(4)當某個非終結符的規則有多個候選式時,按ll(1)文法的條件能唯一地選擇乙個候選式進行推導.

//源程式**

#include

#include

using namespace std;

void e();

void e1();

void t();

void t1();

void f();

string s;

int i;

int err;

int switchnum;

int main()

while(cin>>switchnum);

return 0;

}

void e()

}

void e1()

else if(s[i]!='#'&&s[i]!=')')

}

}

void t()

}

void t1()

else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+')

}

}

void f()

}

else if(s[i]=='i')

++i;

else

}

}

測試用例

(1)輸入i,預期顯示success

(2)輸入iii,預期顯示fail

(3)輸入a,預期顯示fail

(4)輸入(i),預期顯示success

(5)輸入(a),預期顯示fail

(6)輸入(i+i),預期顯示success

(7)輸入(i+i,預期顯示fail

(8)輸入((i*i)+i)*i,預期顯示success

(9)輸入((((i+i*i)))),預期顯示success

(10)輸入(i+ia,預期顯示fail

(11)輸入i+i*i+i*a,預期顯示fail

語法分析 算術表示式遞迴下降分析程式設計

1 實驗目的 1 掌握自上而下語法分析的要求與特點。2 掌握遞迴下降語法分析的基本原理和方法。3 掌握相應資料結構的設計方法。2 實驗內容 程式設計實現給定算術表示式的遞迴下降分析器。算術表示式文法如下 e e t t t t f f f e i 3 設計說明 首先改寫文法為ll 1 文法 然後為每...

語法分析 算術表示式遞迴下降分析程式設計

1 實驗目的 1 掌握自上而下語法分析的要求與特點。2 掌握遞迴下降語法分析的基本原理和方法。3 掌握相應資料結構的設計方法。2 實驗內容 程式設計實現給定算術表示式的遞迴下降分析器。算術表示式文法如下 e e t t t t f f f e i 3 設計說明 首先改寫文法為ll 1 文法 然後為每...

語法分析 算術表示式 C 實現

我用的是遞迴下降法,當我得到這個 分析表後,我為每個非終結符設計乙個函式,在內部通過判斷讀入的非終結符判斷該用哪乙個產生式進行替換,而主程式中就是最左推導,通過呼叫最左邊的非終結符的遞迴子程式,讓整個過程鏈式執行下去,最後能得到輸入的算術表示式,則識別成功 include include defin...