表達式解析運算器(二)-- 算法實現

先看看支援的表示的示例
"1"
"1 + 2"
"{0} + 2"
"1 + 2 *3"
"(1 + 2) * 3"
"Round[145.26 , 0]"
"Round[145.26 , 1 + {0}]"
"1 + 2 * ((3 -2) * 6 - 1) + Round[ (-24.344) , 4 / 2 ^ 2] "

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

第一步,先拆解括號和特殊運算符
把復雜的式子,先拆解成多個簡單的式子。
主式子: "( {0} + 3.0 ) * ( 23 * ( 8 + Round[{1} , 2]) - 1)"
第一次分解后變成:
主式子: "『0』 * ( 23 * ( 8 + Round[{1} , 2]) - 1)"
式子『
0』:" {0} + 3.0 "
第二次分解后變成:
主式子: "『0』 * ( 23 * ( 8 + 『1』) - 1)"
式子『
0』:" {0} + 3.0 "
式子『1』:Round[{1} , 2]
第三次分解后變成:
主式子: "『0』 * ( 23 * 『2』- 1)"
式子『
0』:" {0} + 3.0 "
式子『1』:Round[{1} , 2]
式子『2』:8 + 『1』
第四次分解后變成:
主式子: "『0』 * 『3』"
式子『
0』:" {0} + 3.0 "
式子『1』:Round[{1} , 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,運算就可以了。



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

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


posted on 2008-05-27 12:18  月の树  阅读(1916)  评论(6编辑  收藏  举报