C 四則運算表示式解析器

2021-08-19 13:43:51 字數 1676 閱讀 1038

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

基礎結構定義:列舉(運算元型別、操作符型別、標記型別、有限狀態自動機);

結構(運算元、操作符、標記、標記鏈)。

詞法分析:將字串分解成有效標記(有效的運算元和操作符),生成標記鍊錶。

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

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

這裡對字尾表示式的轉換作乙個說明,每個操作符有乙個運算優先順序(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)

+

C 四則運算表示式解析器分析

最近看了一些關於表示式求值的文章,四則運算表示式求值,在網路上各種語言 的版本都能找到。了解其基本原理,方便在一些應用系統中的應用擴充套件。下面是在自 己理解的基礎上,用c 語言,以比較簡單直觀的方法實現四則運算表示式求值程式。程式主要包括 基礎結構定義 詞法分析 語法分析 算術運算 基礎結構定義 ...

四則運算表示式求值

03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...

四則運算表示式求值

表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...