email:[email protected]
blog:
顯然如下的方法生成的語言是算術表示式
e->tg
g->+tg | -tg|e
t->fs
s->*fs | /fs | e
f->(e) | number
注:e表示空
所以我們可以根據這個式子寫出相應的演算法來對乙個表示式求值。其演算法如下:
輸入:輸入的是1位正整數的算術運算,如(3+4)*((4-5)/2),注意,這裡為了簡單,所有的資料都是一位的正整數,並且不能有階乘和冪運算。
#include using namespace std;
char expr[10000];
int start;
double e();
double t();
double g();
double s();
double f();
int main(){
cin>>expr;
cout<
上面的程式正確的原因是因為他是ll(1)型方法,根據ll(1)型方法的判定,我們只需要向右檢視乙個字元就可以給出它的推導,故而上面的演算法是正確的。
中綴表示式求值的方法 棧
對於像是1 2的中綴表示式,我們可以輕鬆地運用 來算出結果。但是對於1 2 2 3 4這樣的表示式,事情就變得有些複雜了.對於上述的表示式,我們可以運用棧的相關知識來解決 建立兩個棧,棧1放數字,棧2放運算子 遇到數字時入棧1 遇到運算子時,若棧2為空,則pop出棧1中的兩個數運算,將運算完的結果壓...
編譯原理 語法分析之LL 1 方法
這是另乙個關於follow集和first集的求解文章,兩個結合著看效果更佳 前段時間為了做編譯器,猛啃了一下編譯原理。語法分析部分用的是比較簡單上手的ll 1 自認為ll 1 的理論部分理解得不錯,在這裡寫出來跟大家share一下。關於什麼是ll 1 就不贅述了,書上也說得很清楚,就是從左向右掃瞄輸...
中綴表示式與字尾表示式之間的互轉及求值
中綴表示式轉字尾表示式 遇到 依次彈出棧頂元素並輸出,直至遇到 後,左括號出棧 掃瞄結束後若棧中不為空依次彈出 例 2 9 6 3 5 4 從左到右開始掃瞄 掃瞄到2,輸出 此時輸出串為 2 運算子棧為 null 掃瞄到 入棧 此時輸出串為 2 運算子棧為 掃瞄到 入棧 此時輸出串為 2 運算子棧為...