先看看支援的表示的示例"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...