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...