表示式解析運算器(二) 演算法實現

2022-05-10 03:26:20 字數 2137 閱讀 4404

先看看支援的表示的示例"1"

"1 + 2

"" + 2

""1 + 2 *3

""(1 + 2) * 3

""round[145.26 , 0]

""round[145.26 , 1 + ]

""1 + 2 * ((3 -2) * 6 - 1) + round[ (-24.344) , 4 / 2 ^ 2] 

"由於要實現的表示式的靈活性要求比較高,要求一步到位直接分析出表示式的結構有難度,這裡我採用了三步分析拆解的方法。

第一步,先拆解括號和特殊運算子

把複雜的式子,先拆解成多個簡單的式子。

主式子: 

"( + 3.0 ) * ( 23 * ( 8 + round[ , 2]) - 1)

"第一次分解後變成:

主式子: 

"『0』 * ( 23 * ( 8 + round[ , 2]) - 1)

"式子『0』:"

+ 3.0 

"第二次分解後變成:

主式子: 

"『0』 * ( 23 * ( 8 + 『1』) - 1)

"式子『0』:"

+ 3.0 

"式子『1

』:round[ , 2]

第三次分解後變成:

主式子: 

"『0』 * ( 23 * 『2』- 1)

"式子『0』:"

+ 3.0 

"式子『1

』:round[ , 2]

式子『2

』:8 + 『1』

第四次分解後變成:

主式子: 

"『0』 * 『3』

"式子『0』:"

+ 3.0 

"式子『1

』:round[ , 2]

式子『2

』:8 + 『1』

式子『3

』:23 * 『2』- 1

經過4次分解之後,複雜的表示式轉換為簡單的表示式,括號也消失了,剩下只是一般的二元表示式(主式子,式子0 2 3)和特殊表示式(式子1)

第二步,式子成員分析

把式子的成員分解為parameter(引數)和operator(運運算元),還有subexprssion子表示式,其中引數包括variable(變數)和quantitative(定值)

那麼上面的式子就變成:

主式子: s1 o1 s4

(s1)式子『

0』:v1 o2 q1

(s2)式子『

1』:o3 v2 q2

(s3)式子『

2』:q3 o4 s2

(s4)式子『

3』:q4 o5 s3 o6 q5

s -- subexpression   o -- operator   q -- quantitative  v -- variable

第三步,轉換為operationunit(運算單元)進行運算

無論是子表示式subexprssion,變數variable,還是定值quantitative,最終結果都是乙個value,那麼以上式子都可以簡化為operator(運運算元,簡稱o)和value(值,簡稱v)的關係。

①對於一般的二元表示式,基本結構就是v o v o v o v ..........

都是兩個v中間包含乙個o,而最基本的單元v o v經歷運算之後的結果也是乙個v,那麼運算的情況就可以簡化為兩種情況:

1 v1 o1 v2

直接運算出結果

2 v1 o1 v2 o2 v3

比較o1和o2的運算優先順序,當o1的優先順序高於或等於o2的時候,運算v1 o1 v2,低於的時候則繼續取o2和o3(如果有的話)比較運算優先順序

當經歷一次運算之後,重新排列v o v o v o v.......,再運算一次,知道最後的結果是乙個v,然後把v作為結果輸出。

②對應特殊特殊表示式,基本機構就是o v1 v2 v3 v4。。。。。

那麼直接呼叫對應的operationunit,運算就可以了。

現在還沒解決的問題就是,這套運算邏輯,沒有解決一元運算子,一元運算子在分析拆解上有一定難度。而很特殊的三元運算子顧及到應用的環境不是很多,就沒有歸入考慮之列

相關文章:表示式解析運算器(一)

解析表示式 C 實現

1.中綴 字首 字尾表示式 對於乙個人可識別的表示式 1 2 3 4 5 根據操作符的位置不同分為 中綴表示式 1 2 3 4 5 字首表示式 1 2 3 4 5 字尾表示式 1 2 3 4 5 字首表示式和字尾表示式裡面已經包含了計算順序,因此不需要括號來確定優先順序 2.中綴轉字首 2.1 中綴...

用陣列順序棧實現表示式運算 中綴表示式

只有關鍵的運算部分有 只要例項化,棧是根據教科書上的寫的,如果要用stl可以修改下就可以用,這個是中序表示式的運算,由於按照老師要求,可能寫的有點繁瑣.include include seqstack.h 教科書上的順序陣列棧,改為相應的stl棧函式就可以直接例項化呼叫class calculato...

中綴表示式轉字尾表示式演算法及實現

1 23 include 4 using namespace std 56 template class mystack 7 20 2122 template void mystack init 23 26 27 template bool mystack empty 28 31 32 templa...