C 四則運算表達式解析器

下載實例:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1074

程序主要包括:基礎結構定義、詞法分析、語法分析、算術運算

基礎結構定義:枚舉(操作數類型、操作符類型、標記類型、有限狀態自動機);

結構(操作數、操作符、標記、標記鏈)。

詞法分析:將字符串分解成有效標記(有效的操作數和操作符),生成標記鏈表。

語法分析:分析括弧的有效性,操作數、操作符的排列有效性,操作符與操作數類型匹配關係。

算術運算:使用後綴表達式運算規則,根據後綴表達式鏈表進行求值。首先將我們日常應用的中綴表達式轉換為後綴表達式。例如:6*(5-3) 轉換為 6 5 3 - *,6-2+5*2轉換為 6 2 - 5 2 * +

C 四則運算表達式解析器

這裡對後綴表達式的轉換作一個說明,每個操作符有一個運算優先級(oper_PRI),但是當表達式中含有括弧時,括弧中的操作符運算優先級會改變。所以增設了一個括弧深度優先級(deep_PRI)。採用兩個優先級的方式比使用棧顯得簡單易讀。

操作符oper_PRI
+7
-7
*9

在轉換時,操作符擁有兩個優先級,表示為:操作符(deep_PRI,oper_PRI)

依次輸入表達式 5+(8-2*3)*4 的各個標記 最後輸出5 8 2 3 * - 4 * +。

輸入臨時空間

輸入操作符時,放入臨時空

間,同時觸發動作。

操作符(deep_PRI,oper_PRI)

初始 deep_PRI=0

動作

輸入’(’時,deep_PRI++

輸入’)’時,deep_PRI--

輸入操作符時,上一個操作符與其比較

優先級,為true,則輸出上一操作符。

比較規則:

deep_PRI > deep_PRI ||

(deep_PRI == deep_PRI &&

oper_PRI >= oper_PRI)

輸出

操作數直接

輸出

5 5
++(0,7)
(+(0,7)deep_PRI++
8+(0,7)8
-+(0,7)

-(1,7)

+(0,7)與 -(1,7)比較

0>1||(0==1&&7>=7) 為false 不輸出

2+(0,7)

-(1,7)

2
*+(0,7)

-(1,7)

*(1,9)

-(1,7)與 *(1,9)比較

1>1||(1==1&&7>=9) 為false 不輸出

3+(0,7)

-(1,7)

*(1,9)

3
)+(0,7)

-(1,7)

*(1,9)

deep_PRI--
*+(0,7)

-(1,7)

*(1,9)

*(0,9)

*(1,9)與 *(0,9)比較

1>0||(1==0&&9>=9) 為true 輸出*(1,9)

*
+(0,7)

-(1,7)

*(0,9)

-(1,7)與 *(0,9)比較

1>0||(1==0&&7>=9)為true 輸出-(1,7)

-
+(0,7)

*(0,9)

+(0,7)與 *(0,9)比較

0>0||(0==0&&7>=9) 為false 不輸出

4+(0,7)

*(0,9)

4
+(0,7)

*(0,9)

沒有操作符:倒序輸出臨時空間值*
+(0,7)+


分享到:


相關文章: